QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

VB.NetからExcelファイルを読込む

はじまして。

VB.NetからExcelオブジェクトを使ってExcelファイルを読込む
処理をしています。

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
xlBook = CType(xlApp.Workbooks.Open("D:\TEST.xls", ReadOnly:=True), Excel.Workbook)
xlSheet = CType(xlBook.Worksheets("TESTA"), Excel.Worksheet)

読込んだデータを変数にセット

xlBook.Close()

xlApp = Nothing
xlBook = Nothing
xlSheet = Nothing
GC.Collect()

デバッグでは正常に動きますが、直接プログラムを起動させた時に
下記エラーメッセージを表示します。
*******************************************************
EXCEL.EXE 〜アプリケーションエラー〜

"0x650f44b9"の命令が"0x650f44b9"のメモリを参照しました。
メモリが"read"になることはできませんでした。
*******************************************************

どうやらxlBook.Close()の直前で発生するようです。
それと、読込むExcelデータの件数でもエラー/正常がわかれます。
370件はエラー
360件はOK

このような現象は初めてです。
どなたか知っていらっしゃる方がいたら
教えていただけないでしょうか?

質問者:Monkey

回答

その前に、GC に頼った解放をしているところを見ると、
「読込んだデータを変数にセット」部分に色々問題がありそうだな、
などと予想してしまいます。
CreateObject などを使う必要もないですし。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

よく分からずにGC.Collect() を使っています。
どこかのサンプルにあったので。

Excelオブジェクトを使うのにCreateObjectは必要ないんですか?

投稿者:Monkey

編集 履歴 (0)

こんにちは、じゃんぬ です。

よく分からずにGC.Collect() を使っています。

どこかのサンプルにあったので。

Excelオブジェクトを使うのにCreateObjectは必要ないんですか?

ここなんかは、かなり良い見本になると思います。

 .NETからExcelの基本的な操作方法

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

教えていただいた処理のように書き直したらあっさり解決してしまいました。
悩んでいたのが嘘のようです。

VB.Netの実践の本にはCreat.Objectを使ってExcelを開くよう書いてあったので
そのまま使っていました。

きちんと開放しなければいけないんですね。

COM オブジェクト?ガベージ コレクション?プロセス?
いまいちピントこない状態なのでこれからもっと勉強します。
ありがとうございます。

投稿者:Monkey

編集 履歴 (0)

教えていただいた処理のように書き直したらあっさり解決してしまいました。
悩んでいたのが嘘のようです。

VB.Netの実践の本にはCreat.Objectを使ってExcelを開くよう書いてあったので
そのまま使っていました。

きちんと開放しなければいけないんですね。

COM オブジェクト?ガベージ コレクション?プロセス?
いまいちピントこない状態なのでこれからもっと勉強します。
ありがとうございます。

投稿者:Monkey

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。