@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

WebBrowserでExcel表示に関する質問 (VB.NET)

投稿者投稿内容
前屈の達人
常連さん
会議室デビュー日: 2003/08/26
投稿数: 25
お住まい・勤務地: 大阪
投稿日時: 2003-10-16 19:49
こんにちは。いつもお世話になっております。

WindowsフォームにExcelシートを出力しようとしているのですが、
「Explorer」コントロールで開かれたExcelを閉じる方法がわかりません。
どなたかご教授願えませんでしょうか。

<現在>Windowsフォームに「Explorer」,「Button」コントロールを配置して
    ボタンを押した時に、Excelシートを描画するようにしています。
    ボタンクリックイベントの処理で、
     @Excelアプリを開いてシートの編集を行う
     A上書き保存をして、アプリを閉じる
     BExplorerにナビゲートして、Excelを描画
    を行っています。

<問題>このボタンを2度押した時、ナビゲートされているExcelが閉じていないために、
    上記Aの上書き保存時にエラー(開かれているため上書き保存できない)が起こります。

<要望>ボタンクリックイベント内で、ナビゲートされているExcelを閉じたいのですが、
    どのようにしたらいいのかわからりません。
    どなたかご存知でしたらご教授願います。
    よろしくお願いします。

--------------------------------------------------------------------------------
以上の説明でわかっていただけるか不安なので、もう少し詳しく現状をお伝えします。

<詳細>
T)参照設定に、System.Web と Excelを追加
U)デザインビューで、ツールボックスのWindowsフォームに「Explorer」コントロールを追加
 (ツールボックスのカスタマイズでCOMコンポーネントのMicrosoft Web Browserにチェック)
V)Formに「Explorer」、「Button」コントロールを配置
W)ボタンクリックイベントに下記コードを記述(※<現在>で記述しました@〜Bに対応)
-----------------------------------------------------------------------
Private strFileName As String = "C:\Sample.xls"
Private exl As Excel.Application
Private xBook As Excel.Workbook
@exl = CType(CreateObject("Excel.Application"), Excel.Application)
xBook = CType(exl.Workbooks.Add, Excel.Workbook)
AxBook.SaveAs(Filename:=strFileName)
exl.Workbooks.Close()
BAxWebBrowser1.Navigate(strFileName)
-----------------------------------------------------------------------
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-17 09:08
こんにちは。

 すみません、面倒モードです。

 ざっと見ると、CreateObjectでエクセルオブジェクトを作っていらっしゃいますから、過去ログを….NET Insiderトップに戻って会議室ディレクトリからoffice→excelと進んでください。「エクセルが終了しない」というようなタイトルが2〜3ありますから、一番最近のものを。
前屈の達人
常連さん
会議室デビュー日: 2003/08/26
投稿数: 25
お住まい・勤務地: 大阪
投稿日時: 2003-10-17 10:07
Jittaさん、ありがとうございます。

過去ログを拝見させて頂きました。
Excelのプロセスを開放する方法をはわかったのですが
今回問題としておりますのは
「BrowserにNavigateしているExcelを閉じることができない」
というものでして・・・。

Excelのプロセスを開放する方法と同じととらえてよろしいのでしょうか?

Jittaさんにご教授頂いた過去ログも参考に色々試してみたのですが、
やはりExcelの上書き保存ができないためにエラーがでてしまいます。

<質問>Navigateした後で、Excelを操作することは可能でしょうか。
   (BrowserにNavigateされたExcelを操作することは可能でしょうか)

NavigateされたExcelを操作することができれば、
動的に様々な処理ができるのではないか!と思っております。
また、当初問題としておりました
「BrowserにNavigateされているExcelを閉じる」ことも
実現できるのではないかと思っております。

質問を返すようで、申し訳ありませんが
どうぞよろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-17 10:41
 Navigatorに表示されたまま、ということですか?それは、開いているのと同じなのだから、Navigator上のExcelがファイルを解放した後、ではないでしょうか。

 または、権限の問題かもしれません。クライアントに表示して、編集したということは、ユーザによるファイルをアップロードと同じ扱いを受けると思います。ファイル、もしくはそのファイルがあるディレクトリに、アクセスしているユーザ、もしくはASPNETユーザ、あるいはその他の偽装しているユーザ、IISの匿名ユーザによる書き込み権限はあるでしょうか。


 それから、引数は省略せずに全て書くように、とMSの技術文書には書いてあります。サーバサイドでメッセージボックスが表示されると、誰もOKボタンを押せないので、そういう事態に陥る状況は極力排除する、ということです。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-10-17 10:55 ]
前屈の達人
常連さん
会議室デビュー日: 2003/08/26
投稿数: 25
お住まい・勤務地: 大阪
投稿日時: 2003-10-17 17:03
お返事遅くなりました。

Jittaさんのおっしゃる通り
Navigatorに表示されたままです。

>開いているのと同じなのだから、
>Navigator上のExcelがファイルを解放した後、ではないでしょうか。
実は、そのNavigater上のExcelからファイルを開放する方法がわかりません。

また権限の問題ですが、こちらに関しては権限を有しているものと思われます。

さらに「引数は省略せずに全て書くように」とのご指摘も頂きましてありがとうございます。
こちらに関しましても実装致しましたので問題ないかと思われます。

度々申し訳ありませんが、「Excel開放の件」
ご存知でしたらご教授願えますでしょうか。
よろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-18 07:56
確認しました。とりあえず、動くコード。。。

Dim exapp As Excel.Application = Nothing
Dim exbook As Excel.Workbook = Nothing
Dim exsheet As Excel.Worksheet = Nothing

Try
' exapp = CType(CreateObject("Excel.Application"), Excel.Application)
exapp = CType(GetObject(Class:="Excel.Application"), Excel.Application)
' exbook = exapp.Workbooks.Open(FILENAME)
exbook = exapp.Workbooks(1)
exsheet = exbook.Sheets(1)
exsheet.Range("A1").Value = "CHANGED"
exbook.Save()

Finally
If Not exsheet Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(exsheet)
End If
'If Not exbook Is Nothing Then
' exbook.Close()
' System.Runtime.InteropServices.Marshal.ReleaseComObject(exbook)
'End If
'If Not exapp Is Nothing Then
' exapp.Quit()
' System.Runtime.InteropServices.Marshal.ReleaseComObject(exapp)
'End If
End Try

WebBrowserにNavigateした時点で、EXCELオブジェクトが作られます。そして、ファイルがオープンされます。ここで、対象のファイルをダブルクリックしてみてください。「同じ名前のファイルは開けません」みたいなエラーになると思います。これは、DDEによって、現在起動しているEXCELにファイルを読み込ませようとしているからです。ところが、CreateObjectをすると、新たにEXCELを起動し、そちらに読み込ませます。タスクマネージャで、EXCELが2つあることを確認してください。サーバの共有ディレクトリにあるファイルを複数の端末から開くと、開くときに「読み込み専用?後から通知?」という選択ダイアログが表示されますが、おそらく後から開いた方が、読み込み専用で開かれているのでしょう。

そこで、「新しくEXCELを作ったらこのようになるので、今動いているEXCELを捕まえてやろう」というのが、先のソースです。コメントアウトしてある部分と比較してください。

後、試していないのですが、一時的に別のファイルやURLをNavigateするという方法もあると思いましたが、KB304643によると、Navigateメソッドは非同期ということなので、やめました。
前屈の達人
常連さん
会議室デビュー日: 2003/08/26
投稿数: 25
お住まい・勤務地: 大阪
投稿日時: 2003-10-20 18:34
Jittaさん、お返事が大変遅くなりまして申し訳ございません。
また、わかりやすくご教授頂きましてありがとうございました。

おかげさまで、「BrowserにNavigateされているExcelを捕まえる」ことが
できました。

一歩進んだのは良いのですが、今度は新たな壁にぶつかってしまいました。

< 壁 >GetObjectで捕まえたExcelを閉じることができません。
<内容>BrowserにNavigateしているExcelは、Excelのプロセスを持ちますが、
    ワークブックは開かれていません。
    (exbook は 調べてみると Nothing でした。)
    exapp を close する方法がわかりません。

今回は、一歩進んだとは言え、同様な質問になってしまいますが、
どうかご教授お願致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-21 09:01
引用:

前屈の達人さんの書き込み (2003-10-20 18:34) より:

< 壁 >GetObjectで捕まえたExcelを閉じることができません。
<内容>BrowserにNavigateしているExcelは、Excelのプロセスを持ちますが、
    ワークブックは開かれていません。
    (exbook は 調べてみると Nothing でした。)
    exapp を close する方法がわかりません。


 閉じることができない、のは仕様です。閉じてはいけません。提示しましたコードでも、その部分はコメントアウトしています。あ、sheetをコメントアウトし忘れてる…。セーブしてあることまで確認しましたつもりですが、どうでした?(途中から子供の相手をしながらだったので、ちょっと不安)

 閉じてはいけないのは、Navigateで表示されているからです。無理矢理閉じるとどうなるか、わかりません。表示しているものを別のものに変えれば、EXCELプロセスはきちんと終了すると思います(少なくとも、IEで表示させた場合は終了しており、同じコンポーネントを使用していると思われる)。

 ただ、Marshal.ReleaseComObjectまでコメントアウトして良いかどうかは不安です。この中でどのような処理が行われているのか、わからないので。参照が外れるだけでいいのか、COMとしての参照カウンタをデクリメントしなければならないのか(この操作はReleaseComObjectメソッドが行ってくれていると思う)、おそらく後者だと思うのですが。。。

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