tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルGlobalオブジェクトのエラーについて
記事No11281
投稿日: 2014/06/18(Wed) 10:26
投稿者yuki
いつも参考にさせて頂いております。
自分では原因が不明な問題が発生し、何かアドバイスを頂けないかと思い投稿させて頂きました。

今までVB6.0を使用して開発していましたが、現在使用している中で問題が発生してきた為
VS2008を使ってプログラムのコンバートを行っています。

今回VBからExcelを起動する際にエラーが発生し、Excelが起動しない状況になりました。
表示されるエラーメッセージは、下記の通りです。

実行時エラー '1004'
'WorkSheets'メソッドは失敗しました;'_Global'オブジェクト

ただ開発環境ではこのエラー発生せず、使用環境でのみ発生します。

○開発環境

・Windows7 64bit
・Visual Basic2008
・Office2010

○使用環境

・Windows7 64bit
・Office2010

プログラムは次のようになっています。

    Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
        Dim xlBook As Excel.Workbook = xlBooks.Open(pUserXltName)  ’指定のxltファイルを起動 
        Dim xlSheet As Excel.Worksheet = CType(xlBook.Worksheets("Sheet4"), Excel.Worksheet) 'Sheet4を指定

        xlApp.Visible = True

        xlSheet.Cells(1, 1).Value = "test"        '文字をセルA1に入れる 実際には”test”ではなく、あるフォルダのフルパスを入れます。
        xlSheet.Activate()                        'Sheet4をアクティブにしてxltファイル内にあるマクロを実行

        System.Runtime.InteropServices.Marshal.IsComObject(xlSheet)     'xlSheet の解放
        xlBook.Close()
        System.Runtime.InteropServices.Marshal.IsComObject(xlBook)
        System.Runtime.InteropServices.Marshal.IsComObject(xlBooks)
        xlApp.Quit()         'Excelを閉じる
        System.Runtime.InteropServices.Marshal.IsComObject(xlApp)      'xlApp を解放


”WorkSheets'メソッドは失敗しました”という事から、”Sheet4”を指定している行に問題があると考えています。参照に間違いがあるのでしょうか。

よろしくお願い致します。

[ツリー表示へ]
タイトルRe: Globalオブジェクトのエラーについて
記事No11282
投稿日: 2014/06/19(Thu) 19:56
投稿者魔界の仮面弁士
まず、根本的な間違いがあります。

> System.Runtime.InteropServices.Marshal.IsComObject(xlApp)      'xlApp を解放

IsComObject は、『解放』のための命令ではありません。
相手が「COM コンポーネント(ActiveXオブジェクト)」で
あるかどうかを調べ、True/False を返すだけのメソッドです。

それゆえ、提示されたコードは、そもそもオブジェクトの解放処理が
一切記述されていないという事態になります。恐らくはそれが原因かと。

かわりに、ReleaseComObject メソッドを呼び出すようにしてみてください。

http://hanatyan.sakura.ne.jp/vb2005/vb2005excel01.htm


> Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
> Dim xlBook As Excel.Workbook = xlBooks.Open(pUserXltName)

この部分は問題無さそうですね。VB.NET から扱う場合は、
 xlBook = xlApp.Workbooks.Open(pUserXltName)
のように記述するのではなく、一度、Workbooks コレクションを
 xlBooks = xlApp.Workbooks
 xlBook = xlBooks.Open(pUserXltName)
のように、変数に格納しておく必要があります。(後ほど、それらを明示的に解放するために)


> Dim xlSheet As Excel.Worksheet = CType(xlBook.Worksheets("Sheet4"), Excel.Worksheet)
このコードは望ましくありません。
Workbooks と同様、Sheets コレクションも一度変数に格納しておいて下さい。すなわち、
 xlSheet = xlBook.Worksheets("Sheet4")
ではなく、
 xlSheets = xlBook.Worksheets
 xlSheet = xlSheets("Sheet4")   'xlSheet を Worksheet 型で扱いたい場合は、明示的にキャストしましょう
のように記述せねばならないということです。



> xlSheet.Cells(1, 1).Value = "test"
Cells プロパティは引数を伴わないプロパティです。
Cells プロパティを Range 型の変数に代入し、それを利用しましょう。

yuki = xlSheet.Cells
hanatyan = yuki(1,1)     'hanatyan = yuki.Items(1,1) の意味
hanatyan.Value = "test"

[ツリー表示へ]
タイトルRe^2: Globalオブジェクトのエラーについて【解決】
記事No11283
投稿日: 2014/06/20(Fri) 15:32
投稿者yuki
魔界の仮面弁士様

丁寧な回答誠にありがとうございました。
Cellsプロパティの間違いには昨日気づき、Range型にプログラムを修正して確認していたところでした。

VB.NETでの開発自体がほとんどない為、今回のご指摘は大変為になりました。
VB.NETの基本的な所から学び直したいと思います。

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

[ツリー表示へ]