1. ホーム
  2. excel

[解決済み] VB: タイプライブラリ/DLL の読み込みにエラーが発生しました。(HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY) からの例外)

2022-02-24 02:17:48

質問

私は、Excelからデータをインポートする必要があるアプリに取り組んでいます。

私の解決策は Microsoft.office.Interop.Excel.

しかし、デバッグをするとこのようなエラーが発生します。

Message=Unable to cast COM object of type Microsoft.Office.Interop.Excel.ApplicationClass' からインターフェースタイプ 'Microsoft.Office.Interop.Excel._Application' です。この操作は失敗しました。 インターフェイスのCOMコンポーネントでQueryInterfaceを呼び出したためです。 IID '{000208D5-0000-0000-C000-000000000046}' は、次の理由で失敗しました。 次のようなエラーが発生しました。Error loading type library/DLL. (からの例外 HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))

以下、私のコードです。

Imports Excel = Microsoft.office.Interop.Excel

Private Sub BExcel1_Click(sender As Object, e As EventArgs) Handles BExcel1.Click
    OpenFileDialog1.Filter = "Excel Files|*.xlsx; *.xls; *.xlsm"
    If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
        ExcelPath1.Text = OpenFileDialog1.FileName
    End If

    Dim XlApp As New Excel.Application
    Dim XlWorkBook As Excel.Workbook
    Dim XlWorkSheet As Excel.Worksheet
    XlWorkBook = XlApp.Workbooks.Open(ExcelPath1.Text)

 End Sub

以下のような解決策をググってみたのですが、うまくいきませんでした。

  1. Officeを修復しました。
  2. Visual Studioを修理しました
  3. レジストリエディタを利用して Computer\HKEY_CLASSES_ROOT\TypeLib\ が、その下にある 00020813-0000-0000-C000-000000000046 私は1.9のバージョンを得た、それは2つのバージョン間の競合のようではないようです?

この問題を解決するためのアイデアはありますか?

VS version:2017 community

Excel version:2016

Microsoft.Office.Interop.Excel version:15.0.0.0

解決方法は?

まず、Visual Studioを /ResetUserData コマンドライン引数で指定します。それについては Team Explorer 2008からMicrosoft Excelへのエクスポート時に、エラー "COMオブジェクトをキャストできません..."が発生する。 の記事で紹介しています。

明らかに、間違ったバージョンのExcelに接続しようとしています。古いバージョンのOfficeをアンインストールした後に、余分なWindowsレジストリキーが残っているか、その逆の場合もあるようです。とにかく、次のページを見てください。 "Microsoft.Office.Interop.Excel.ApplicationClass' 型の COM オブジェクトを 'Microsoft.Office.Interop.Excel._Application' というインターフェース型にキャストできない" を解決する方法 のブログ記事で、まったく同じ問題を説明しています。基本的には、Windowsレジストリにある間違ったエントリを見つけ、それを削除する必要があります。

ちなみに、プロジェクトに新しいCOMリファレンスを追加すると、(もう存在しないのであれば)自動的にミスPIAが生成されます。だから、それは可能な方法です。また、以下のスクリーンショットのように、独自のアセンブリにinterop型を埋め込んでみるのもよいでしょう。