- PR -

[C# VSTO2005] C#からVBAマクロメソッドを呼び出す

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-05 20:29
回答ありがとうございます。

下記コードでコンパイルに成功しました。

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();

double ans2 = (double)app.Run("Add", 1.23,2.34, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Console.WriteLine(ans2.ToString());

しかし、メソッド名の指定方法が誤っているようで、
実行時に"Addが存在しません"エラーが発生します。

> モジュール内の関数であれば、関数名を文字列で渡すだけです。
> 残りの引数は、その関数に渡すべき引数を示します。
であれば、メソッド名は"Add"と指定するだけでOKに思えます。

呼び出す側のC#のコードはExcelWorkbook1名前空間のSheet1クラスにあり、
マクロはModule1モジュールにあるので、
"Add"を"Module1.Add"に書き換えてみましたが、同じエラーです。
下記のいずれもだめでした。

"Add"
"Module1.Add"
"Module1.Module1.Add"
"MyMacros.Module1.Module1.Add"

一応、過去ログも検索してみたのですが、該当する情報を見つけられませんでした。
辛抱強くご回答いただき感謝しております。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-10-05 20:43
.NETラッパの仕様はよく知りませんが、Application.Runの実行には、そのマクロを
含むワークブックが開かれている必要があります。また、どのワークブックの関数か
を明示するには、ワークブック名!関数名(たとえばExcelWorkbook1.xls!Macro1)と
指定します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-05 20:54
引用:

じゃんぬねっとさんの書き込み (2006-10-04 20:45) より:

引用:

ひろしさんの書き込み (2006-10-04 19:24) より:

Excel.Application app;
int ans = (int)app.Run(this.Application.Modules["Module1"].Add(1, 2));


app のインスタンスが生成されていないようですが...


と、書いたので改善されているのかと思っていました。
Microsoft.Office.Tools.Excel.Workbook のプロパティ に Application プロパティがあります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-07 12:01
回答ありがとうございます。

下記にある通り、ウィルス検索ソフトがフロックしているようです。
ウィルス検索ソフトを無効化して再実験すればより正確な情報が得られますが、
ウィルス検索ソフトを無効化しなければ動かないようなら実用上問題があるので
再実験しないことにします。
ウィルス検索ソフトを無効化せずに動かせる妙案は多分無いのでしょうね。

★実験

内容 ExcelWorkbook1.xls(自分自身)のModule1(標準モジュール)を実行する。

■マクロ(ExcelWorkbook1.xls→標準モジュール→Module1)

Public Function DoubleAdd(a As Double, b As Double) As Double
DoubleAdd = a + b
End Function

■呼び出し側(ExcelWorkbook1.xls→Sheet1)

private void button1_Click(object sender, EventArgs e)
{
Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Run("ExcelWorkbook1.xls!Module1.DoubleAdd", 100, 200,Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
}

★結果
下記のエラーが発生し、実行を継続できなかった。
NortonInternetSecurityがブロックしている可能性がある。
該当ファイルをNortonAntiVirusで検索しましたがウィルスは検出されなかった。

System.Runtime.InteropServices.COMException はユーザー コードによってハンドルされませんでした。
HelpLink="C:\\Program Files\\Microsoft Office\\OFFICE11\\1041\\xlmain11.chm"
Message="ファイルを開くことができません。お使いのウイルス検出プログラムでファイルに問題が検出されました。"
Source="Microsoft Office Excel"
ErrorCode=-2146827284
StackTrace:
場所 Microsoft.Office.Interop.Excel.ApplicationClass.Run(Object Macro, Object Arg1, Object Arg2, Object Arg3, Object Arg4, Object Arg5, Object Arg6, Object Arg7, Object Arg8, Object Arg9, Object Arg10, Object Arg11, Object Arg12, Object Arg13, Object Arg14, Object Arg15, Object Arg16, Object Arg17, Object Arg18, Object Arg19, Object Arg20, Object Arg21, Object Arg22, Object Arg23, Object Arg24, Object Arg25, Object Arg26, Object Arg27, Object Arg28, Object Arg29, Object Arg30)
場所 ExcelWorkbook1.Sheet1.button1_Click(Object sender, EventArgs e) 場所 C:\Documents and Settings\hiroshi\My Documents\Visual Studio 2005\Projects\ExcelWorkbook1\ExcelWorkbook1\Sheet1.cs:行 41
場所 System.Windows.Forms.Control.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
場所 System.Windows.Forms.Button.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

スキルアップ/キャリアアップ(JOB@IT)