1

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

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

4

3 回答 3

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根据您的要求返回一个对象。

  • Factory : 创建一个新的预定义对象
  • Builder : 创建一个在 builder 中配置的新对象
  • Provider:返回之前预定义的现有对象
于 2013-10-18T11:25:55.707 回答
1

我不相信您可以在这种情况下使用 Me - 您正在尝试使用在 VB6 中使用的 Me(相当于 C# 中的“this”)。这在 VBA 中是不合适的。

如果没有一些代码片段,很难看到你在做什么。您可以在模块中执行搜索并在那里创建此类的实例吗?然后你可以这样做:

Set class2 = objectArrayofClass1(index)
于 2013-10-18T04:14:52.457 回答
1

正如你已经看到的,我无法改变。您可以通过公共模块中的函数(如 basExternal)处理记忆对象:

Public Function loadFromArrayByIndex(ByVal lIndex)
  dim xobj as Object

  Set xobj = vocabArray(lIndex)

  '
  ' do modifications and handling on this object:
  ' ...
  '

End Function

.

于 2013-10-18T10:22:19.323 回答