VBA側で引数を変更するVBAマクロをVB.NETから呼び出す方法


yy  2012-11-16 00:36:00  No: 147978

お世話になります。

先日、「引数が構造体の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)


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加