VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2004/08/10(Tue) 12:06
投稿者uchi
URL
タイトルエクセルシートの1行ずつを別ブックにコピー

お世話になります。

エクセルVBAでの開発はありますが、VBでのオブジェクト操作は初めてです。
こちらのサイトのサンプルを参考にして、既存エクセルシートの内容を1行ずつ、
新規ブックのシートにコピーするプログラムを作成しました。
(シートコピーの方が早いですが、ここでは1行ずつのコピーとしています。)

[以下のプログラムをご参照下さい]
(1)実行結果は、DisplayAlert=Falseを入れているのにも関わらず、自動的に作成されたブックの
  保存を確認するメッセージが表示されてしまいます。
  また、作成された「結果.xls」をダブルクリックして開くと、コピー元シートの行数分の
  エクセルファイルが作成されていて、それらも開いてしまいます。
(2)オブジェクト操作が初めてのため、For-Nextの中での文法エラー、
  かつ、処理終了後にエクセルタスクを残さないように、試行錯誤して行き着いたのが
  今のロジックです。
  しかし、結果.xlsにデータがコピーされていないので、ロジックエラーがあるようです。
  さらに処理時間は、エクセルVBAで実行するのに比べて、かなり遅いです。

上記(1)(2)の点について、下記のロジックでの不具合をご指摘ください。
お手数ですが、よろしくお願いします。

-----------------------------------------------------------------------------
Private Sub Command1_Click()
    'xlBook2の内容を1行ずつxlBook1にコピーする練習
    'テスト環境:Win2000(SP4) VB6(SP6) EXCEL2000

    Dim xlApp As Excel.Application
    Dim xlBook1 As Excel.Workbook, xlBook2 As Excel.Workbook
    Dim xlSheet1 As Excel.Worksheet, xlSheet2 As Excel.Worksheet
    
    Dim RowPos As Long    'xlBook2のxlSheet2シートの最大行を保存
    Dim i As Long      'For-Nextのカウンター
    
    Set xlApp = CreateObject("Excel.Application")
    '新規のブック
    Set xlBook1 = xlApp.Workbooks.Add
    Set xlSheet1 = xlBook1.Worksheets(1)
    '既存のブック(ReadOnlyで開く)
    Set xlBook2 = xlApp.Workbooks.Open("C:\データ.xls",,True)
    Set xlSheet2 = xlBook2.Worksheets("sheet1")
    
    xlApp.Visible = False            
    xlApp.Application.ScreenUpdating = False  'xlApp.ScreenUpdating = True?
    
    'xlBook2のsheet1シートの使用されている最大行を取得(A列のセルは必ずセットされている)
    RowPos = xlSheet2.Range("A65536").End(xlUp).Row  
    
    '1行ずつをコピー
    For i = 1 To RowPos
   xlApp.Application.CutCopyMode = False
   xlBook2.Activate
   xlSheet2.Activate
   xlSheet2.Rows(i & ":" & i).Select
   xlApp.Selection.Copy
   xlBook1.Activate
   xlSheet1.Activate
   xlSheet1.Range("A" & i).Select
   xlApp.ActiveSheet.Copy
    Next i
    
    'ファイルの保存と終了
    xlApp.Application.DisplayAlerts = False
    xlSheet1.SaveAs ("C:\結果.XLS")    'xlBook1.SaveAS("...") ?
    xlBook2.Close (False)
    xlApp.Application.DisplayAlerts = True

    xlApp.Application.ScreenUpdating = True   'xlApp.ScreenUpdating = true ?
    xlApp.Application.Quit       'xlApp.Quit ?
    
    Set xlSheet1 = Nothing
    Set xlSheet2 = Nothing
    Set xlBook1 = Nothing
    Set xlBook2 = Nothing
    Set xlApp = Nothing
    
End Sub
-----------------------------------------------------------------------------


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -