2015-05-20 40 views
4

是否有可能(使用COM和regasm.exe)使vba函数调用vb.net函数 - 它在vb.net中创建类,然后将该类传回vba,它被认为是一个vba类?在VB.net中创建VBA类

在VBA中,我可以使用Insert> Class Module来处理类。我已经创建了一个创建类的函数。

Private length As Double 
Private height As Double 
Public Sub init(ByRef hgt As Double) 
    height = hgt 
    length = dbl_height() 
End Sub 

Public Function dbl_height() 
    dbl_height = height * 2 
End Function 

我可以相应地使用此功能初始化:

Public Function CreateClassFunction(foo As Integer) 
    Dim my_rect As Rectangle 
    Set my_rect = New Rectangle 
    my_rect.init (foo) 
    Set CreateClassFunction = my_rect 
End Function 

我也可以做同样的事情在vb.net用几乎相同的代码。

Public Class Rectangle 
    Private length As Double 
    Private height As Double 
    Public Sub init(ByRef hgt As Double) 
    height = hgt 
    length = dbl_height() 
    End Sub 

    Public Function dbl_height() 
    dbl_height = height * 2 
    End Function 
End Class 

其中该vb.net函数创建类:

Public Function CreateClassFunction(foo As Integer) As Rectangle 
    Dim my_rect As Rectangle 
    my_rect = New Rectangle 
    my_rect.init(foo) 
    CreateClassFunction = my_rect 
End Function 

我可以在Variant /对象/矩形采用拉进VBA:

Function MyCreateClass(a As Double) 
    Dim classLib As New MyAnalytics.Class1 
    Set MyCreateClass = classLib.CreateClassFunction(a) 
End Function 

但是此对象不有高度或长度变量。 (报告说,监视窗口上的 “不变量”)

编辑:

每垫的马克杯答案

修正代码:

Public Class Rectangle 
Private plength As Double 
Private pheight As Double 
Public Property length() As Double 
    Get 
     Return plength 
    End Get 
    Set(ByVal value As Double) 
     plength = value 
    End Set 
End Property 

Public Property height() As Double 
    Get 
     Return pheight 
    End Get 
    Set(ByVal value As Double) 
     pheight = value 
    End Set 
End Property 

Public Sub init(ByRef hgt As Double) 
    height = hgt 
    length = dbl_height() 
End Sub 

Public Function dbl_height() 
    dbl_height = height * 2 
End Function 

End Class 

和测试VBA:

Function MyCreateClass(a As Double) 
    Dim classLib As New MyAnalytics.Class1 

    Set MyCreateClass = classLib.CreateClassFunction(a) 

    Debug.Print MyCreateClass.Height() 
    Debug.Print MyCreateClass.length() 

    MyCreateClass.Height = 30 
    MyCreateClass.length = 20 

    Debug.Print MyCreateClass.Height() 
    Debug.Print MyCreateClass.length() 

    MyCreateClass.init (100) 
    Debug.Print MyCreateClass.Height() 
    Debug.Print MyCreateClass.length() 


End Function 
+0

“长度”和“高度”属性是私人的,因此它们不会暴露在课程之外。 – OneFineDay

+1

他们不是属性,他们是领域。不要公开领域。永远。 –

回答

2

它将不会被识别为VBA类 - 它的不是一个VBA类,而是一个COM对象。

您的Rectangle班有私人领域。私人领域是,Private。这大致就是VBA所看到的:

Public Class Rectangle 
    Sub init(ByRef hgt As Double)  
    Function dbl_height() 
End Class 

这些字段在哪里?

Private length As Double 
Private height As Double 

你没有暴露他们 - 就VBA而言,他们不存在。

现在,你可以让他们Public - 但你会打破封装暴露领域; 不要那样做!

揭露属性获取,而是和制定者,如果你想VBA代码能够改变一个Rectangle实例的LengthHeight性能。

+0

谢谢你@垫杯。在调试时是否可以在Watches窗口中看到属性?它们可以在代码和即时窗口中访问。 –