tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: Excel2016のセル操作
投稿日: 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'にキャストできません。
になるのでしょうか?

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。