掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数Excelファイルオープンにおける、オブジェクト解放について (ID:146859)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
魔界の仮面弁士さん 分かりやす説明と丁寧なご返信をありがとうございます。 インラインにて、解答させて頂きます。 >> exlCellsでセルのvalueを参照して値の抽出処理を行っているだけで ReleaseComObjectは行っておりません。 >それはどのようなコードですか? > >たとえば、 > data = exlCells(行, 列).Value >などの記述は NG ですが、その点は大丈夫でしょうか。 そうなんですね…。NGがありました。 Valueで設定しているだけでもその変数の解放が必要なんですね。 例でいう、MRComObject(data)を追加しますね。 >>> Quit するなら、ReleaseComObject もセットで行うべきですし、 >>> Quit した後で、2回目以降に exlExcelApp を使い続けるべきではありません。 >> なるほど。これはちょっと試してみたいと思います。 > >Quit は、Excel アプリ本体を終了させるためのメソッドですよね。 >(Form に対する Close メソッドのようなもの) > >ループ終了後に閉じている部分に関しては分かりますが、ループ中で >(ブックでは無く)Excel 本体を毎回終了させているのは、あまり >意味が無い様に思えました。 > >終了させる必要が無いのであれば、Quit すべきでは無いと思いますし、 >終了させる必要があるのなら、Quit 後には新たに Excel.Application を >起動しなおすべきでしょう。 やりたい事は案1の方でした。 確かにおっしゃるとおりQuitは必要ないですね。削除します。 >> 例えば、exlExcelAppをオブジェクト型で定義して、その変数をExcelファイル毎に >> ReleaseComObjectの解放とReleaseComObjectのセット(?)でやっていくということでしょうか? > >ごめんなさい。質問の意味が分かりませんでした。 > >急に「オブジェクト型」という言葉が出てきたので困惑していますが、 >それは As Object で宣言するという意味でしょうか。もしも現状の > Dim exlExcelApp As New Excel.Application() >というコードを > Dim exlExcelApp As Object = New Excel.Application() >にするという意味だとしたら、そのような事はすべきではありません。 > >また、「ReleaseComObjectの解放とReleaseComObjectのセット」という文も >何を意味しているのか分かりませんでした。『(?)』と書かれていますので、 >御自身でも内容を伝え切れていないのだとは想像しますが…。 > ># ReleaseComObjectの解放というのは分かりますが、 ># ReleaseComObjectのセットとは一体? こちらこそ、困惑させてしまい、申し訳ありません。 オブジェクト型は「As Object」の意味でして、以下のように 魔界の仮面弁士がおっしゃる案2のイメージでした。 Dim exlExcelApp As Object [ループ1 開始] exlExcelApp = new Excel.Application() ←こことReleaseComObjectのセットと勘違い exlbook = exlExcelApp.books.open("") [ループ2 開始] [ループ2 終了] exlbook 解放 exlExcelApp 解放 [ループ1 終了] > >で、解放処理についてですが、それぞれをどのタイミングで行うべきかは >事前に考えておいてください。 > >たとえば、今回のコードは複数のファイルを順に読み出しているようですが、 > (案1) Excel をひとつだけ起動し、その中で、ファイルを順次加工していく。 > (案2) ファイルを編集するたびに Excel 自体も再起動する。 >のいずれかで、解放のタイミングは異なってくるかと思います。 > >案1で実装する場合は、このような流れになるでしょう。 >Excel の起動および解放は、ListBox のループよりも外側で行います。 > > Excel本体 起動 > Workbooks 取得 > ≫ループ開始[ファイル名] > Workbook 取得 > Sheets 取得 > ≫ループ開始[Sheet番号] > Sheet 取得 > Range 取得 > (各セルの内容を読み取る) > Range 解放 > Sheet 解放 > ≪ループ終了[Sheet番号] > Sheets 解放 > Workbook.Close > Workbook 解放 > ≪ループ終了[ファイル名] > Workbooks 解放 > Excel本体.Quit > Excel本体 解放 > >案2 の場合は、こんな感じ。 >Excel の起動および解放が、ListBox のループの内側で行われます。 > > ≫ループ開始[ファイル名] > Excel本体 起動 > Workbooks 取得 > Workbook 取得 > Sheets 取得 > ≫ループ開始[Sheet番号] > Sheet 取得 > Range 取得 > (各セルの内容を読み取る) > Range 解放 > Sheet 解放 > ≪ループ終了[Sheet番号] > Sheets 解放 > Workbook.Close > Workbook 解放 > Workbooks 解放 > Excel本体.Quit > Excel本体 解放 > ≪ループ終了[ファイル名] > 案1の方が処理的に軽そうなので、そちらで試してみます。 ありがとうございました。 >>>> Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) >>>どこかで見たコード…。 >> VBレスキュー(花ちゃん)の方で参考にさせて頂きました・・・。 >http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm あたりでしょうか。 >(あちらにも掲示板はありますよね?) ありますが、ここの掲示板の情報を見てた時に質問したくなったので・・・。 かなり場当たりです^^; > >なお、無断転載(≠引用)は禁止されていますのでご注意あれ。 >http://hanatyan.sakura.ne.jp/hazimeni.htm 個人利用なので、いいかなと思っていましたが、断りを入れるようにします。 ありがとうございました。 また、ちゃんと解放まで出来るようになったら、報告しますね。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.