gpt4 book ai didi

vb.net - 在 VB.net 中创建 VBA 类

转载 作者:行者123 更新时间:2023-12-02 05:45:32 25 4
gpt4 key购买 nike

是否可以(使用 COM 和 regasm.exe)让 vba 函数调用 vb.net 函数 - 它在 vb.net 中创建类,然后将类传递回 vba,在 vba 中将其识别为 vba类?

在 VBA 中,我可以使用“插入”>“类模块”来处理类。我已经设置了一个创建类的函数。

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

我可以使用以下方法将变体/对象/矩形拉入 vba:

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

但是该对象没有高度或长度变量。 (监 window 口上显示“无变量”)

编辑:

根据 Mat's Mug 的回答修改了代码:

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

最佳答案

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

您的Rectangle类有私有(private)字段。私有(private)字段是,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 代码能够更改 Length,则公开属性 getter 和 setter和Height Rectangle 的属性实例。

关于vb.net - 在 VB.net 中创建 VBA 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30339887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com