• ベストアンサー

VisualBaic2005でExcelファイルを読む方法

Dim oExl As Excel.Application Dim WorkBookName As Excel.Workbook Dim Open_WorkSheet_Name As Excel.Worksheet oExl = CreateObject("Excel.Application") WorkBookName = oExl.Workbooks.Open("d:\book011.xls", , False) この時点でExcelのファイルが開きません。 また、oExl.Visible = True を実行するとExcel自体は開くのですが、ファイルのオープンは できません。また、終了時に oExl.Workbooks.Close() oExl = Nothingを実行すると Excel自体は閉じるのですが、プロセスは残りまます。 VB2005からExcelファイルを読む方法とクローズ処理の方法を 教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

プロセスが残る件については Excel の各オブジェクトをきちんと変数に参照していないからだと思います。 VB.NET や C# から Excel をコントロールしていて Excel のプロセスが残ってしまう現象については大体どこのサイトのサンプルにも書いてあるかと思います。 コード中に出てくる全ての Excel 関連オブジェクトは必ず変数で参照をし、必ず開放してあげなくてはいけません。 http://www.google.com/search?num=50&hl=ja&q=vb.net+excel&lr=lang_ja 上記コードで言えば WorkBookName = oExl.Workbooks.Open("d:\book011.xls", , False) これの「Workbooks」がダメ。 Dim oBooks As Excel.Workbooks oBooks = oExl.Workbooks WorkBookName = oBooks.Open("d:\book011.xls", , False) のように、Excel.Workbook のコレクションである Workbooks もきちんと変数で参照しないとダメです。 他にうっかり忘れやすいところでは Worksheets、Cells など、コレクションですかね。 まぁ実装するのがかなり面倒になると思いますので、プロセスの終了は GC に任せちゃうってのもありかと思いますが。 いつかは終了しますんで。

ringocyan
質問者

お礼

どうもありがとうございました。助かりました。

その他の回答 (1)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

こんにちは、 >Excel自体は閉じるのですが、プロセスは残りまます。 VBのバージョンが違いますが以下のurlが、参考になると思います。 http://homepage1.nifty.com/rucio/main/technique/teq_15.htm

ringocyan
質問者

お礼

どうもありがとうございました。助かりました。

関連するQ&A

  • VBで既存エクセルシートを新規ブックにコピー

    VB6,Excel2003です。 既存のエクセルシートを新規ブックにコピーする プログラムを作成してみましたが タスクバーに新規ブックのタスクバーボタンが2つできてしまいます。 どこが原因か教えてください。よろしくお願いします。 Private Sub Command1_Click() Dim xlsApp As Excel.Application Dim xlsBookTemp As Excel.Workbook 'コピー元ブック Dim xlsBookCopy As Excel.Workbook 'コピー先ブック Dim xlsSheetTemp As Excel.Worksheet 'コピー元シート Dim xlsSheetCopy As Excel.Worksheet 'コピー先シート Set xlsApp = CreateObject("Excel.Application") Set xlsBookTemp = xlsApp.Workbooks.Open("C:\Temp.xls") Set xlsSheetTemp = xlsBookTemp.Sheets(1) Set xlsBookCopy = xlsApp.Workbooks.Add Set xlsSheetCopy = xlsBookCopy.Sheets(1) xlsApp.Visible = True 'コピー元のSheet1を新規ブックにコピーする xlsSheetTemp.Copy Before:=xlsSheetCopy 'コピー元のブックは閉じる xlsBookTemp.Close '///新規ブックの編集処理/// Set xlsSheetTemp = Nothing Set xlsBookTemp = Nothing Set xlsSheetCopy = Nothing Set xlsBookCopy = Nothing Set xlsApp = Nothing End Sub

  • Excelのシートをコピー

    環境は,Visual Studio 2005 Standard Editionです. プログラムを実行後,以下の例外が発生しました. 「HRESULT からの例外: 0x800A03EC」 発生場所は★の位置です. ここから------- Dim xlApp As Microsoft.Office.Interop.Excel.Application = Nothing Dim xlBook As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook = xlApp.Workbooks.Open("ファイルのパスが入ります") xlSheet = xlBook.Worksheets("シート名が入ります") Dim xlBook2 As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet2 As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook2 = xlApp.Workbooks.Open("ファイルパスが入ります") xlSheet2 = xlBook.Worksheets("シート名が入ります") 'Excelを表示しない xlApp.Visible = False xlSheet.Copy(Before:=xlSheet2) ★ ここまで-------------- やろうとしているのは,xlSheet2のシートを含むExcelファイルに,xlSheet2の前にxlSheetをコピーする処理です. ★のところで上の例外が発生してしまいます. 以上,よろしくお願いします.

  • Excelが終了しません

    VB初心者です。 以下のコード(実際のものと根幹は同じです)でExcelを扱いたいのですが、 終了の処理をしている(つもり)にも関わらず、EXEを終了するまで Excelが終了してくれません。 画面上は終了しているのですが、EXE起動中にxlsファイルを開くとシートを表示してくれないのです。 どなたか正しい方法を教えてください。 Dim xlbook As Excel.Workbook Dim xlsheet As Sheets Dim H As Integer Dim W As Integer H = ImNumber1.Text W = ImNumber2.Text Set xlbook = CreateObject("Excel.sheet") Set xlsheet = xlbook.Worksheets Workbooks.Open App.Path & "\稼動確認.xls" Worksheets("稼働確認書").Activate xlbook.Application.Visible = True xlsheet.Application.Cells(H, W).Value = ImText1.Text ActiveWorkbook.Save Workbooks.Close xlbook.Application.Quit Set xlbook = Nothing Set xlsheet = Nothing

  • 開いているXLSファイルが読み取り専用か調べる

    Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("C:\test.xls") Set xlSheet = xlBook.Worksheets(1) 開いたExcelファイルが読み取り専用になっているかどうかを調べるにはどうすればいいですか? ファイルの属性が読み取り専用かどうかは取得できるのですが、属性は読み取り専用ではなくても誰か他のユーザーがネットワークから開いているために読み取り専用で開いている場合もわかるようにしたいです。 お願いします。

  • vb.netからエクセルファイルを開きたいのですが

    vb.netからエクセルファイルを開きたいのですが、 オフィス2010をインストールしてから動作しなくなりました。 ------------------------------------------------------------------------ Imports Microsoft.Office.Interop Sub ExcelOpen() Dim ExcApp As Excel.Application Dim book As Excel.Workbook Dim MyPath As String MyPath = "C:\Excel.xlsm" ExcApp = CreateObject("Excel.Application") ExcApp.Visible = True book = ExcApp.Workbooks.Open(MyPath) ExcApp = Nothing End Sub ------------------------------------------------------------------------ これで2007の時は起動してたのですが、2010だとダメです。 Microsoft Excel 14.0 Object Libraryに参照設定しています。 実行すると、 ExcApp.Visible = True の部分で サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT)) となります。 どうすればいいでしょうか?ご教授よろしくお願いします。

  • エクセルファイルが既に開いてるのなら開かない

    エクセルファイルが既に開いてるのなら開かない としたいです Sub test() Dim app As Excel.Application Dim book As Excel.Workbook app = CreateObject("Excel.Application") If app.ReadOnly Then MsgBox("既に開いています") End If End Sub このようにやろうと思ったけど、 これじゃファイル名をしてしてないから無意味ですよね しかも上記のコードを実行したら --------------------------------------------------------- 型 'System.MissingMemberException' のハンドルされていない例外が Microsoft.VisualBasic.dll で発生しました 追加情報: 公開メンバー 'ReadOnly' は型 'ApplicationClass' に見つかりませんでした。 --------------------------------------------------------- というエラーが発生しました。 Sub test() Dim app As Excel.Application Dim book As Excel.Workbook app = CreateObject("Excel.Application") app.Visible = True book = app.Workbooks.Open("C:\Users\test.xlsm") End Sub このようにして、エクセルファイルを開くコードは分かるのですが、 このコードに、「既に開いているのなら開かない」という処理を付け加えたいです。 よろしくお願いします。

  • ExcelVBA 標準モジュール内関数の呼出し

    VB6.0からExcelの標準モジュール内のパラメータ付関数を呼出すにはどうしたらよろしいでしょうか? Dim app As Excel.Application Dim wb As Workbook Set app = CreateObject("excel.application") Set wb = app.Workbooks.Open("TestXl.xls") Set app = Nothing 以上のように記述し指定のエクセルファイルをオープンすることはできたのですが ここからどうやって標準モジュールを参照し、その中の関数を実行するかがわかりません。

  • 環境はVB2008です。開いているエクセルファイルの認識!

    環境はVB2008です。開いているエクセルファイルの認識! すいません。詳しいかた宜しくお願い致します。 【現象】 ファイルが既に開いている場合、読み取り専用で開いてしまうと保存できないため、 開いているファイルの検索をかけようと試みたが、 新しいエクセルを起動した中のWorkBook内を検索してしまうのか 開いているワークブックを検知してくれない。 Dim xlApp As New Excel.Application Dim xlwb As Excel.Workbook Dim xlws As Excel.Worksheet Dim URL3 As String URL3 = "C:\MailDB.xls" Dim allwb As Excel.workbook For Each allwb In xlApp.Workbooks If allwb.Path = URL3 Then MsgBox(URL3 & "のファイルを閉じてください。", MsgBoxStyle.Exclamation, "警告") Exit Sub End If Next xlwb = xlApp.workbooks.open(URL3) xlws = xlwb.worksheets(1) With xlws .Cells(1, 3) = "テスト" End With xlwb.Save() xlwb.close() xlApp.quit()

  • 「エクセルファイルが開いていたら開かない」としたい

    「エクセルファイルが開いていたら開かない」としたいです。 VB2010です。 -------------------------------------------------------------- Imports Microsoft.Office.Interop '参照設定済み Module Module1 Sub ExcelOpen() Dim ExcApp As Excel.Application Dim book As Excel.Workbook Dim MyPath As String MyPath = "C:" ExcApp = CreateObject("Excel.Application") ExcApp.Visible = True book = ExcApp.Workbooks.Open(MyPath & "\test.xlsm") End Sub End Module -------------------------------------------------------------- で、ファイルを開くのですが、既にファイルが開いている場合は、2個開いてしまい、 最後に開いたファイルが読み取り専用になってしまいます。 IFで、開いているかどうかを取得して、 開いているのなら「既に開いています」として、ExitSubがしたいです。 ご協力よろしくお願いします。

  • SETを使ったほうがよい?

    accwessからエクセルファイルを開きたいのですが、 App.Workbooks.Open と、 Set xlBook = xlApp.Workbooks.Open とどちらを使った方がいいのでしょうか? ////////////////////////////////////////////////////////// Private Sub ファイル1_Click() Dim App As Object Dim MyFileName As String MyFileName = "D:\My Documents\test.xls" Set App = CreateObject("Excel.Application") App.Workbooks.Open FileName:=MyFileName App.Visible = True End Sub でも Private Sub ファイル2_Click() Dim xlApp As Object Dim xlBook As Object Dim FileName As String Const FolderName = "D:\My Documents\test.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FolderName & FileName) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub ////////////////////////////////////////////////////////// でも開けました。 多分、SETを使うかどうかの違いだと思うのですが VBAでコードを作る際、どちらのコードを使った方がいいか教えてください。