開発環境:
VB.NET 2003
Windows XP Professional
Excel 2003
実行環境:
Windows 98 SE or Windows 2000 Professional
Excel 2000
状況は、VB.NET環境でForm1上にWebBrowserコントロールを配置し、ここでNavigateメソッドを使って「*.xls」ファイルを開いてExcelをForm1に埋め込んでいます。ファイルを開いて発生するWebBrowserのNavigateComplete2イベントからe.pDisp.Document.Applicationで得られるExcel.Applicationオブジェクトを使ってActiveSheetによりWorksheetオブジェクトを取得、変数smplSheetに格納してRange(“A10”).Insertメソッドによりセルを次のコードで挿入しています。
Public Sub smplInsert()
Dim smplSheet As Worksheet = smplApplication.ActiveSheet
smplSheet.Range("A10").Insert(Shift:=Excel.XlDirection.xlDown)
End Sub
IDEの「ソリューション」エクスプローラの「参照設定」には「AxInterop.SHDocVw、Interop.Excel、Interop.SHDocVw」が作成され、このうちの「Interop.Excel」はExcel 2003のインストールされたPCで作成されたものになります。
パラメータの数が無効です。
詳細:
************** 例外テキスト **************
System.Reflection.TargetParameterCountException: パラメータの数が無効です。
at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at Excel.Range.Insert(Object Shift, Object CopyOrigin)
at Excel2000Tester.Tester.Button1_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
問題は、Excel 2003がインストールされたXPのPCではInsertメソッドを何の問題もなく呼び出せるのですが、Excel 2000がインストールされたWin 98のPCではInsertメソッドを呼び出す部分で次のような例外が発生してしまい悩んでいます。
企業内でOfficeのバージョンを2000に統一しているためにExcel 2000で動作させなければならず、これをどのようにして解決すればよいのかご教授いただきたくお願いいたします。
(VB.NETのコードでInsertメソッドは例外が発生しますが、他の試してみたDeleteメソッドは呼び出しが成功することが分かりました。
また主な部分は同じにしたコードをExcelのマクロとして「ツール」→「マクロ」→「Visual Basic Editor」によってModule1モジュールファイルに書き込み、以下のsmplInsertマクロを実行させたところ、Excel 2003、Excel 2000両バージョンで正常に機能することが分かり、マクロではこのコードは正しく実行できることが分かりました。
Public Sub smplInsert()
Dim smplSheet As Worksheet
Set smplSheet = ActiveSheet
smplSheet.Range("A10").Insert(Shift:=XlDirection.xlDown)
End Sub
しかしVB.NETのコードでは例外が発生してしまい悩んでいます。)
申し訳ございませんが、投稿記事を一部間違えてしまいました。再度投稿いたします。
開発環境:
VB.NET 2003
Windows XP Professional
Excel 2003
実行環境:
Windows 98 SE or Windows 2000 Professional
Excel 2000
状況は、VB.NET環境でForm1上にWebBrowserコントロールを配置し、ここでNavigateメソッドを使って「*.xls」ファイルを開いてExcelをForm1に埋め込んでいます。ファイルを開いて発生するWebBrowserのNavigateComplete2イベントからe.pDisp.Document.Applicationで得られるExcel.Applicationオブジェクトを使ってActiveSheetによりWorksheetオブジェクトを取得、変数smplSheetに格納してRange(“A10”).Insertメソッドによりセルを次のコードで挿入しています。
Public Sub smplInsert()
Dim smplSheet As Worksheet = smplApplication.ActiveSheet
smplSheet.Range("A10").Insert(Shift:=Excel.XlDirection.xlDown)
End Sub
IDEの「ソリューション」エクスプローラの「参照設定」には「AxInterop.SHDocVw、Interop.Excel、Interop.SHDocVw」が作成され、このうちの「Interop.Excel」はExcel 2003のインストールされたPCで作成されたものになります。
問題は、Excel 2003がインストールされたXPのPCではInsertメソッドを何の問題もなく呼び出せるのですが、Excel 2000がインストールされたWin 98のPCではInsertメソッドを呼び出す部分で次のような例外が発生してしまい悩んでいます。
パラメータの数が無効です。
詳細:
************** 例外テキスト **************
System.Reflection.TargetParameterCountException: パラメータの数が無効です。
at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at Excel.Range.Insert(Object Shift, Object CopyOrigin)
at Excel2000Tester.Tester.Button1_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
企業内でOfficeのバージョンを2000に統一しているためにExcel 2000で動作させなければならず、これをどのようにして解決すればよいのかご教授いただきたくお願いいたします。
(VB.NETのコードでInsertメソッドは例外が発生しますが、他の試してみたDeleteメソッドは呼び出しが成功することが分かりました。
また主な部分は同じにしたコードをExcelのマクロとして「ツール」→「マクロ」→「Visual Basic Editor」によってModule1モジュールファイルに書き込み、以下のsmplInsertマクロを実行させたところ、Excel 2003、Excel 2000両バージョンで正常に機能することが分かり、マクロではこのコードは正しく実行できることが分かりました。
Public Sub smplInsert()
Dim smplSheet As Worksheet
Set smplSheet = ActiveSheet
smplSheet.Range("A10").Insert(Shift:=XlDirection.xlDown)
End Sub
しかしVB.NETのコードでは例外が発生してしまい悩んでいます。)
> http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200603/06030015.txt で
> WebBrowserについてご質問させていただき
あれ? 『WebBrowserについて』ではなく、その逆に
『WebBrowserを使用しない』事に対する質問だったような……。(^^;
> 企業内でOfficeのバージョンを2000に統一しているためにExcel 2000で動作させなければならず
ならば、Excel 2000の環境で開発するべきかと。
2000 と 2003 では、定義の幾つかが異なりますので(97はさらに異なる)、
前提知識無しで、2003 だけを使って開発するのはかなり難しいです。
最近、下記で似たような件について回答していますので、参考までに。
http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=2899
> VB.NETのコードでInsertメソッドは例外が発生しますが、
2003 の Range.Insert は、『Function Insert(Shift, CopyOrigin)』ですが、
2000 の Range.Insert は、『Sub Insert(Shift)』だからです。
実行時バインディングではなく、遅延バインディングでコーディングすれば
解決できるでしょうけれども、いずれにしても、動作確認のためにも、
開発環境に Excel 2000 が必要でしょう。
(ただし、開発環境に複数バージョンの Excel を混在させるのは NG)
> smplSheet.Range("A10").Insert(Shift:=Excel.XlDirection.xlDown)
これ、別の意味でまずいですよ。Marshal.ReleaseComObject による
Rangeオブジェクトの解放処理を組み込んでください。
>> VB.NETのコードでInsertメソッドは例外が発生しますが、
> 2003 の Range.Insert は、『Function Insert(Shift, CopyOrigin)』ですが、
> 2000 の Range.Insert は、『Sub Insert(Shift)』だからです。
すみません、間違えました。m(_ _;)m
Excel 2003 が『Function Insert(Shift, CopyOrigin)』で、
Excel 2000 が『Function Insert(Shift)』で、
Excel 97 が、『Sub Insert(Shift)』です。
>『WebBrowserを使用しない』事に対する質問だったような
「インプレースアクティベーション」...険しい道で挫折、とりあえずの動作を目指して計画変更しました。
>ならば、Excel 2000の環境で開発するべきかと。
そうですよね、
>2000 の Range.Insert は、『Sub Insert(Shift)』
そうだったんですか。
>遅延バインディングでコーディングすれば
やってみます。ご教授ありがとうごいます。
>これ、別の意味でまずいですよ
WebBrowserのe.pDispから得たExcel.ApplicationオブジェクトもReleaseComObject の解放作業が必要だったんですか。すぐに修正します。
>下記で似たような件について回答していますので、参考までに。
これ、大変参考になります。ありがとうございます。
>Excel 2003 が『Function Insert(Shift, CopyOrigin)』で、
>Excel 2000 が『Function Insert(Shift)』で、
パラメータの数が違うという例外の意味が分かりました。
# 教授→教示という突っ込みはさておいて。
> WebBrowserのe.pDispから得たExcel.Applicationオブジェクトも
> ReleaseComObject の解放作業が必要だったんですか。
Application を得ているなら、それの解放も必要だと思います。
(Document から得られるのは、Workbook ですね)
# きちんと解放できるかどうかは別問題ですが。
なお、先の例で書いた点は、
> smplSheet.Range("A10").Insert(Shift:=Excel.XlDirection.xlDown)
を、
a = smplSheet.Range(…)
b = a.Insert(…)
Marshal.ReleaseComObject(b)
Marshal.ReleaseComObject(a)
のようにする必要があるだろう、という意味です。
魔界の仮面弁士さん、本当にありがとうございます。
すんなりと動作させることができるようになりました。
ReleaseComObjectのオブジェクトの解放も追加しました。
ツイート | ![]() |