こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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()

投稿日時 - 2013-12-17 10:12:10

QNo.8389670

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

こちらでは再現しないのではっきりとしたことは言えませんが、
xlSheet2がNothingになっているか、
xlSheet2.Cells(I_COUNT2, 1)がNothingになっているかのどちらかです。

なぜそうなってしまっているかはわかりませんが、
他のファイルで試しても同様ですか?

投稿日時 - 2013-12-17 14:32:56

ANo.1

ご提示のコードで試しましたが、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

投稿日時 - 2013-12-17 10:45:13

補足

Picosoft様、ご回答ありがとうございます。

記述ミスの件、申し訳ありません。

ただ、エラーに関しては、ofd2の初期化も正しくされていますが、どうしても
以下の場所で発生してしまいます。

2回目の

 R_番号 = xlSheet2.Cells(I_COUNT2, 1).Value

です。

I_COUNT2に関しては、記述を削っているうちに宣言まで削除してしまいましたが、
I_COUNT2=1 として捉えて頂ければ幸いです。

何が原因でしょうか、、、、

投稿日時 - 2013-12-17 11:29:52

あなたにオススメの質問