如何在Visual Basic for Excel中将当前对象(Me)设置为存储在数组中的新对象

时间:2013-10-18 03:56:25

标签: vba object excel-vba excel

我在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对象的全局数组。

如果无法从内部设置对象,我可以尝试其他方法。这是最简单,最直接的方法。我确信我可以将当​​前对象中的每个参数设置为数组中对象的参数值,但如果可以执行上述操作,则可能是我首选的方法。

3 个答案:

答案 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) FactoryBuilderProvider,在您要求时返回一个对象。

  • 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