DOBON.NET DOBON.NETプログラミング掲示板過去ログ

HRESULTからの例外

環境/言語:[OS : Windows XP]
分類:[.NET]

【解決したい問題】

環境は、Visual Studio 2008 です。

プログラムを実行すると、以下の警告が発生しました。

COMExceptionはハンドルされませんでした
HRESULT からの例外: 0x800A03EC

発生場所は★の位置です。

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

Private Sub check_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles check.Click

xlCells = xlSheet.Cells

Dim SearchChar As String
Dim dp, np As Integer

For i = 0 To 5
xlRange = DirectCast(xlCells(i, 8), Excel.Range) ★
Do
SearchChar = xlRange.Value
dp = Text2.Text.IndexOf(SearchChar, np)
If dp >= 0 Then
MessageBox.Show(dp + 1 & " 文字目に見つかりました")
np = dp + SearchChar.Length
Else
MessageBox.Show("指定の文字は見つかりませんでした")
Exit Do
End If
Loop
Next i

MRComObject(xlCells) 'xlCellsの解放
MRComObject(xlRange) 'xlRangeの解放

End Sub

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

textBoxに入力した文にExcel(2003)に入力してある文字列があるかどうか検索するというものを作りたいです。

初心者ですのでこのようなエラーは見たことがなく、
検索したりヘルプも見てみましたがどうすればいいか分かりません。

どうか宜しくお願いします。
2009/11/06(Fri) 11:18:23 編集(投稿者)

■No25729に返信(dshyさんの記事)
> 
> プログラムを実行すると、以下の警告が発生しました。
> 
> COMExceptionはハンドルされませんでした
> HRESULT からの例外: 0x800A03EC

COM サーバーで例外が発生するとこのエラーが出ます。


> Private Sub check_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles check.Click
> 
>         xlCells = xlSheet.Cells
> 
>         Dim SearchChar As String
>         Dim dp, np As Integer
> 
>         For i = 0 To 5
>             xlRange = DirectCast(xlCells(i, 8), Excel.Range) ★
>             Do
>                 SearchChar = xlRange.Value
>                 dp = Text2.Text.IndexOf(SearchChar, np)
>                 If dp >= 0 Then
>                     MessageBox.Show(dp + 1 & " 文字目に見つかりました")
>                     np = dp + SearchChar.Length
>                 Else
>                     MessageBox.Show("指定の文字は見つかりませんでした")
>                     Exit Do
>                 End If
>             Loop
>         Next i
> 
>         MRComObject(xlCells)   'xlCellsの解放
>         MRComObject(xlRange)   'xlRangeの解放
> 
>     End Sub

For 文の開始インデックスを 0 からまわしてますが、
Excel.Range の行(列)インデックス指定は 0 ではなく 1 からです。

提示のソースでは、For 文の初回ループが xlCells(0, 8) になっており、
存在しないセル「0 行 8 列」を参照しにいくため、COM サーバーが例外を発生します。

よって

For i = 0 To 5 
    ・・・
Next

ではなく

For i = 1 To 5 
    ・・・
Next

になりますね。
Excel を参照しての操作は、実際の処理を Excel.exe がやっており、
VB はエクセルに処理を実行してくれるようお願いしているだけなので、
エラーの詳細も十分に把握できないことが多いのです。

Excel VBA で同様の操作をやって原因を調べた方が早いです。
(ただし、Excel VBA の文法は VB6.0 時代のものになります。
COM の解放処理も必要ないので省略しています。注意してください。)

[Excel VBA]
Dim xlRange As Excel.Range
Set xlRange = ThisWorkbook.Worksheets("Sheet1").Cells(0, 8)
[エラーメッセージ]
アプリケーション定義またはオブジェクト定義のエラーです。

まぁ、このエラーメッセージでもすぐには意味が分からないと思いますが、
取得できるセル範囲を変更して色々調べれば何が起こっているのか理解
できると思います。
結論から言えば Excel ではインデックスが1始まりです。0行目を指定
しても対象のオブジェクトが存在しません。


初心者ながら、Cells の解放処理を入れているのは、よく勉強されている
と思います。
しかし、提示のコードでは、ループ内で $H$1,$H$2,$H$3,$H$4,$H$5
と順にセルオブジェクトを参照した場合、解放処理はループの外で
行なわれていますので、
>MRComObject(xlRange) 'xlRangeの解放
最後に参照した $H$5 しか解放しない意味になります。
ループ内で使用した $H$1,$H$2,$H$3,$H$4 も解放できるように
修正してください。
http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm

MRComObject という関数名は、花ちゃんのサイトのサンプルを利用している
のでしょうが、出典の記載無しに他人のコードを他のサイトに書き込む
のは著作権上の問題があります。そのサイトの利用規約を読んでおいて
ください。
http://hanatyan.sakura.ne.jp/hazimeni.htm#1
  • 題名: Re[2]: HRESULTからの例外
  • 著者: dshy
  • 日時: 2009/11/09 17:22:59
  • ID: 25751
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No25734に返信(ひらぽんさんの記事)
> 2009/11/06(Fri) 11:18:23 編集(投稿者)
>
> >
> For 文の開始インデックスを 0 からまわしてますが、
> Excel.Range の行(列)インデックス指定は 0 ではなく 1 からです。
>
> 提示のソースでは、For 文の初回ループが xlCells(0, 8) になっており、
> 存在しないセル「0 行 8 列」を参照しにいくため、COM サーバーが例外を発生します。
>
> よって
>
> For i = 0 To 5
> ・・・
> Next
>
> ではなく
>
> For i = 1 To 5
> ・・・
> Next
>
> になりますね。


ひらぽん様、ありがとうございます。
1からに直したらエラーが出なくなりました。
また機会があれば宜しくお願いします。
解決済み!
  • 題名: Re[2]: HRESULTからの例外
  • 著者: dshy
  • 日時: 2009/11/09 17:37:04
  • ID: 25752
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No25735に返信(るしぇさんの記事)
> Excel を参照しての操作は、実際の処理を Excel.exe がやっており、
> VB はエクセルに処理を実行してくれるようお願いしているだけなので、
> エラーの詳細も十分に把握できないことが多いのです。
>
> Excel VBA で同様の操作をやって原因を調べた方が早いです。
> (ただし、Excel VBA の文法は VB6.0 時代のものになります。
> COM の解放処理も必要ないので省略しています。注意してください。)
>
> [Excel VBA]
> Dim xlRange As Excel.Range
> Set xlRange = ThisWorkbook.Worksheets("Sheet1").Cells(0, 8)
> [エラーメッセージ]
> アプリケーション定義またはオブジェクト定義のエラーです。
>
> まぁ、このエラーメッセージでもすぐには意味が分からないと思いますが、
> 取得できるセル範囲を変更して色々調べれば何が起こっているのか理解
> できると思います。
> 結論から言えば Excel ではインデックスが1始まりです。0行目を指定
> しても対象のオブジェクトが存在しません。

るしぇ様ありがとうございます。
VBAも勉強したいと思います。
インデックスを1からに直したらエラーが出なくなりました。

> 初心者ながら、Cells の解放処理を入れているのは、よく勉強されている
> と思います。
> しかし、提示のコードでは、ループ内で $H$1,$H$2,$H$3,$H$4,$H$5
> と順にセルオブジェクトを参照した場合、解放処理はループの外で
> 行なわれていますので、
> >MRComObject(xlRange) 'xlRangeの解放
> 最後に参照した $H$5 しか解放しない意味になります。
> ループ内で使用した $H$1,$H$2,$H$3,$H$4 も解放できるように
> 修正してください。
> http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm

ループ内でも解放しないといけないんですね。
修正したいと思います。

> MRComObject という関数名は、花ちゃんのサイトのサンプルを利用している
> のでしょうが、出典の記載無しに他人のコードを他のサイトに書き込む
> のは著作権上の問題があります。そのサイトの利用規約を読んでおいて
> ください。
> http://hanatyan.sakura.ne.jp/hazimeni.htm#1

利用規約をよく読んでいませんでした。
配慮が足りなくてすみません。

また機会があれば宜しくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板