- PR -

EXCEL起動時の悩み

1
投稿者投稿内容
ジェミニ
常連さん
会議室デビュー日: 2003/08/26
投稿数: 33
投稿日時: 2003-08-29 10:52
いつも参考にさせて頂いてます。
今回私の悩みはEXCEL起動時の事なのですが・・・

VB.NETよりEXCELを起動しEXCEL側でマクロ実行しているのですが
最初EXCELを終了してもプロセスが残ってしまってアプリケーションを
終了するまで次のEXCELが開けなかったのですが、こちらのスレッドを
参考にしてこの問題は解決できました。
ところがこれにより違う問題が発生し悩んでおります。

EXCELをVB.NETより実行する時、EXCEL側に作ってあるTEXTBOXにデータを
渡して表示しています。
ところが、VB.NET側にGC.COLLECT(2)をつけた所、TEXTBOXの中身が
表示されなくなってしまいました。
プロパティを見るとTEXTにはちゃんと値が入っていて後のマクロ実行には
何も問題ないのですが、画面には表示されていません。
ちなみにマウスでその場所をクリックすると表示されます。
VB.NET側でGC.COLLECT(2)をはずすと表示されます。でもプロセスが終了
しないし・・・
どうしてこうなるのかサッパリで・・・

どなたか回避する方法ご存知であれば教えて頂きたいのですが。
よろしくお願いいたします。

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet

xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
xlApp.ScreenUpdating = True

' EXCELの起動 AND WorkBookのOPEN
xlBook = xlApp.Workbooks.Open(FILENAME)

' EXCELシートのTEXTBOXにデータをセット
xlBook.Worksheets("Sheet1").TextBox1.Text = TESTNO

xlSheet = Nothing
xlBook = Nothing
xlApp = Nothing

' ガベージコレクションの開放
GC.Collect(2)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-29 11:41
たぶん、誤解させた張本人です。うぅ

まず、アプリケーションは終了してください。
xlApp.Quit()

次に、エクセルはCOMオブジェクトとして起動しているので、COMオブジェクトを解放します。
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)

もし、シートやワークブックを参照していたら、それらも同じように解放します。順番は関係ないと思いますが、アプリケーションより前に解放してください。


これで、GC.Collect()しなくても、期待通りになると思います。
ジェミニ
常連さん
会議室デビュー日: 2003/08/26
投稿数: 33
投稿日時: 2003-08-29 12:51
Jittaさんありがとうございました。
さっそくやってみたのですが・・・

またまたプロセスが終了しなくなってしまいました。
なぜなんでしょうね?

それと書き方が悪かったのですが、システム上EXCELは
起動したままにしておかないとダメなんです。
したがってQUITがつかえません。
EXCELの終了はEXCEL側で手動で行いたいのです。

結局の所現在は元の状態に戻っています。
何かが間違っているんでしょうね。もう少し調べてためしてみます。

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet

xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
xlApp.ScreenUpdating = True

' EXCELの起動 AND WorkBookのOPEN
xlBook = xlApp.Workbooks.Open(FILENAME)

' EXCELシートのTEXTBOXにデータをセット
xlBook.Worksheets("Sheet1").TextBox1.Text = TESTNO

xlApp.Quit()

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-29 13:27
Nothingはいるかな?でも、スコープはずれるんだから・・・?

 ところで、起動したままにしておかなければならないということですが、では、プロセスが消えたのはどこで確認しました?エクセルが起動しているのにプロセスが消えたら、それは問題だと思うのです。反対に、元のプログラムが終了すれば、プロセスも終了すると思うのですが?

 あと、エクセルを起動したままというなら、CreateObjectではなく、GetObjectで起動中のインスタンスが捕まえられなかったときにCreateObjectするようにしましょう。
ジェミニ
常連さん
会議室デビュー日: 2003/08/26
投稿数: 33
投稿日時: 2003-08-29 13:47
Jittaさんありがとうございます。

申し訳ありません、書き方がまたまたまずかったですね。

VB.NETのアプリからEXCELを起動します。この時VB.NETのアプリは
起動したままです。
起動されたEXCELのTEXTBOXにはVB.NETより渡された値が入っています。
この値とEXCELのマクロを使って新規のEXCELシートを作成します。
シート完成後、手動でEXCELを終了しVB.NETのアプリに戻ります。

このタイミングでタスクマネージャのプロセスを見るとEXCEL.EXEが
残ってしまっています。
VB.NETのアプリを終了するとこのプロセスは消えるのですが
VB.NETのアプリが起動中にEXCELを独自に起動しよとしても
枠が表示されるだけで先へ進まなくなります。
(ここでVB.NETアプリを終了すれば動き出します)

この辺りが問題になっていて悩んでいたわけなんです。

単純にGC.COLLECT()をいれると終了にかんしてはOKなのですが
EXCELのTEXTBOXの中身が表示されなくなってしまい・・・
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-29 14:35
とりあえず、これで終了することを確認しました。
エクセルシートに配置したオブジェクトまでは確認していません。

Dim xlApp As Excel.Application = Nothing
Dim xlBook As Excel.Workbook = Nothing

Try
xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
xlApp.Visible = True
xlApp.ScreenUpdating = True
xlBook = xlApp.Workbooks.Open(FileName)
CType(xlBook.Sheets.Item("Sheet1"), Excel.Worksheet).Range("A1").Value = "ABC"

Finally
If Not xlBook Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
xlBook = Nothing
End If
If Not xlApp Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = Nothing
End If
GC.Collect()
End Try
ジェミニ
常連さん
会議室デビュー日: 2003/08/26
投稿数: 33
投稿日時: 2003-08-29 15:19
Jittaさんありがとうございました。

結局EXCEL側のTEXTBOXをあきらめて、セルに書き込む様にし
Jittaさんのご指導通りに変更してうまくいきました。

やはり見栄えより、EXCELのプロセスが終了出来ない方が
致命的だという認識に替えた所すんなりといけました。

本当にありがとうございました。

何分まだまだシロートに毛がはえた程度の若輩者で色々ご迷惑を
おかけいたしました。
これからどんどん勉強してこちらでも色々レス出来る様にがんばります。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-29 15:31
引用:

ジェミニさんの書き込み (2003-08-29 15:19) より:

結局EXCEL側のTEXTBOXをあきらめて、セルに書き込む様にし
Jittaさんのご指導通りに変更してうまくいきました。


 あきらめるのは早いですよ。セルに書き込めばうまくいって、TextBoxではダメ、ということは、TextBox(か、その途中)への参照がどこかに残っている、ということですよね。ならば、明示的に受けてやって、明示的に解放してやればいいのではないでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)