QA@IT

VB2008でExcelを起動するときの問題

6013 PV

@ITの記事「Excelファイルにアクセスするには?[C#、VB] - @IT」についての質問です。
VB2008でExcelをオープンするとき「このブックは、安全でない可能性のある外部ソースへのリンクが1つ以上含まれています」とメッセージが表示されますので、「更新する」ボタンをクリックすると次に「ブックの一部のリンクはすぐに更新できません」とメッセージが表示され、「続行」ボタンをクリックすると以後は正常に動作します。従ってExcelFileの visible = false として起動することが出来ません。デスクトップからExcelを起動したときはこのような現象は発生しません。VBのどこが悪いのか教えてください。下記により起動しています。

Dim app = New Excel.Application
Dim oXls = New Excel.Application() ' Excelオブジェクト
Dim oWBook As Excel.Workbook ' Workbookオブジェクト

oXls = New Excel.Application()
oXls.Visible = True ' 確認のためExcelのウィンドウを表示する

' Excelファイルをオープンする
oWBook = DirectCast((oXls.Workbooks.Open( _
gstrExcelFileName, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing)), _
Excel.Workbook)

’gstrExcelFileName:OpenFileDialogで指定したExcelFile名

回答

まずはExcelファイルをチェックしてみてください。
Excelのバージョンがわかりませんが、

Excel 2003以前なら
[編集]メニューの[リンクの設定]

Excel 2007以降なら
[データ]タブ
[接続]グループにある[リンクの編集]

を選択してリンクが無いかどうか確認してください。

あとは、新規作成してセル1つに何か入力した程度のブックでも起きるのかも確認してみてください。


コードとしては、Applicationをnewする回数が多すぎます。
Newとは新しいオブジェクトをつくるための命令になるので、
以下ではApplicationを3回作る事になります。

特にappは使用していない様なので宣言する必要もなさそうです。

Dim app = New Excel.Application
Dim oXls = New Excel.Application() ' Excelオブジェクト
Dim oWBook As Excel.Workbook ' Workbookオブジェクト

oXls = New Excel.Application()

以下のどちらかに修正しましょう。

修正案 ①

' Dim app = New Excel.Application  ※ いらなけらば行ごと削除してください
Dim oXls As Excel.Application ' Excelオブジェクト  As に変更
Dim oWBook As Excel.Workbook ' Workbookオブジェクト

oXls = New Excel.Application()

修正案 ②

' Dim app = New Excel.Application  ※ いらなけらば行ごと削除してください
Dim oXls = New Excel.Application() ' Excelオブジェクト
Dim oWBook As Excel.Workbook ' Workbookオブジェクト

' oXls = New Excel.Application()  既に newしているのでこの行はいらない

警告の表示を無効化すればひょっとするとメッセージはでなくなるかもしれませんが
(リンクの警告も非表示にできたかは確認していません)、この指定は無視させるだけで解決するわけではないので注意してください。

oXls.Visible = True ' 確認のためExcelのウィンドウを表示する
oXls.DisplayAlerts = False ' 警告を無視する(たとえば上書き確認メッセージが出てほしくない場合などに有効)

' Excelファイルをオープンする
oWBook = DirectCast((oXls.Workbooks.Open( _
gstrExcelFileName, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing, _
Type.Missing)), _
Excel.Workbook)

oXls.DisplayAlerts = True

’gstrExcelFileName:OpenFileDialogで指定したExcelFile名

その他、本題とは違いますが気になった点です。
徐々に覚えていっていくといいでしょう。

  • VB.NETであれば、oXls.Workbooks.OpenのType.Missingを指定している部分は省略可能だと思います。つまり以下でも開けると思います。(VS2008の C# 3.5では無理です)
' Excelファイルをオープンする
oWBook = DirectCast((oXls.Workbooks.Open( _
gstrExcelFileName)), _
Excel.Workbook)
  • DisplayAlertsをTrueにする箇所は本当はTry - Finally を使用した方がいいです。
oXls.Visible = True ' 確認のためExcelのウィンドウを表示する

Try
  oXls.DisplayAlerts = False ' 警告を無視する(たとえば上書き確認メッセージが出てほしくない場合などに有効)

  ' Excelファイルをオープンする
  oWBook = DirectCast((oXls.Workbooks.Open( _
  gstrExcelFileName)), _
  Excel.Workbook)

Finally
  oXls.DisplayAlerts = True
End Try

’gstrExcelFileName:OpenFileDialogで指定したExcelFile名
  • 終了後のメモリ開放が必要な場合が出てきます。

1メソッド内で簡単な処理しかしていない場合は .NETとの連携がうまく合って自動的に開放されますが、凝ってくるとExcelが残ってしまったりします。いずれ必要になるとおもいますので、
ReleaseComObjectFinalReleaseComObjectというキーワードを頭の片隅に置いておくといいでしょう。

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oWBook)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(oXls)
編集 履歴 (0)
  • ' oXls = New Excel.Application() この行をコメントにすることでメッセージが出なくなりました。
    app はExcelを解放するところでしようしいぇいました。
    有り難うございました。
    -
  • コメントに誤りがありましたので修正します。下記が正しい内容です。
    削除したのは
    oXls.Visible = True の行でした。True
    -
  • コメントに誤りがありましたので修正します。下記が正しい内容です。 削除したのは oXls.Visible = True の行でした。
    True を False にしてもメッセージは出なくなりました。何故かについては判りません。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。