我在excel vba项目中有一组对象。我创建了同一个类的另一个实例并设置了它的1个属性。然后我尝试搜索对象数组,以找到数组中与同一属性上的当前对象匹配的对象。我想使用自引用Me将当前对象设置为当前对象的一个方法中的数组。
我试过了:
Set Me = objectArray(index)
这不起作用。它说这是对Me关键字的不当使用。有没有办法将当前对象设置为同一类型的另一个对象?谢谢!
编辑:
我有一个包含子对象的对象:
Me.friShift.shiftType.loadFromArray
这里,shiftType是CVocabulary类型的对象,它是我自定义的类。它有一个名为loadFromArray的子,如下所示:
Public Sub loadFromArray()
Dim index As Integer
index = searchVocabArray(Me.typed)
If (index = -1) Then
Exit Sub
End If
Set Me = vocabArray(index)
End Sub
vocabArray()是一个包含CVocabulary对象的全局数组。
如果无法从内部设置对象,我可以尝试其他方法。这是最简单,最直接的方法。我确信我可以将当前对象中的每个参数设置为数组中对象的参数值,但如果可以执行上述操作,则可能是我首选的方法。
答案 0 :(得分:2)
您可以通过将该功能作为参数来实现。我将在VBScript中显示它,因为类更清晰,但概念与VBA中的概念相同:
public myObject
set myObject = new x
myObject.ChangeMe MyObject
msgbox typename(myObject) ' <- outputs 'y'
class x
public sub changeMe(byref object)
set object = new y
end sub
end class
class y
' just an empty class
end class
但这不是一个好的编程模式,可能会导致代码混乱(维护和调试会出现问题)甚至内存泄漏。您应该创建一个(Abstract) Factory
,Builder
或Provider
,在您要求时返回一个对象。
答案 1 :(得分:1)
我不相信你可以在这种情况下使用我 - 你试图使用我在VB6中使用的(在C#中相当于'this')。这在VBA中是不合适的。
如果没有一些代码片段,很难看到你在做什么。您可以在模块中执行搜索并在那里创建此类的实例吗?然后你可以这样做:
Set class2 = objectArrayofClass1(index)
答案 2 :(得分:1)
正如你已经看到的那样,我无法改变。你可以通过处理记忆的对象 公共模块中的函数,如basExternal:
Public Function loadFromArrayByIndex(ByVal lIndex)
dim xobj as Object
Set xobj = vocabArray(lIndex)
'
' do modifications and handling on this object:
' ...
'
End Function