Vba 类获取函数错误ByRef

Vba 类获取函数错误ByRef,vba,excel,class,get,Vba,Excel,Class,Get,我有一个名为cCavity的自定义类。该类的许多属性之一是名为padjacenty的字符串数组,它包含每个索引处节点的字符串名称(格式为C[#of node])。我正试图通过使用两个节点名称来创建边名称。每当我试图为类对象调用邻接GET函数时,就会出现ByRef参数类型不匹配的情况,我看不出原因 类获取函数: Public Property Get Adjacency(Index As Integer) As String Adjacency = pAdjacency(Index) En

我有一个名为
cCavity
的自定义类。该类的许多属性之一是名为
padjacenty
的字符串数组,它包含每个索引处节点的字符串名称(格式为C[#of node])。我正试图通过使用两个节点名称来创建边名称。每当我试图为类对象调用邻接
GET
函数时,就会出现ByRef参数类型不匹配的情况,我看不出原因

类获取函数:

Public Property Get Adjacency(Index As Integer) As String
    Adjacency = pAdjacency(Index)
End Property
获取错误的代码部分:

Sub CalculateEdges(cCavities() As cCavity, dEdges As Scripting.Dictionary)
    'Dim i as integer
    For i = 1 To UBound(cCavities)
        If cCavities(i).AdjacencySize > MaxEdges Then MaxEdges = cCavities(i).AdjacencySize
        'Dim j as Integer
        For j = 1 To cCavities(i).AdjacencySize
            dEdges.Add cCavities(i).Name & cCavities(i).Adjacency(j), 0 ' The error is taking place here, with the .Adjacency(j)
        Next j
    Next i
End Sub
问题中的错误是:“编译错误:ByRef参数类型不匹配”


我错过了什么明显的东西吗?参数j应该是一个整数,我在试图弄清楚发生了什么时,已经尝试显式地将其定义为整数。

这是一个编译错误,而不是运行时错误。如果j是一个变量(如果它没有显式声明的话),编译器将不会允许它通过。用正确的类型声明所有变量


编辑:出于某种原因,编译器只在运行时抱怨这一点,但这仍然是一个编译错误。

这是一个编译错误,而不是运行时错误。如果j是一个变量(如果它没有显式声明的话),编译器将不会允许它通过。用正确的类型声明所有变量


Edit:出于某种原因,编译器只在运行时抱怨这一点,但这仍然是一个编译错误。

首先指定
选项Explicit
并声明所有变量,然后在有意义的地方设置参数
ByVal
:对象指针和值可以通过值传递,数组必须通过
ByRef
传递

因此,从这个开始:

Public Property Get Adjacency(ByVal Index As Long) As String
    Adjacency = pAdjacency(Index)
End Property
现在,这个4行代码片段将取消引用
cCavities(i)
5次。您是否考虑过引入一个局部变量,并取消对对象的引用一次


现在,这项作业有效吗?如果是这样,恭喜,您现在在
cCavity
成员调用上有了IntelliSense和更高效的代码。

首先指定
选项Explicit
并声明所有变量,然后在有意义的地方设置参数
ByVal
:对象指针和值可以按值传递,数组必须通过
ByRef
传递

因此,从这个开始:

Public Property Get Adjacency(ByVal Index As Long) As String
    Adjacency = pAdjacency(Index)
End Property
现在,这个4行代码片段将取消引用
cCavities(i)
5次。您是否考虑过引入一个局部变量,并取消对对象的引用一次



现在,这项作业有效吗?如果是这样,恭喜,您现在在
ccavivity
成员调用上有了IntelliSense,还有更高效的代码。

在模块顶部指定
选项Explicit
,并用显式类型声明所有标识符。删除它们“使代码文本变短”是完全荒谬的。此外,代码失败的具体位置,错误号和确切措辞是什么?不,我从我放在网站上的代码块中删除了它,使其变短。它目前在我的源代码中被注释掉了,因为我正在尝试各种方法让它工作。因为在发布时它没有被取消注释,所以我没有包含它。@Excelosaurus我将在原始帖子的行中添加一条注释,在下面的文本中添加一个错误号。什么类型是
cCavity.AdjacencySize
?在模块顶部指定
选项Explicit
,并用显式类型声明所有标识符。删除它们“使代码文本变短”是完全荒谬的。此外,代码失败的具体位置,错误号和确切措辞是什么?不,我从我放在网站上的代码块中删除了它,使其变短。它目前在我的源代码中被注释掉了,因为我正在尝试各种方法让它工作。因为它在发布时没有被取消注释,所以我没有将它包括在内。@Excelosaurus我将在原始帖子的行中添加一条注释,在下面的文本中添加一个错误号。什么类型是
cCavity.AdjacencySize
?这也是我的想法,这就是为什么我一开始明确声明它是一个整数。我只是在这段代码的特定快照中注释掉了它,因为在我决定发表文章时,我就是这样做的。根据@Mat的马克杯回答,是ByVal起了作用。默认情况下,VBA的参数由ref传递。我习惯于键入ByVal,以至于我没有注意到。这也是我的想法,这就是为什么我一开始显式声明它为整数。我只是在这段代码的特定快照中注释掉了它,因为在我决定发表文章时,我就是这样做的。根据@Mat的马克杯回答,是ByVal起了作用。默认情况下,VBA的参数由ref传递。我习惯于键入ByVal,我没有注意到。我意识到我有另一个错误,自从修复后,代码中后来发生了这个错误(另一个部分被注释掉了,没有包括在内),我对dim j的注释就是这个特殊情况下的错误。当我发布问题时,我把这两个不同的错误误认为是同一个错误,但后来我意识到了我的错误。删除显式声明从来都不是一个很好的解决办法。我只是在尝试当时想到的任何东西。我不知道还有什么好说的。@Mat'smugg是否有一个将参数传递给
属性Get Foo
,并且仍然拥有
属性Let Foo
?@JustinCoplin FWIW如果您对其检查结果使用并应用了修复,您就不会出现该错误;-)我已经意识到,我有另一个错误,自从修复之后,这在代码的后面发生了(另一个部分被注释掉了,没有包括在内),我对dim j的注释就是这个特殊情况下的错误。当我发布问题时,我把这两个不同的错误误认为是同一个错误,但后来我意识到了我的错误。删除