|
■No80956 (masa さん) に返信 > 環境:OS:Windows Vista SP2 32bit、Excel2003,VB2008 .Net4.0
VB2008 は、CLR2(.NET 2.0〜3.5x)向けの開発ツールであり、 .NET 4 向けのコンパイルはできないと思いますよ。
■No80961 (masa さん) に返信 > MethodInfo.Invokeについては、使ったことがないので今後、調査してみます。
No80944 の MethodInfo 処理を、VB2008 でも動くように書きなおしてみました。
やっていることは、指定された引数の数によらず、常に引数 31 個の xlApp.Run(macro, args(0), args(1),…,args(29)) を固定的に呼び出し、足りない引数を Missing で補完するというものです。
Public Sub VBARun(ByVal bookName As String, ByVal macroName As String, ByVal ParamArray args() As Object) Dim macro As String = String.Format("'{0}'!{1}", bookName, macroName)
' この書き方なら、VB2005 でも動く Dim p(30) As Object p(0) = macro For i As Integer = 1 To Math.Min(30, args.Length) p(i) = args(i - 1) Next For i As Integer = args.Length + 1 To 30 p(i) = Type.Missing Next
'' 2008 以降なら、上記を下記のように書ける 'Dim p() As Object = New Object() {macro} 'p = p.Concat(args).Concat(Enumerable.Repeat(Type.Missing, 30)).Take(31).ToArray()
'' No80944 で書いた System.Reflection.MethodInfo 経由で呼び出す方法 'Dim mi As System.Reflection.MethodInfo = Me.xlApp.GetType().GetMethod("Run") 'If Not mi Is Nothing Then ' mi.Invoke(Me.xlApp, p) 'End If
'' でも今回は、MethodInfo を使わない方が素直かも Me.xlApp.Run( macro, _ p(1) , p(2) , p(3) , p(4) , p(5) , _ p(6) , p(7) , p(8) , p(9) , p(10), _ p(11), p(12), p(13), p(14), p(15), _ p(16), p(17), p(18), p(19), p(20), _ p(21), p(22), p(23), p(24), p(25), _ p(26), p(27), p(28), p(29), p(30) ) End Sub
ちなみに本来の Run は、ParamArray では無く Optional なので、 Sub VBARun についても、最初から Optional で宣言しておけば、 上記のように Missing を補完する必要が無くなります。 (それはそれで冗長的ですが)
また、Excel 2003 だけでなく、Excel 97 や Excel 5.0 でも Run メソッドの引数は 31 個固定となので、上記は Excel のバージョンを問わず有効です。 (Excel バージョンによっては、LCIDConversionAttribute 付きの Run もあります)
|