• 締切済み

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/1415)
回答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

  • VB2005でExcelのシートをコピー

    VB2005Expressで開発をしています。 Excelのシートをコピーして同じbookに追加をしたいと思っています。 下記でまずExcelを使用できるようにして  Dim xlApp As New Excel.Application  Dim xlBooks As Excel.Workbooks = xlApp.Workbooks  Dim xlBook As Excel.Workbook = xlBooks.Add '新規のファイルを開く  Dim xlSheets As Excel.Sheets = xlBook.Worksheets  Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)  xlApp.Visible = True 下記で追加できると思うのですが、()内にセットするパラメータが わかりません・・・  xlBook.Worksheets.Copy() どなたかご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。

  • VB2005でのEXCEL制御について

    いつもお世話になってます。 私はVB入門者です。 VBからシートを選択して値を入れることは出来たのですが 範囲選択→格子罫線をひく、といったような操作について 調べたところ、マクロをつくりコピーアンドペーストでスムーズに いくということがわかったので、試したところうまくいきませんでした。 又、質問ナンバー QNo.3575919 に [Visual Basic2005でExcelに罫線を描く]とあり 「CreateObject("Excel.Application")」はソースに入っているか という部分がポイントのようなので、少しいじってはみたのですが うまくかけませんでした。 と、いうよりも理解できませんでした。 下記のコードでは選択範囲を指定する部分まで成功したものです。 アドバイスよろしくお願いします。 Sub excel_app() Dim xlApp As Excel.Application = Nothing Dim xlBooks As Excel.Workbooks = Nothing Dim xlBook As Excel.Workbook = Nothing Dim xlSheets As Excel.Sheets = Nothing Dim xlSheet As Excel.Worksheet = Nothing xlApp = New Excel.Application() xlBooks = xlApp.Workbooks xlBook = xlBooks.Open("C:\hoge.xls") xlSheets = xlBook.Worksheets xlBook.Worksheets(1).Range("A31:Y55").Select() xlBook.Worksheets(1).Range.Borders. ←これ以降がわかりません。

  • VB.NETからEXCELの起動が、うまくいかない

    3回目の同じ質問になってしまうのですがよろしくお願いいたします。 下記のようなソースでEXCELファイルを作成し、その後ファイルを開くという処理をしています。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlRange As Excel.Range Dim xlCells As Excel.Range = xlSheet.Cells xlRange = xlCells(1, 10) xlRange.Value = "--" xlRange = xlCells(1, 5) xlCells.EntireColumn.AutoFit() xlBook.SaveAs(sPath & "\" & sFileName, Excel.XlFileFormat.xlWorkbookNormal) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlCells) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlRange) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheets) xlCells = Nothing xlRange = Nothing xlSheet = Nothing xlSheets = Nothing xlBook.Close() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBooks) xlBook = Nothing xlBooks = Nothing xlApp.Quit() System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp) xlApp = Nothing GC.Collect() System.Diagnostics.Process.Start(sPath & "\" & sFileName) ある特定のPCでのみEXCELのメニューバーとステータスバーのみしか表示されない状態です。 起動部分(Process.Start)をコメントアウトして確認したところ GC.COLLECTでEXCELが終了することなく、アプリの終了時にEXCELが終了する 状態にあります。 これはオブジェクトの開放がうまくいっていないのでしょうか? よろしくお願いいたします。

  • vb.netのnewキーワード

    'Excel.Application の新しいインスタンスを生成するとき Dim xlApplication As New Excel.Application() のようにNewを使いますが ワークブックを作成するときは Dim xlBooks As Excel.Workbooks のようにNewを使わないのはなぜですか?

  • vb2010で既存のエクセルを開くには?

    初心者です。 VB6.0からvb2010への乗り換えをしていますが、以下のコードでxlBooks = xlApplication.Workbooksのところで止まってしまいます。 参考ページをいろいろ見ましたが原因が分かりません。 実行する前のコードに波線はでません。 CreateObjectでやっても結果は同じでworkbookを作るところでエラーとなります。 エラーは「タイプライブラリのロードに失敗」ですが、であればDim xlApplication As New Excel.Application()かCreateObjectで止まるように思いますが、理由がわかりません。 WinXP, Office2003, .Net 4.0. vb2010Expressの組み合わせで全てアップデート済み、参照設定はExcel 11.0 Object Libraryです。 どなたかご教示頂ければ幸甚です。 Imports Excel = Microsoft.Office.Interop.Excel Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim xlApplication As New Excel.Application() Dim xlBooks As Excel.Workbooks xlBooks = xlApplication.Workbooks xlBooks.Open("C:\Hoge.xls") - - System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication) End Sub End Class

  • vb.netでEXCEl出力

    VB.NETを始めて2週間ほどの初心者ですがお願いします。 現在DataGridViewに表示した内容を、ボタン押下によEXCELに表示するという段階で悩んでおります。 現状としては、ボタン押下によりEXCELを開くところまで終了していますが、どうすればDataTableの情報をEXCELに表示できるのかが 色んな質問を見させていただいたのですが分かりません。 お忙しいとは思いますがよろしくお願いします。 現在のEXCELを表示しているソースです Dim oExcel As New Excel.ApplicationClass Dim xlBooks As Excel.Workbooks ' xlApplication から WorkBooks を取得する xlBooks = oExcel.Workbooks ' 新しい Excel ブックを追加する xlBooks.Add() 'Excelを表示する oExcel.Application.Visible = True 環境としまして Microsoft Viosual Basic 2008 Express Edition VB.NET WinXP pro まだ質問する上で何の情報が必要なのかもわかりませんので、必要な情報がありましたら教えてください。

  • VB.net(2005)でエクセルの特定名称のシートを操作したい。

      お世話になります。 WindowsXP + SP3、VB.net(2005)の環境にて開発をしております。 VB.netから既存のエクセルファイル(雛形)を開き、特定の名称のシートを アクティブにしたいのですがどのようにコーディングすれば良いでしょうか? ※色々とネットで情報検索してみましたが特定の名前のシートを操作する  方法をうまく見つけられず質問致しました。 エクセルファイル名:売上情報_2009年.xls シート名     :"200901" ~ "200912" の12シート 以前、VB6で同様のことを行ったときは以下のような記述で実現できました。 Dim xlApp As Object Dim xlsheet As Object xlApp = CreateObject("Excel.Application") xlApp.Workbooks.Open(FileName:="C:\売上情報_2009年.xls") xlsheet = xlApp.Sheets("200908") xlsheet.Activate() 現状、vb.netで以下のコーディングまではできております。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Open("C:\売上情報_200904.xls") Dim xlSheets As Excel.Sheets = xlBook.Worksheets よろしくお願い致します。  

  • (再質問) .NETでエクセル解放に悩んでおります.

     数個前のスレッドで勘違いして,締め切らせていただきました. 申し訳ございません.未解決で同じ質問をさせてください.  コードの流れといたしましては,  エクセル操作  ↓  エクセル解放  ↓  ←下記2行のコードが無ければ,この時点でExcel.exeは消えています.  MsgBox("終了")   ↓  アプリケーションを右上の×マークから終了(下記2行のコードを入れると,Excel.exeがギリギリまで残っております.)       Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim WB As Excel.Workbook Dim xlSheets As Excel.Worksheets Dim xlSheet As Excel.Worksheet Dim Mypath As String = TextBoxパス.Text Dim FName As String FName = Dir(Mypath & "*.xls", vbNormal) Do While FName <> ""   WB = xlBooks.Open(Mypath & FName)   For Each xlSheet In WB.Worksheets   Next  ' ↑の2行がなくなれば無事解放できます   WB.Save() : WB.Close()   MRComObject(WB)   FName = Dir() Loop Me.Activate() MRComObject(xlSheet) : xlSheet = Nothing MRComObject(xlSheets) : xlSheets = Nothing WB = Nothing MRComObject(xlBooks) : xlBooks = Nothing xlApp.Quit() : MRComObject(xlApp) : xlApp = Nothing MsgBox("終了")  先ほどのスレッドでアドバイス・指摘していただいた部分とあわせて 色々試してみましたが,自分では怪しそうな個所を見つけることすらできません... 暗黙宣言やNothing,Quit等ネットで見かけるものは一通り試したつもりなのですが...  もしお詳しい方がいらっしゃれば,些細なことでも結構ですので なんでもアドバイスいただければ非常にうれしいです.  どうぞよろしくお願いいたします.

  • VB.NET Excelの解放

    Excel出力の解放について質問です。 下記URLを参考に作成しましたが、出力をし終えたときにプロセスを見るとExcelの解放がされません。 http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm 助言をもらえないでしょうか? With SaveFileDialog1 .FileName = savefilename If .ShowDialog() = Windows.Forms.DialogResult.OK Then wstrPath = .FileName() If Func_Excelチェック(wstrPath) = False Then Exit Function End If End If End With Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook = xlbooks.Add Dim xlsheets As Excel.Sheets = xlbook.Worksheets Dim xlsheet As Excel.Worksheet = xlsheets.Item(1) Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlsheet.Cells Dim i As Integer = 1 作成データテーブルに接続 xlRange1 = xlCells(1, 1) xlRange1.Value = "工場番号" MRComObject(xlRange1, True) While sqlReader.Read xlRange1 = xlCells(i + 1, 1) xlRange1(xlCells(i + 1, 1)).Select() xlRange1.Value = sqlReader("入力_工場番号") MRComObject(xlRange1, True) i += 1 End While excel.DisplayAlerts = False xlsheet.SaveAs(wstrPath) 'Select Case Val(excel.Version) 'Case 9 'xlbook.SaveAs(Filename:=wstrPath) 'Case 12 'xlbook.SaveAs(Filename:=wstrPath, FileFormat:=56) 'End Select 'MRComObject(xlsheet, True) excel.DisplayAlerts = True MRComObject(xlsheet)'xlSheet の解放 MRComObject(xlsheets)'xlSheets の解放 xlbook.Close()'xlBook を閉じる MRComObject(xlbook)'xlBook の解放 MRComObject(xlbooks)'xlBooks の解放 excel.Quit()'Excelを閉じる MRComObject(excel)'excel を解放 Private Function Func_Excelチェック(ByVal arg As String) As Boolean Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook excel.Visible = False excel.Application.DisplayAlerts = False Try If System.IO.File.Exists(arg) = True Then xlbook = xlbooks.Open(arg) xlbook.SaveAs(arg, FileFormat:=42, CreateBackup:=False) MRComObject(xlbook, True) Return True Else Return True End If Catch ex As Exception MessageBox.Show("") Return False Finally xlbooks.Close() MRComObject(xlbooks, True) excel.Quit() MRComObject(excel, True) End Try End Function

  • VB2005でのEXCEL処理で警告が消えません

    いつもお世話になっております。 私はVB2005入門者です。 EXCELで処理を行っております。 処理事態は完了するのですが 下記のコードの後半部の警告がどうやっても潰せないので 修正方法のアドバイスをお願いします。 Dim xlApp As Excel.Application Dim xlBooks As Excel.Workbooks Dim xlBook As Excel.Workbook Dim xlSheets As Excel.Sheets Dim xlSheet As Excel.Worksheet ' 必要な変数は Try の外で宣言する Try ' 必要な変数は Try の中でインスタンス化する xlApp = New Excel.Application() xlBooks = xlApp.Workbooks xlBook = xlBooks.Open("C\:hoge0.xls") xlSheets = xlBook.Worksheets xlBook.Worksheets(1).Range("F4") = shhoge(0) xlBook.Worksheets(1).Range("I4") = shhoge(0) xlBook.Worksheets(1).Range("K4") = shhoge(5) xlBook.Worksheets(1).Range("M5") = shhoge(0) xlBook.Worksheets(1).Range("O4") = shhoge(1) xlBook.Worksheets(1).Range("R4") = shhoge(1) xlBook.Worksheets(1).Range("U5") = shhoge(1) xlBook.Worksheets(1).Range("T5") = shhoge(2) xlBook.Worksheets(1).Range("W5") = shhoge(3) xlBook.Worksheets(1).Range("X5") = shhoge(4) ' シートのカウントが 1 より大きければシートを削除する If xlSheets.Count > 1 Then ' Display アラートを消す xlApp.DisplayAlerts = False ' シートを削除する xlSheet = DirectCast(xlSheets(2), Excel.Worksheet) xlSheet.Delete() End If ' 1000 ミリ秒 (1秒) 待機する System.Threading.Thread.Sleep(1000) ' Excel ブックを保存する xlApp.DisplayAlerts = False xlBook.SaveAs("C:\hoge.xls") ' Microsoft Excel を終了する xlApp.Quit() Finally ' 参照したオブジェクトをすべて解放する If Not xlSheet Is Nothing Then   ←[警告]値が割り当てられる前に使用されています。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) End If If Not xlSheets Is Nothing Then   ←[警告]値が割り当てられる前に使用されています。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) End If If Not xlBook Is Nothing Then   ←[警告]値が割り当てられる前に使用されています。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) End If If Not xlBooks Is Nothing Then   ←[警告]値が割り当てられる前に使用されています。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) End If If Not xlApp Is Nothing Then   ←[警告]値が割り当てられる前に使用されています。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) End If End Try Form2.Show() End Sub