- 締切済み
EXCELファイルからの値取得に関して
環境:Visual Basic 2008 教えて下さい。 画面上から2つのEXCELファイルを指定し、1回の処理でその2つの EXCELからそれぞれ値を取得したいと考えています。 その為、以下のような記述をしましたが、2回目の値取得のところで "オブジェクト参照がオブジェクト インスタンスに設定されていません。" というエラーメッセージとなってしまいます。 1つのファイルから取得する事は経験ありましたが、同時に2回は初めてで ある為、記述方法が正しいのか、、、 どのように記述したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。 《記述内容》 'EXCELファイルを開く Dim xlFilePath As String = ofd1.FileName '起動時の処理 Dim xlApp As Object xlApp = CreateObject("Excel.Application") Dim xlBooks As Object = xlApp.Workbooks Dim xlBook As Object = xlBooks.Open(xlFilePath) '現シート数 Dim S_COUNT As Integer = xlBook.Worksheets.Count Dim xlSheets As Object = xlBook.Worksheets Dim xlSheet As Object = CType(xlSheets.Item(1), Object) '現シート数 S_COUNT = xlBook.Worksheets.Count Dim R_名称 As String R_名称 = "" R_名称 = xlSheet.Cells(1, 1).Value 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'Excel のプロセス終了 xlApp.DisplayAlerts = False xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) GC.Collect() 'のEXCELファイルを開く Dim xlFilePath2 As String = ofd2.FileName '起動時の処理 Dim xlApp2 As Object xlApp2 = CreateObject("Excel.Application") Dim xlBooks2 As Object = xlApp2.Workbooks Dim xlBook2 As Object = xlBooks2.Open(xlFilePath2) '現シート数 Dim S_COUNT2 As Integer = xlBook2.Worksheets.Count Dim xlSheets2 As Object = xlBook2.Worksheets Dim xlSheet2 As Object = CType(xlSheets2.Item(1), Object) '現シート数 S_COUNT = xlBook2.Worksheets.Count Dim R_番号 As String R_番号 = "" R_番号 = xlSheet2.Cells(I_COUNT2, 1).Value 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'Excel のプロセス終了 xlApp.DisplayAlerts = False xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) GC.Collect()
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Picosoft
- ベストアンサー率70% (274/391)
こちらでは再現しないのではっきりとしたことは言えませんが、 xlSheet2がNothingになっているか、 xlSheet2.Cells(I_COUNT2, 1)がNothingになっているかのどちらかです。 なぜそうなってしまっているかはわかりませんが、 他のファイルで試しても同様ですか?
- Picosoft
- ベストアンサー率70% (274/391)
ご提示のコードで試しましたが、NullReferenceExceptionは発生しませんでした。 ofd2の初期化がされていないのではないでしょうか? あと、2回目の取得で 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) '←1回目のオブジェクトをまた解放? System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) というように変数名の書き間違いがありますので直しましょう。 これが原因で別のエラーが発生しています。 【以下蛇足】 タスクマネージャーでプロセス一覧を見ながら実行すると分かりますが、 COMオブジェクトの扱いに不備があるため、処理終了後もExcelのプロセスが残ってしまっています。 このあたり(↓)を参照しながら、直してみてはいかがでしょうか? http://www.hanatyan.sakura.ne.jp/dotnet/Excel08.htm
補足
Picosoft様、ご回答ありがとうございます。 記述ミスの件、申し訳ありません。 ただ、エラーに関しては、ofd2の初期化も正しくされていますが、どうしても 以下の場所で発生してしまいます。 2回目の R_番号 = xlSheet2.Cells(I_COUNT2, 1).Value です。 I_COUNT2に関しては、記述を削っているうちに宣言まで削除してしまいましたが、 I_COUNT2=1 として捉えて頂ければ幸いです。 何が原因でしょうか、、、、