• 締切済み

VB6でEXCELをクローズ出来ない

VB6でEXCELを使用した後クローズ処理をしたつもりですが、VBと別にEXCELを起動しVBで使ったEXCELを読み込もうとすると、「編集のためロックされています」とメッセージが出て、読み取り専用でしかオープン出来ません。また、VBでEXCELを繰り返しオープンするとメモリがいっぱいになってしまいます。 VBでのEXCELオープンは Dim fnm As String Dim exl As Object fnm = "EXCEL File名" 'フルパスで指定 Set exl = CreateObject("Excel.Application") exl.Application.Workbooks.Open FileName:=fnm クローズは Set exl = CreateObject("Excel.Application") exl.Application.Quit Set Sheet = Nothing Set BooK = Nothing Set ExcelApp = Nothing 以上です。なお、VBの参考書は入門書だけ持っていますが、このようなことは書いてありません。従って上のコードも意味もわからず、ネットから拾ってきたまま使用しています。参考書または、Webサイトを紹介して頂ければ有り難いです。

みんなの回答

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.3

No.2です。 うーん、当方の環境では先の例文でexcelは終了されるのですが どこかバージョン違いがあるのかもしれません。 別の手として、全てのexcelのプロセスを削除する方法を添付しておきます。 notepad.exeをexcel.exeに変更すれば実現できます。

参考URL:
http://okwave.jp/qa/q2542032.html
sansaiji
質問者

補足

ありがとうございます。 エクセルのクローズ処理をを下記一行で行いました。結果は 'コンパイルエラー SubまたはFunctionが定義されていません とエラーになりました。 この処理はEXCEL.EXEをクローズするための処理のような気がしますが、XXXX.XSL ファイルのみクローズするだけではだめなんでしょうか。 当面はプロシージャ内でオープン、クローズ処理するやり方にします。

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.2

No.1です。 --- Private Sub Command1_Click() のなかで、クローズ処理を Private Sub Command2_Click() のなかでのように別プロシージャで行うと ”実行時エラー'91': オブジェクト変数またはWithブロックの変数が設定されていません。” とエラーメッセージが出てしまいます。 これを解決する方法があれば教えてください。 --- 可能性として考えられるのは Set exl = CreateObject("Excel.Application") を実行する前に、 exl.Application.Quit を実行するとこのようなエラーが発生します。 (たとえば、サンプルを実行した直後にCommand2_Clickをクリックする)。 これだとexlオブジェクトが定義されていないことになるので 実行時エラーが発生します。 これを回避するためには、exlオブジェクトが定義されているかどうか確認します。 If exl Is Nothing Then Exit Sub End If こうすることで、定義されていない場合はプロシージャから抜けます。 --- 「つまり、オープンのときに使用したexlオブジェクトとクローズのときに使用したexlオブジェクトが存在しています。」が理解できないくらいの初心者です。よろしく御願いします。 --- 理解しようとすると難しいので、概念として理解してください。 オブジェクトを定義したときにインスタンスが新しく作成されます。 インスタンスとは「分身」のこと。つまりexcelの分身が自動的に作られます。 さらに、別のタイミングでオブジェクトを定義すると またインスタンスが作成され、別の分身が作られます。 この2つの分身はexcelの分身である、という共通点はありますが 分身同士は別物として扱われます。 excelがクッキーの生地とすると、2つのインスタンスは 生地から抜き取ったクッキーそのもの、といったところでしょうか。 このあたりの考え方は「クラス」につながっていきます。

sansaiji
質問者

補足

ありがとうございます。 Private Sub Command1_Click()  エクセルファイルのオープン処理 End Sub Private Sub Command2_Click()  If exl Is Nothing の時”エクセルファイルのクローズ処理”をパス  ”エクセルファイルのクローズ処理” End Sub の順に処理をしますとエラーは発生しません。 ただ、オープンしたエクセルファイルは、VBを終了した後、上のパスを通った数だけ残ってしまうようです。 Private Sub Command1_Click()  If exl Is Nothing の時”エクセルファイルのオープン処理”を実行  ”エクセルファイルのオープン処理” End Sub Private Sub Command2_Click()  If exl Is Nothing の時”エクセルファイルのクローズ処理”をパス  ”エクセルファイルのクローズ処理” End Sub でもおなじです。 Private Sub Command1_Click()  エクセルファイル・オープン済 の時”エクセルファイルのオープン処理”をパス  ”エクセルファイルのオープン処理” End Sub Private Sub Command2_Click()  If exl Is Nothing の時”エクセルファイルのクローズ処理”をパス  ”エクセルファイルのクローズ処理” End Sub のように処理をすると、残るエクセルファイルは1つだけになるようです。 以上より exl Is Nothing では”オープンしたエクセルファイルがない”ことはチェックできていないようです。

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

まず Set ExcelApp = Nothing ではなく Set exl = Nothing ですね。 つぎに exl オブジェクトのインスタンスが2つ作成されています。 タスクマネージャを見ればわかると思いますが Set exl = CreateObject("Excel.Application") を実行するたびに「Excel.exe」がプロセスに追加されます。 つまり、オープンのときに使用したexlオブジェクトと クローズのときに使用したexlオブジェクトが存在しています。 これを防ぐために、インスタンスの作成は一回でする必要があると思います。 ソフトの使用方法がわからないので何ともいえませんが 仮に、フォーム上に「開く」「閉じる」といった使い方をしているならば exlオブジェクトをメンバ変数で宣言すると この問題を解決できます。 ちなみに「プロジェクト」→「参照設定」で「Microsoft Excel xx.x(バージョン) Object Library」 にはチェックを入れてありますか。 入れてあるとexl.と入力したときに入力候補が表示されて便利です。 以下に参考を示します。 Private exl As Excel.Application Private Sub Command1_Click() Dim fnm As String fnm = "c:\blank.xls" 'フルパスで指定 Set exl = CreateObject("Excel.Application") exl.Application.Workbooks.Open FileName:=fnm End Sub Private Sub Command2_Click() exl.Application.Quit Set Sheet = Nothing Set BooK = Nothing Set exl = Nothing End Sub

sansaiji
質問者

お礼

ありがとうございました。 EXCELのオープン、クローズを同一プロシージャの中で行えば正常に出来るようになりました。 しかし、オープン処理を Private Sub Command1_Click() のなかで、クローズ処理を Private Sub Command2_Click() のなかでのように別プロシージャで行うと ”実行時エラー'91': オブジェクト変数またはWithブロックの変数が設定されていません。” とエラーメッセージが出てしまいます。 これを解決する方法があれば教えてください。 参考:「Microsoft Excel xx.x(バージョン) Object Library」にチェックは入っています。   :Private exl As Excel.Applicationはこのフォームの先頭で定義しました。   :EXCELはデータを参照するだけなので非表示です。   :「つまり、オープンのときに使用したexlオブジェクトとクローズのときに使用したexlオブジェクトが存在しています。」が理解できないくらいの初心者です。よろしく御願いします。

関連するQ&A