VB.NETでエクセルを操作するときに出るエラーの解決方法をおしえてください。

解決


ゆう  2004-07-06 09:36:22  No: 114531  IP: [192.*.*.*]

VB.NETで作ったアプリケーションをOS98のパソコンにインストールして動作させたのですがエクセルの1つのセルに文字を入れるところでエラーが出てしまします。
「System.Runtime.InteropServices.COMEException(0x80020008)変数の種類が不良です。」と出てしまいます。開発環境では何の問題もなく動きます。
FrameWork1.1もいれてありますし、データベース操作をしているのでMSデータアクセスコンポーネントも入れてあります。
プログラムです。参考にしてください。
☆印まではちゃんと動作するみたいです。

Private Sub BtnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEnd.Click
        'エクセル起動
        Dim oExcel As Object
        Dim oBook As Object
        Try
            oExcel = CreateObject("Excel.Application")
            oExcel.Visible = True

            oExcel.workbooks.Open(Application.StartupPath & "\ガスメータチェック一覧.xls") 'アプリケーションの現在地の絶対パス

            oExcel.UserControl = True 'これを設定しておけば勝手に終了しない。


            oExcel.worksheets("Sheet1").Range("B5:G100").Select()
            ☆oExcel.Selection.ClearContents()
            'データグリッド表示()
            Call DbgDisp()
            Dbg_Master.Visible = False
            Dim i, cnt As Long
            '該当レコード数探索のクラス
            'cnt = oDB.RecCount
            cnt = Dbg_Master.VisibleRowCount
            Dim j As Long
            'データグリッドのデータをエクセルに書き込む
            For i = 0 To cnt - 2
                j = i + 5
                oExcel.Cells(j, 2).Value = i + 1
                oExcel.Cells(j, 3).Value = Dbg_Master.Item(i, 5)
                oExcel.Cells(j, 4).Value = Dbg_Master.Item(i, 1)
                oExcel.Cells(j, 5).Value = Dbg_Master.Item(i, 2)
                oExcel.Cells(j, 6).Value = Dbg_Master.Item(i, 3)
                oExcel.Cells(j, 7).Value = Dbg_Master.Item(i, 4)
            Next i
            oExcel.Cells(5, 2).Activate()




        Catch oExcept As Exception
            '例外が発生した時の処理
            MsgBox(oExcept.ToString, MsgBoxStyle.OKOnly)

        Finally
            oExcel = Nothing
            oBook = Nothing
        End Try

    End Sub

編集 削除
うにぃ  2004-07-06 10:35:48  No: 114532  IP: [192.*.*.*]

>oExcel.Cells(j, 2).Value = i + 1
ではなく、
oExcel.Worksheets("Sheet1").Cells(j, 2).Value = i + 1
ではないでしょうか。

編集 削除
nanashi  2004-07-06 11:07:23  No: 114533  IP: [192.*.*.*]

selectを使用せず、Worksheetのオブジェクトを使用してみてはいかがでしょうか?

編集 削除
Dental  2004-07-06 11:19:12  No: 114534  IP: [192.*.*.*]

> Dim j As Long
一般的には、Short か Integer などを使うのでは。
配列のインデックスに、Longの範囲が必要になるとも思えませんし。

> ☆oExcel.Selection.ClearContents()
Select系/Activate系のプロパティやメソッドの使用は、極力避けましょう。
どのオブジェクトが選択されているかによって、動作が異なってしまうため、
処理が曖昧になってしまいます。

> oExcel = Nothing
> oBook = Nothing
階層の下側から順に解放した方が良いでしょう。(Worksheet→Workbook→Application)
それと、ReleaseComObjectの呼出が行われていないのも問題になるかと。

http://blogs.users.gr.jp/hidori/archive/2004/01/26/916.aspx
http://support.microsoft.com/default.aspx?scid=kb;ja;317109

編集 削除
ゆう  2004-07-06 13:12:22  No: 114535  IP: [192.*.*.*]

有難うございました。上記のことをいろいろやってみたらできました。
これからもなにかあったら宜しくお願いします。

編集 削除