tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルExcel2016のセル操作
記事No11916
投稿日: 2017/10/17(Tue) 09:47
投稿者aMa
Microsoft Visual Basic 2010Expressでのデバグ時の問題です。
Windows Vista/Excel2007では問題は発生しません。
Windows 10/Excel2016では、
xlRange = xlSheet1.Range(bbb)
の行にエラーが出ます。bbbにはB19の様な値が入ります。
エラーのタイトルは「System.InvalidCastException はハンドルされませんでした。」です。
イミディエイトウィンドの表示は「System.InvalidCastException' の初回例外が **.exe で発生しました。」です。
Excel2016では別のImport、参照設定が必要なのでしょうか。
原因や対策等を教えて頂きたく、よろしくお願い致します。
VB歴は時々使用する3年程度です。

[ツリー表示へ]
タイトルRe: Excel2016のセル操作
記事No11917
投稿日: 2017/10/17(Tue) 10:23
投稿者shu
> Microsoft Visual Basic 2010Expressでのデバグ時の問題です。
> Windows Vista/Excel2007では問題は発生しません。
> Windows 10/Excel2016では、
> xlRange = xlSheet1.Range(bbb)
> の行にエラーが出ます。bbbにはB19の様な値が入ります。
> エラーのタイトルは「System.InvalidCastException はハンドルされませんでした。」です。
> イミディエイトウィンドの表示は「System.InvalidCastException' の初回例外が **.exe で発生しました。」です。
> Excel2016では別のImport、参照設定が必要なのでしょうか。
System.InvalidCastExceptionの発生している箇所を特定することから始めてみてはどうでしょうか?
それがExcel関連のオブジェクトを使用している箇所なら参照設定の変更が必要になるかと思います。

[ツリー表示へ]
タイトルRe^2: Excel2016のセル操作
記事No11918
投稿日: 2017/10/17(Tue) 15:18
投稿者aMa
やり方を具体的に教えて頂けないでしょうか。
私のレベルを超えていそうな気がしますが、よろしくお願い致します。

[ツリー表示へ]
タイトルRe: Excel2016のセル操作
記事No11919
投稿日: 2017/10/17(Tue) 19:20
投稿者魔界の仮面弁士
当方では現象を確認できておりませんが、まずは
「開発環境の Excel バージョン」と
「実行環境の Excel バージョン」が
一致しているかどうかを確認しておいてください。
違っている場合は、それぞれのバージョンを確認しておきましょう。

また、特定のバージョンのみで起こる問題というものもありますので、
Excel 2016 の正確なバージョンも調べておいたほうが良いと思います。
https://social.msdn.microsoft.com/Forums/ja-JP/6cc8f54d-5502-43ef-bee8-15e52cbbce9e/excel2016workbookopen?forum=vbajp


> xlRange = xlSheet1.Range(bbb)
> の行にエラーが出ます。bbbにはB19の様な値が入ります。

(1) bbb のデータ型は何ですか? String? Object? Range?

(2) エラーになるのは「Range プロパティからの取得」時でしょうか?
  それとも、「Range 型変数への代入」時でしょうか?
 Dim o As Object = xlSheet1.Range(bbb)
 Dim xlRange As Excel.Range = TryCast(o, Excel.Range)

(3) レイトバインドで実行した場合はどうなりますか?
 Dim o As Object = CallByName(Nothing, "Range", CallType.Get, bbb)

(4) ソリューション エクスプローラーで[すべてのファイルを表示]にした後、
 [参照設定]フォルダー内にある Excel ライブラリのプロパティで
 『相互運用型の埋め込み』および『分離』の True/False を
 変更してみた場合、結果に違いが出ますか?

[ツリー表示へ]
タイトルRe^2: Excel2016のセル操作
記事No11920
投稿日: 2017/10/23(Mon) 18:03
投稿者aMa
> 当方では現象を確認できておりませんが、まずは
> 「開発環境の Excel バージョン」と
> 「実行環境の Excel バージョン」が
> 一致しているかどうかを確認しておいてください。
> 違っている場合は、それぞれのバージョンを確認しておきましょう。
> また、特定のバージョンのみで起こる問題というものもありますので、
> Excel 2016 の正確なバージョンも調べておいたほうが良いと思います。
> https://social.msdn.microsoft.com/Forums/ja-JP/6cc8f54d-5502-43ef-bee8-15e52cbbce9e/excel2016workbookopen?forum=vbajp

遅くなり申し訳ありません。
WindowsVista/Excel2007(12.0.6747.5000)SP3 MSO(12.0.6743.5000)で、Microsoft Visual Basic 2010Expressで作成中のプロジェクトを、Windows10/Excel2016MSO(16.0.8431.2046)32ビットにコピーして、Microsoft Visual Basic 2010Expressでデバグを続行しようとした時の問題です。
「System.InvalidCastException はハンドルされませんでした。
型'System.__ComObject'のCOMオブジェクトをインターフェイス型'Microsoft.Office.Interop.Excel.Range'にキャストできません。
IID'{00020846-0000-0000-C000-000000000046}'が指定されたインターフェイスのCOMコンポーネント上でのQueryInterface呼び出しのときに次のエラーが発生したため、この操作に失敗しました
インターフェイスが登録されていません(HRESULTからの例外:0x80040155)。」
・・・とエラーが表示されます。
ちなみに、Microsoft Visual Studio 2017でデバグした時は、
「System.InvalidCastException が発生しました(以下の内容は同文)」・・と出ます。
また、.exeファイルを直接起動した時は、「・・・ハンドルされていない例外発生・・・続行/終了」・・・と出て、続行してExcelを閉じる操作ができます。(その他の動作はデバグ中なので、正しいかどうかは不明です。)

> > xlRange = xlSheet1.Range(bbb)
> > の行にエラーが出ます。bbbにはB19の様な値が入ります。
> (1) bbb のデータ型は何ですか? String? Object? Range?

bbb のデータ型はStringです。Objectとした場合も同じでした。

> (2) エラーになるのは「Range プロパティからの取得」時でしょうか?
>   それとも、「Range 型変数への代入」時でしょうか?
>  Dim o As Object = xlSheet1.Range(bbb)
>  Dim xlRange As Excel.Range = TryCast(o, Excel.Range)

エラーになるのはRangeプロパティからの取得の時になると思います。(セルを読み取る時です。)
対象行の直前に
Dim o As Object = xlSheet1.Range(bbb)
Dim xlRange As Excel.Range = TryCast(o, Excel.Range)
を記載してみましたが、1行目に「InvalidCastExceptionはハンドルされませんでした。」が出ます。
(何をしているのか理解できていません。)

> (3) レイトバインドで実行した場合はどうなりますか?
>  Dim o As Object = CallByName(Nothing, "Range", CallType.Get, bbb)

対象行の直前に
Dim o As Object = CallByName(Nothing, "Range", CallType.Get, bbb)
を記載してみましたが、1行目に「NullReferenceExceptionはハンドルされませんでした。」が出ます。
(何をしているのか理解できていません。)

> (4) ソリューション エクスプローラーで[すべてのファイルを表示]にした後、
>  [参照設定]フォルダー内にある Excel ライブラリのプロパティで
>  『相互運用型の埋め込み』および『分離』の True/False を
>  変更してみた場合、結果に違いが出ますか?

相互=True/分離=False: 現状
相互=True/分離=True: ビルドエラー
相互=False/分離=True: ビルドエラー
相互=False/分離=False: 現状と同じ

以上、よろしくお願い致します。

[ツリー表示へ]
タイトルRe^3: Excel2016のセル操作
記事No11921
投稿日: 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'にキャストできません。
になるのでしょうか?

[ツリー表示へ]
タイトルRe^4: Excel2016のセル操作
記事No11927
投稿日: 2017/10/29(Sun) 18:32
投稿者aMa
旧環境:WindowsVista(32bit)・Excel2007(32bit)、新環境:Windows10(64bit)・Excel2016(32bit)です。

『参照設定に用いているExcelのDLLのバージョン』は、新環境、旧環境ともに、『VB2010 Express、参照設定、Microsoft.Office.Interop.Excel、バージョン:1.6.0.0』でした。

旧環境に、HKEY_CLASSES_ROOT\Interface\{00020846-0000-0000-C000-000000000046}\TypeLib(Version1.6)は有りましたが、新環境には有りませんでした(新環境では、000208D3〜でした。)?

旧環境でビルドしたexeを新環境で実行した場合も、『型'System.__ComObject'のCOMオブジェクトをインターフェイス型'Microsoft.Office.Interop.Excel.Range'にキャストできません。』になります。

新環境でリビルドした物を、旧環境のVB2010Expressで動作させた場合および旧環境でexeファイルを起動した場合は、エラーは出ません。Excelを起動して閉じる事ができます。その他の動作は未完成、デバグ中なので、どうなるかは不明です。

旧環境で使用できて新環境で使用できない言葉があるのでしょうか?
定義の仕方や構成を変えてみたりしようと思いますが、何なのか釈然としません。
よろしくお願い致します。

[ツリー表示へ]
タイトルRe^5: Excel2016のセル操作
記事No11928
投稿日: 2017/11/01(Wed) 13:36
投稿者魔界の仮面弁士
まとまった時間が取れていない上に、自宅の PC が故障中で追加調査できていません。
回答を放置するのも何なので、調査の途中経過だけ記しておきます。


> 旧環境に、HKEY_CLASSES_ROOT\Interface\{00020846-0000-0000-C000-000000000046}\TypeLib(Version1.6)は有りましたが、
> 新環境には有りませんでした(新環境では、000208D3〜でした。)?

TypeLib キーを基点に探したのか、Interface キーから辿ったのか分かりませんが、
確認時にキーを一つ読み違えてはいないでしょうか。

先の投稿で私が提示した
 {00020846-0000-0000-C000-000000000046}
は『Microsoft Excel x.x Object Library』における「Range」を指す IID ですが
 {000208D3-0000-0000-C000-000000000046}
は『Microsoft Graph x.x Object Library』における「DisplayUnitLabel」の IID です。


それぞれが指すタイプライブラリは、レジストリでいうとそれぞれ
 HKEY_CLASSES_ROOT\TypeLib\{00020802-0000-0000-C000-000000000046}
 HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}
にあり、この 2 つのキーは隣接していることが多いので。


自分は Excel 2016 を使っていないので確証は持てないのですが、過去のバージョンでは
HKEY_CLASSES_ROOT\Interface\{00020846-0000-0000-C000-000000000046}\
が Excel.Range を指し示していたので、2016 でも同じだと予想しています。
しかし、新環境にはそのキーそのものが無いのですね?

仕様変更で Interface ID が変わるとも思えないので、もし本当に
失われているのだとしたら、Office を修復セットアップした方が良いかもしれません。


> 旧環境:WindowsVista(32bit)・Excel2007(32bit)、新環境:Windows10(64bit)・Excel2016(32bit)です。
旧環境が Excel 2007 (x86)
新環境が Excel 2016 (x86 on WOW64)
ということになりますね。


> 『参照設定に用いているExcelのDLLのバージョン』は、新環境、旧環境ともに、
> 『VB2010 Express、参照設定、Microsoft.Office.Interop.Excel、バージョン:1.6.0.0』でした。
VB を起動しなおし、新規作成したプロジェクトで参照設定を行ってみても、そのバージョンが使われるのでしょうか。

ひとまず、Microsoft.Office.Interop.Excel ということから、
PIA (プライマリ相互運用機能アセンブリ)を使っていることは間違い無さそうです。
https://msdn.microsoft.com/ja-jp/library/15s06t57.aspx
https://msdn.microsoft.com/ja-jp/library/aa159923.aspx


手元の環境で調べてみると 下記の場所に合計 7 つのバージョンがインストールされていました。
(x64版 Office 2013 と Visual Studio 2005/2008/2010/2012/2017 がインストール済み)


<1> C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
<2> C:\Program Files (x86)\Microsoft Office\Office15\DCF\Microsoft.Office.Interop.Excel.dll
<3> C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll
<4> C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll
<5> C:\Program Files (x86)\Microsoft Visual Studio 11.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll
<6> C:\Program Files (x86)\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11\Microsoft.Office.Interop.Excel.dll
<7> C:\Program Files (x86)\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll

<1> Office 2013 用 (DLL バージョン 15.0.4949.1000) .NET v2.0.50727
<2> Office 2013 用 (DLL バージョン 15.0.4931.1000) .NET v2.0.50727
<3> Office 2007 用 (DLL バージョン 12.0.4518.1014) .NET v2.0.50727
<4> Office 2010 用 (DLL バージョン 14.0.4756.1000) .NET v2.0.50727
<5> Office 2010 用 (DLL バージョン 14.0.4756.1000) .NET v2.0.50727
<6> Office 2003 用 (DLL バージョン 11.0.5530.0)    .NET v1.1.4322
<7> Office 2007 用 (DLL バージョン 12.0.4518.1014) .NET v1.1.4322


上位フォルダーをエクスプローラーで開いてファイルのプロパティを
確認しただけなので、それぞれの DLL の内容の違いまでは確認していません。
(ファイル列挙には DIR /S /B Microsoft.Office.Interop.Excel.dll を利用)


> 旧環境で使用できて新環境で使用できない言葉があるのでしょうか?
Excel バージョンが上がると、機能強化のために「省略可能な引数が増える」ことがあります。
(過去には、Sub から Function に変更されたメソッドもありましたし)

VBA の場合は、プロパティやメソッドの「名前」で検索するので、
省略可能な引数が増える分には、あまり影響が無いのですが、
参照設定して呼び出す場合は問題になることがあります。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=81884&KLOG=140

[ツリー表示へ]
タイトルRe^6: Excel2016のセル操作
記事No11931
投稿日: 2017/11/06(Mon) 11:54
投稿者aMa
  お忙しい中、ご対応頂き、ありがとうございます。

  レジストリーエディターで確認したものです。
新環境で、同検索機能を使用して、{00020846-0000-0000-C000-000000000046}は・・・
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\AppVMachineRegistryStore\Integration\Ownership\SOFTWARE\Classes\Interface\{00020846-0000-0000-C000-000000000046}
・・・がありました。

  「C:\>DIR /S /B Microsoft.Office.Interop.Excel.dll」の結果は次の通りでした。
C:\Program Files (x86)\Microsoft Office\root\Office16\ADDINS\Microsoft Power Query for Excel Integrated\bin\Microsoft.Office.Interop.Excel.dll
C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll

  コピーではなく初めから新規作成した時に参照設定を追加しましたが、その時の「参照設定に用いているExcelのDLLのバージョン」は「1.6.0.0」ではなく「1.9.0.0」になっていましたが、動作結果は同じでした。これまでの物も参照設定を一度削除して入れ替えてみましたが、結果は同じでした。

  別環境(Windows10/Excel2010)で、旧環境で作成したexeファイル、新環境でリビルドしたのち旧環境でリビルドしたexeファイル、新環境でリビルドしたexeファイルを実行してみましたが、エラーコメントは出ませんでした。この環境にもHKEY_CLASSES_ROOT\Interface\{00020846-はありませんでした。00020411-次は00021422-でした。

  これまでの結果だけを見れば、Excel2016の環境だけがNGの様です。
  よろしくお願い致します。

[ツリー表示へ]
タイトルRe^7: Excel2016のセル操作
記事No11946
投稿日: 2017/11/27(Mon) 16:31
投稿者aMa
Office2016を再インストールして、Range問題は出なくなりました。
ありがとうございました。
ご参考:レジストリーエディターで確認しましたが、やはり
HKEY_CLASSES_ROOT\Interface\{00020846-0000-0000-C000-000000000046}\TypeLib(Version1.6)は無く
00020412・・・の次は000208D3・・・でした。

[ツリー表示へ]