@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

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

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-04 14:13
#からMacro Module内のpublicメソッドを呼び出して返り値を受け取ることはできますか?

メソッド例

Public Module Module1

Public Static Function Add(ByVal a As Double, ByVal b As Double) As Double
Return a + b
End Function

End Module

End Module
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-04 14:33
引用:

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

#からMacro Module内のpublicメソッドを呼び出して返り値を受け取ることはできますか?


Application.Run メソッドで実現できるでしょう。(戻り値は System.Object)
VSTO とはいえ、Microsoft.Office.Interop.Excel.Application を使うことになると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-04 19:24
回答ありがとうございます。
色々試しましたがC#側からマクロのModule1.Addにたどり着く方法が分かりませんでした。

C#側
// 色々やったうちの一つ
Excel.Application app;
int ans = (int)app.Run(this.Application.Modules["Module1"].Add(1, 2));

マクロ側
Public Module Module1
Public Function Add(ByVal a As Double, ByVal b As Double) As Double
Return a + b
End Function
End Module
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 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 のインスタンスが生成されていないようですが...

それと、Run メソッドにわけのわからないものを渡していますね。
引数が何を示すのか、調べた方が良いでしょう。

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

Application.Runの説明を読みましたが、引数の指定方法が理解できませんでした。

ExcelのModuleに含まれるメソッド(サンプルではModule1.Add())を呼び出したいのですが、
Application.RunからModule1.Addを実行するにはどうすれば良いのでしょうか?
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-05 10:16
引用:

ひろしさんの書き込み (2006-10-05 09:53) より:

Application.Runの説明を読みましたが、引数の指定方法が理解できませんでした。
ExcelのModuleに含まれるメソッド(サンプルではModule1.Add())を呼び出したいのですが、
Application.RunからModule1.Addを実行するにはどうすれば良いのでしょうか?


モジュール内の関数であれば、関数名を文字列で渡すだけです。
残りの引数は、その関数に渡すべき引数を示します。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2006-10-05 19:20
Application.Run以前にそもそもC#からModule1が見えていない状態です。
C#から参照するマクロを作成したいのですが、作成の仕方が間違っているのでしょうか?
GlobalsからはSheetNは見えますが、Module1は見えません。
Application.Run(Module1.Add,1.23,4.56)とやってもModule1が存在しないエラーが出ます。
よろしくお願いします。

-------------------------------
マクロの作成手順

VS2005IDEのSheet1上でマクロの自動記録で空のMacro1を作成する。
Funciton Addを追加する。

マクロエクスプローラで、マクロ→MyMacros→Module1が見えている状態になる。

以下Module1の内容

Option Explicit On
Option Strict On
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module Module1
Public Function Add(ByVal a As Double, ByVal b As Double) As Double
Add = a + b
End Function
End Module
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-10-05 19:30
引用:

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

Application.Run以前にそもそもC#からModule1が見えていない状態です。


C# から見える見えないの問題ではないと思います。

引用:

C#から参照するマクロを作成したいのですが、作成の仕方が間違っているのでしょうか?


"参照" ではなく、実行して戻り値を得たいというご質問だったと思います。

引用:

GlobalsからはSheetNは見えますが、Module1は見えません。
Application.Run(Module1.Add,1.23,4.56)とやってもModule1が存在しないエラーが出ます。


伝わっていないようですので、同じことを書かせて頂きます。

> モジュール内の関数であれば、関数名を文字列で渡すだけです。
> 残りの引数は、その関数に渡すべき引数を示します。

ちなみに、調べるというプロセスを踏むならば、過去ログに '解答' があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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