タイトル | : Re^3: Excel2016のセル操作 |
記事No | : 11921 |
投稿日 | : 2017/10/23(Mon) 20:57 |
投稿者 | : 魔界の仮面弁士 |
> WindowsVista/Excel2007(12.0.6747.5000)SP3 MSO(12.0.6743.5000)で、 元の開発環境が 2007 で
> Windows10/Excel2016MSO(16.0.8431.2046)32ビットにコピーして、 こちらは 2016 にあたるわけですね。
それぞれの環境について、参照設定に用いている Excel の DLL のバージョンを確認してみてください。 また、Vista / 10 それぞれの OS が、32bit 版か 64bit 版かも教えてください。
hhttps://social.msdn.microsoft.com/Forums/vstudio/ja-JP/5ab6219e-b371-419c-bfe9-5cbdcddc4a6c/office2010pcinteropexceldllexcel?forum=vbgeneralja
> インターフェイス型'Microsoft.Office.Interop.Excel.Range'にキャストできません。 > IID'{00020846-0000-0000-C000-000000000046}'が指定されたインターフェイスの > COMコンポーネント上でのQueryInterface呼び出しのときに次のエラーが発生したため、 > この操作に失敗しました > インターフェイスが登録されていません(HRESULTからの例外:0x80040155)。」 手元の環境が 2013(x64) であり、2016(x86) の場合は検証できないのですが、 とりあえず当方のレジストリを確認してみたところ、Excel.Range インターフェイスの登録が HKEY_CLASSES_ROOT\Interface\{00020846-0000-0000-C000-000000000046}\TypeLib にあり、(既定) が "{00020813-0000-0000-C000-000000000046}" で Version が "1.8" になっていました。
Excel 2016 の場合は、タイプライブラリバージョンは 1.9 のはずです。
で、上記のタイプライブラリ情報を基にして HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}\1.8 をさらに確認してみたところ、 (既定) = "Microsoft Excel 15.0 Object Library" "PrimaryInteropAssemblyName" = "Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C" と記されています。
また、この環境で Excel を参照設定し、ソリューションエクスプローラーから 参照設定の [Microsoft.Office.Interop.Excel] のプロパティを確認すると、 ID = "{00020813-0000-0000-C000-000000000046}\1.8\0\primary" となっていました。
>> (3) レイトバインドで実行した場合はどうなりますか? >> Dim o As Object = CallByName(Nothing, "Range", CallType.Get, bbb) ごめんなさい、上記は間違いです。 Dim o As Object = CallByName(xlSheet1, "Range", CallType.Get, bbb) Dim p As Object = o.Value のようにしてみてください。これはプロパティの名前を用いた呼び出し手法です。 xlSheet1 の部分は、Worksheet 型または Object 型の変数で指定します。
合わせて、ディスパッチ ID 指定による呼び出し手法として、 Dim o As Object = CallByName(xlSheet1, "[DispId=197]", CallType.Get, bbb) Dim p As Object = o.Value で呼び出せるかどうかも確認してみてください。
まぁ、本来はいずれも Dim o As Object = xlSheet1.Range(bbb) Dim p As Object = o.Value と同じ結果になるべきなのですが…。
> 相互=True/分離=False: 現状 > 相互=True/分離=True: ビルドエラー > 相互=False/分離=True: ビルドエラー > 相互=False/分離=False: 現状と同じ
新環境でリビルドするのするのではなく、 旧環境でビルドした EXE を新環境で実行した場合も >> 型'System.__ComObject'のCOMオブジェクトをインターフェイス型'Microsoft.Office.Interop.Excel.Range'にキャストできません。 になるのでしょうか?
|