お世話になります。
先日、「引数が構造体のVBAのマクロをVB.NETから呼び出すには?」
http://madia.world.coocan.jp/cgi-bin/vbnet/wwwlng.cgi?print+201210/12100013.txt
において、引数が構造体のVBAのマクロをVB.NETから呼び出す方法について教えていただきましたが、VBA側で引数の構造体のデータを変更しない場合には、この方法でうまくいくのですが、VBA側で引数の構造体のデータを変更する場合には、エラーにはならないのですが、変更した結果がVB.NET側の引数に反映されて来ないようなのです。例えば、下記のコードでは、VBA側の<追加部分A>で値を変更したので、VB.NET側の<追加部分B>で、t_o.xとt_o.yは"DEF"と456になって欲しいのですが、"ABC"と123のままです。どのようにすれば、VBA側で変更した変数や構造体の引数の値を、VB.NET側の引数に反映させることができるのでしょうか。
'---VBA32側----------------------------
Option Explicit
Sub test(ByRef t_o As SampleLibrary.T)
MsgBox t_o.x
MsgBox t_o.y
MsgBox TypeName(t_o)
t_o.x = "DEF" ' <追加部分A>
t_o.y = 456 ' <追加部分A>
End Sub
'---VB.NET側----------------------------
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices
Module Module1
Sub Main()
Dim oExcel As New Excel.Application
Dim oBook As Excel.Workbook
Dim oBooks As Excel.Workbooks = oExcel.Workbooks
Dim strPath As String
Dim t_o As SampleLibrary.T
t_o.x = "ABC"
t_o.y = 123
strPath = "C:\temp\test\Book1.xls"
oExcel.Visible = True
oBook = oBooks.Open(strPath)
oExcel.Run("'" & oBook.Name & "'!TEST", t_o)
MsgBox t_o.x ' <追加部分B>
MsgBox t_o.y ' <追加部分B>
oBook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook)
oBook = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks)
oBooks = Nothing
oExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel)
oExcel = Nothing
End Sub
End Module
'---VB.NET側DLL(プロジェクト名SampleLibrary)---
Imports System.Runtime.InteropServices
Public Structure T
<MarshalAs(UnmanagedType.BStr)> Public x As String
Public y As Integer
End Structure
'-------------------------------
よろしくお願いします。
(WindowsXP,Excel2003_VBA,VisualStudio2010)
ツイート | ![]() |