• 締切済み

VB.NetでExcelシート削除

独学で、VB2010にてAccess、Excel連携のプログラムを組んでいます。 ある集計結果をExcelに代入してそのシートのみだけにして(その他集計シートがあります。) 別名ファイルでデスクトップへ保存するようにしたいです。 For Each~Nextで指定のシート名以外を削除するというコードを書いたつもりなのですが、うまく動作しません。 ご教授お願いします。 (Excelはcom参照していません。) Private Sub Button出力_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button出力.Click '===============Excel入力=============== Dim xlApplication Dim xlBooks Dim xlSheets xlApplication = CreateObject("Excel.Application") ' Excelのインスタンス作成 'ファイル名(フルパス) Dim xlFilename As String = 集計ExPath xlApplication.Visible = False ' Excelの表示 xlBooks = xlApplication.Workbooks.Open(xlFilename) xlBooks = xlApplication.Workbooks(Dir(xlFilename)) 'Workbook xlSheets = xlBooks.Worksheets("AAA") 'Worksheet その他Excel処理 xlApplication.DisplayAlerts = False Dim DelSheet As Object For Each DelSheet In xlBooks.Worksheets If DelSheet.Name <> "AAA" Then DelSheet.Delete() End If Next xlBooks.saveas(System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\新ファイル名.xlsx") xlBooks.Close xlApplication.DisplayAlerts = True xlApplication.Quit() ' Excel を終了する xlSheets = Nothing xlBooks = Nothing xlApplication = Nothing MsgBox("出力処理終了しました。") Me.Close() End Sub

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.1

For Each ~Nextの中で、コレクションの内容が 変化するような処理を入れているせいです。 For Each はコレクションからオブジェクトを 一つずつ取り出してループします。シートを 削除すればシートのコレクションも変化して しまうので、For Each の結果が正しくなくても 不思議ではありません。 ループの度に条件を調べるか、予め削除対象の シート名リストを作ってから処理する方法に 改めます。 【ループの度に条件を調べる例】 Do Until xlBooks.Worksheets.Count = 1   If xlBooks.Worksheets(1).Name = "AAA" Then     xlBooks.Worksheets(2).Delete   Else     xlBooks.Worksheets(1).Delete   End If Loop オブジェクトとかコレクションと言った時に、 イメージがピンと沸かないようでしたら、 For Each は使わない方が賢明です。

すると、全ての回答が全文表示されます。

関連するQ&A