QA@IT

ExcelのSheet指定時のエラー

9267 PV

@ITの記事「Excelファイルにアクセスするには?[C#、VB] - @IT」についての質問です。
Excelを開いた後、Sheetを指定するところでエラーになります。
今まではこれで正常に動作していましたが、急にエラーになりました。
急にと言っても全く何もしなかった訳ではなく、別のアプリでExcelの操作をこれと同じ内容で行うためコピーしていましたが、参照の追加を忘れたといったミスがあり、もう一度動作を確認しようとした時点でエラーになることが判りました。
Excelの操作については、参考書もなくこのようなサイトからコードをコピペして使用しているため、理解して作成してわけではありません。どこをおかしくしたのか全く判らず困っています。

 Dim app = New Excel.Application
    Dim oXls = New Excel.Application() ' Excelオブジェクト
    Dim oWBook As Excel.Workbook ' Workbookオブジェクト
    Dim sheetName As String = "配布用名簿"  'Sheetを"配布用名簿"に設定する
    Dim oSheet As Excel.Worksheet ' Worksheet オブジェクト

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

    TextBox4.Text = "ExcelFile取り込み中"

    ' 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)

    oSheet = DirectCast(oWBook.Sheets(getSheetIndex(sheetName, oWBook.Sheets)), Excel.Worksheet) 
  'デバッグ時に、この行で「COMExveptionはハンドルされませんでした。インデックスが無効です。…」エラーになる

    oSheet.Select()

以上です。不具合箇所をご指摘よろしくお願い致します。

回答

エラーとしては getSheetIndex で返されるシートインデックスに対応するシートがワークブックにない。

たとえば gstrExcelFileName (質問にないので内容不明) のExcelブックにシートが3つしかないのに getSheetIndex が 4とか返してきているような状況だと思います。

考えられるのは

gstrExcelFileName で指定されるExcelファイルに "配布用名簿" シートがない。

getSheetIndex メソッドがバグっている。

あたりと思いますのでその辺を検証してみてください。
エラーの原因を探りながらコードの内容についても調べて理解を深めていただければと思います。


ちなみに

Dim sheetName As String = "配布用名簿" 'Sheetを"配布用名簿"に設定する

の行は、変数に文字列を入れてるだけでこの行ではシートは設定されていません。
(「この行でもうシートは選択されてるはずだからシートが無いことはない」ともし思われているのなら違いますよというだけの意味で補足しました)

編集 履歴 (0)
  • flied_onionさんと同様の回答です。
    そもそもgetSheetIndexはExcelオブジェクトにはありませんから当然自分で作ってあるのですよね?
    わざわざIndexをとらなくても直接シート名でよいのでは?
    oSheet = DirectCast(oWBook.Sheets(sheetName), Excel.Worksheet)
    -
ウォッチ

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