- - PR -
EXCEL起動時の悩み
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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) | ||||
|
投稿日時: 2003-08-29 11:41
たぶん、誤解させた張本人です。うぅ
まず、アプリケーションは終了してください。 xlApp.Quit() 次に、エクセルはCOMオブジェクトとして起動しているので、COMオブジェクトを解放します。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) もし、シートやワークブックを参照していたら、それらも同じように解放します。順番は関係ないと思いますが、アプリケーションより前に解放してください。 これで、GC.Collect()しなくても、期待通りになると思います。 | ||||
|
投稿日時: 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) | ||||
|
投稿日時: 2003-08-29 13:27
Nothingはいるかな?でも、スコープはずれるんだから・・・?
ところで、起動したままにしておかなければならないということですが、では、プロセスが消えたのはどこで確認しました?エクセルが起動しているのにプロセスが消えたら、それは問題だと思うのです。反対に、元のプログラムが終了すれば、プロセスも終了すると思うのですが? あと、エクセルを起動したままというなら、CreateObjectではなく、GetObjectで起動中のインスタンスが捕まえられなかったときにCreateObjectするようにしましょう。 | ||||
|
投稿日時: 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の中身が表示されなくなってしまい・・・ | ||||
|
投稿日時: 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-29 15:19
Jittaさんありがとうございました。
結局EXCEL側のTEXTBOXをあきらめて、セルに書き込む様にし Jittaさんのご指導通りに変更してうまくいきました。 やはり見栄えより、EXCELのプロセスが終了出来ない方が 致命的だという認識に替えた所すんなりといけました。 本当にありがとうございました。 何分まだまだシロートに毛がはえた程度の若輩者で色々ご迷惑を おかけいたしました。 これからどんどん勉強してこちらでも色々レス出来る様にがんばります。 | ||||
|
投稿日時: 2003-08-29 15:31
あきらめるのは早いですよ。セルに書き込めばうまくいって、TextBoxではダメ、ということは、TextBox(か、その途中)への参照がどこかに残っている、ということですよね。ならば、明示的に受けてやって、明示的に解放してやればいいのではないでしょうか? |
1