C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: VB.NETでExcelブックを開けない


(過去ログ 106 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■63112 / inTopicNo.1)  VB.NETでExcelブックを開けない
  
□投稿者/ あひる (1回)-(2012/07/19(Thu) 07:21:16)

分類:[.NET 全般] 

こんにちわ。

VB.NETにて、Excelブックを開こうとしたのですが、
開いた後にすぐに勝手にクローズしてしまいます。

昨日から、ずっと悩んでいるのですが、原因がわかりません。

Winフォームに、ボタンを張り付けて、以下のコードを実行してみてください。

考え方は間違えていないと思うのですが、★の箇所にて、ブックを開いて、
wb変数に格納しようとすると、開いたブックが閉じてしまいます。

うーん。。。

何かお気づきの点がありましたら、コメントいただけないでしょうか?

----------------------------------------------------------------------------------------

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim excelApl As Object = CreateObject("Excel.Application")
Dim wbs As Object = excelApl.workbooks
Dim wb As Object = wbs.open("C:\book.xlsx") ' ★ここで開いた直後にすぐに閉じられる。
wb.close()
ReleaseObj(wb)
ReleaseObj(wbs)
excelApl.quit()
ReleaseObj(excelApl)

End Sub

Public Sub ReleaseObj(ByRef objCom As Object)
Try
If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
Marshal.IsComObject(objCom) Then
Dim I As Integer
Do
I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
Loop Until I <= 0
End If
Catch
Finally
objCom = Nothing
End Try
End Sub

End Class
----------------------------------------------------------------------------------------

引用返信 編集キー/
■63113 / inTopicNo.2)  Re[1]: VB.NETでExcelブックを開けない
□投稿者/ じゃんぬねっと (1回)-(2012/07/19(Thu) 09:07:15)
No63112 (あひる さん) に返信
> こんにちわ。
>
> VB.NETにて、Excelブックを開こうとしたのですが、
> 開いた後にすぐに勝手にクローズしてしまいます。
>
> 昨日から、ずっと悩んでいるのですが、原因がわかりません。
>
> Winフォームに、ボタンを張り付けて、以下のコードを実行してみてください。
>
> 考え方は間違えていないと思うのですが、★の箇所にて、ブックを開いて、
> wb変数に格納しようとすると、開いたブックが閉じてしまいます。

閉じているのではなく、非表示になっているだけなのでは。
Visible プロパティ。
引用返信 編集キー/
■63116 / inTopicNo.3)  Re[2]: VB.NETでExcelブックを開けない
□投稿者/ あひる (2回)-(2012/07/20(Fri) 04:31:33)
excelApl.visible = True
を入れても、やはりNGです。

信じがたいのですが、VS2008+Office2010の環境では、再現性があると思われます。

VS2010+Office2010では、OKでした。

うーん。。。

信じがたい。。
引用返信 編集キー/
■63117 / inTopicNo.4)  Re[3]: VB.NETでExcelブックを開けない
□投稿者/ shu (1回)-(2012/07/20(Fri) 12:19:58)
No63116 (あひる さん) に返信

開いたという確認と閉じてしまうという確認はどのように行ったのでしょうか?
引用返信 編集キー/
■63119 / inTopicNo.5)  Re[4]: VB.NETでExcelブックを開けない
□投稿者/ PATIO (1回)-(2012/07/20(Fri) 13:22:38)
2012/07/20(Fri) 13:23:11 編集(投稿者)

> 開いたという確認と閉じてしまうという確認はどのように行ったのでしょうか?

私もこれが気になります。
書かれている内容をそのまま実行してしまうと開いた直後に閉じて、
アプリのquitまで行っているので閉じてしまっても不思議はないように感じます。
デバッガでブレイクポイントを設定して確認したという話ならわかる気がするのですが。

引用返信 編集キー/
■63120 / inTopicNo.6)  Re[5]: VB.NETでExcelブックを開けない
□投稿者/ あひる (4回)-(2012/07/21(Sat) 17:10:22)
みなさん。

回答ありがとうございます。

VS2008で、ブレイクポイントを張ってチェックしました。
ブレイクポイントなしで実行すると、問題ないのですが、
ブレイクポイントありで、デバックしながら実行すると、★の箇所でブックが閉じてしまいます。

そして、この現象は、ブレイクなしで、F5で実行すると、問題なく動作します。

VS2010では、問題なかったです。VS2008でブレイクポイントありの場合に、この現象が発生します。
自分の環境では、100%の再現率です。

うーんんんん。。。

VS2008の不具合なのでしょうか。。。

困りました。。


Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim excelApl As Object = CreateObject("Excel.Application")
excelApl.visible = True
Dim wbs As Object = excelApl.workbooks
wbs.open("C:\book.xlsx")
Dim wb As Object = excelApl.activeworkbook ' ★ここで、ブックが閉じてしまう。
wb.close()
ReleaseObj(wb)
ReleaseObj(wbs)
excelApl.quit()
ReleaseObj(excelApl)

End Sub

Public Sub ReleaseObj(ByRef objCom As Object)
Try
If Not objCom Is Nothing AndAlso System.Runtime.InteropServices. _
Marshal.IsComObject(objCom) Then
Dim I As Integer
Do
I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
Loop Until I <= 0
End If
Catch
Finally
objCom = Nothing
End Try
End Sub

End Class

引用返信 編集キー/
■63121 / inTopicNo.7)  Re[6]: VB.NETでExcelブックを開けない
□投稿者/ 魔界の仮面弁士 (4回)-(2012/07/21(Sat) 17:42:49)
2012/07/21(Sat) 19:05:51 編集(投稿者)

No63120 (あひる さん) に返信
> VS2008で、ブレイクポイントを張ってチェックしました。
ブレイクポイント、もとい、ブレークポイントはどの位置に設置していますか?

こちらでは、Sub Button1_Click の行、あるいは★マークの行で止めてみましたが、
当方環境ではステップ実行時に勝手に閉じられてしまうことはありませんでした。
x86 ビルド、AnyCPU ビルド、x64 ビルドの 3 パターンでの検証です。

Windows 7 Enterprise x64 SP1
.NET Framework 3.5 SP1
Visual Studio 2008 Development Edition Version 9.0.30729.4462 QFE
Office 2010 Professinal - Excel 2010 x86 (14.0.6117.5003) SP1 MSO (14.0.6112.5000)

ところで、ステップ実行時に
  wb.close()
の行の上にマウスカーソルを重ねたりはしていないでしょうか?

もしかしたら、その時に式が評価されてしまうことで、レイトバインドでの
Close が呼び出され、ワークブックが閉じられてしまったのかも知れません。

とはいえ、Workbooks.Close 自体は戻り値を返さない Sub メソッドなので、
  Debug.Print ThisWorkbook.Close()
のようなコードを、Excel 2010 VBA 側のイミディエイトで実行しても、
「Function または変数が必要です。」との構文エラーになってしまうのですけれどね。

しかしながら、VBA 側で
  Debug.Print CallByName(ThisWorkbook, "Close", VbMethod)
のように実行してみた場合、何故か True を返すという事態になったので、
レイトバインド時には Function として動作する仕様なのかも知れません。


> ブレイクポイントなしで実行すると、問題ないのですが、
> ブレイクポイントありで、デバックしながら実行すると、★の箇所でブックが閉じてしまいます。
最初の質問のコード(Open メソッドの戻り値を受け取る)方が良いでしょうね。
なお、コードを投稿する場合は、掲示板の投稿モードを「図表モード」にしておいてください。

> wb.close()
これを
 CallByName(wb, "Close", CallType.Method)
にしてみるというのはどうでしょうか。
万一、先の「意図せずに式が評価されてしまう」という仮設が正しかったとしても、
これならば実行されないと思いますので。

同様の理由から、今はデバッグ ウィンドウの類(ローカル、スレッド、ブレークポイント、
ウォッチ、呼び出し履歴)一式を、とりあえず閉じておいた方が良いかもしれません。


それからもう一つ。Sub ReleaseObj のループ内で、
 Do
  I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
  Debug.WriteLine(I)
 Loop Until I <= 0
のようにしてみた場合、ブレークポイントの有無で I の値に変化があるかどうかも
確認しておいてみてください。通常は「0」のみが出力されるはずです。
引用返信 編集キー/
■63124 / inTopicNo.8)  Re[6]: VB.NETでExcelブックを開けない
□投稿者/ shu (2回)-(2012/07/22(Sun) 00:44:15)
No63120 (あひる さん) に返信

> VS2008で、ブレイクポイントを張ってチェックしました。
> ブレイクポイントなしで実行すると、問題ないのですが、
> ブレイクポイントありで、デバックしながら実行すると、★の箇所でブックが閉じてしまいます。
>
> そして、この現象は、ブレイクなしで、F5で実行すると、問題なく動作します。
このブレークしたときにどのようにしてブックのオープン状態を確認しているのでしょうか?

PATIOさんの言うように提示されたコードはすぐに閉じてしまう処理をしているので
何をもってブレークによって閉じてしまうという因果関係を言っているのかが分かりません。
魔界の仮面弁士の仮説にあるようにもしかしたら次のステートメントの評価をしてしまっている可能性もあります。

クローズ処理をする前になんらかの処理をいくつか記述してみてクローズ処理をオープンと離した場所に記述した
状態で試してみてはどうでしょう?
引用返信 編集キー/
■63125 / inTopicNo.9)  Re[7]: VB.NETでExcelブックを開けない
□投稿者/ 魔界の仮面弁士 (5回)-(2012/07/22(Sun) 02:48:58)
No63124 (shu さん) に返信
> このブレークしたときにどのようにしてブックのオープン状態を確認しているのでしょうか?
Visible = True に変更されているので、目視確認では無いでしょうか。

> PATIOさんの言うように提示されたコードはすぐに閉じてしまう処理をしているので
> 何をもってブレークによって閉じてしまうという因果関係を言っているのかが分かりません。
「デバックしながら実行すると」と書かれているので、ステップ実行かな…?

で、もしもブックが閉じられていたのだとしたら、その次の wb.close() の呼び出しあたりで、
「起動されたオブジェクトはクライアントから切断されました」とか「RPC サーバーを利用できません」
などの、何かしらの例外が発生する可能性がありそうですね。


> 魔界の仮面弁士の仮説にあるようにもしかしたら次のステートメントの評価をしてしまっている可能性もあります。
# honorific title was omitted...


> クローズ処理をする前になんらかの処理をいくつか記述してみてクローズ処理をオープンと離した場所に記述した
> 状態で試してみてはどうでしょう?
たとえば、Timer の Tick イベントなどを使って、60ms 後にクローズさせる――とかですかね。
逆にオープン側を追い出すという手もありますけれども。


それと、元のブックに問題があるかもしれないので、
Dim wb1 As Object = wbs.Add()
Dim wb2 As Object = wbs.Open("C:\book.xlsx")
のように、空のブックも用意してみるのはどうでしょうか? >あひるさん
引用返信 編集キー/
■63126 / inTopicNo.10)  Re[8]: VB.NETでExcelブックを開けない
□投稿者/ shu (3回)-(2012/07/22(Sun) 22:32:26)
No63125 (魔界の仮面弁士 さん) に返信

>>魔界の仮面弁士の仮説にあるようにもしかしたら次のステートメントの評価をしてしまっている可能性もあります。
> # honorific title was omitted...

魔界の仮面弁士さん失礼しましたmm
引用返信 編集キー/
■63127 / inTopicNo.11)  Re[8]: VB.NETでExcelブックを開けない
□投稿者/ shu (4回)-(2012/07/22(Sun) 22:41:44)
No63125 (魔界の仮面弁士 さん) に返信
> ■No63124 (shu さん) に返信
>>このブレークしたときにどのようにしてブックのオープン状態を確認しているのでしょうか?
> Visible = True に変更されているので、目視確認では無いでしょうか。
Visible=Trueの話は出てきているのですが、最初の提示コードでは記述されていないので他の確認方法を
とられている可能性があると思いました。

> > クローズ処理をする前になんらかの処理をいくつか記述してみてクローズ処理をオープンと離した場所に記述した
> > 状態で試してみてはどうでしょう?
> たとえば、Timer の Tick イベントなどを使って、60ms 後にクローズさせる――とかですかね。
> 逆にオープン側を追い出すという手もありますけれども。
単純にRangeへの値設定程度の処理をはさんでステップ実行しても追加した処理が実行されれば仮説は間違っているし
追加した処理を実行しようとしたときにブックがオープンされていない事を原因とするエラーが発生すれば仮説が
正しいかと思います。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -