【问题标题】:Working with Array As New Object does not work使用数组作为新对象不起作用
【发布时间】:2019-06-06 03:46:25
【问题描述】:

我的 VBA 代码出了问题。我用属性创建了一个名为“clsColl”的类模块。当我将变量声明为“clsColl”时一切正常,但是当我将数组声明为“clsColl”时出现错误 “对象变量或未设置块变量”,如果我在另一个子程序中使用这个数组,我在第一个子程序中调用了它。

我做了一个简短的例子,里面的代码很麻烦。

首先是我的班级模块“clsColl”

Option Explicit

Public name As String

Public weight as single

现在可以运行的代码

Sub workingA()

Dim persona As New clsColl

Call workingB(persona)

End Sub

Sub workingB(persona As cls Coll)

persona.name = "phil"

persona.weight = 100

End Sub

现在代码不起作用

Sub failingA()

Dim persona() As New clsColl

ReDim persona(1 to 5)


Call failingB(persona)

End Sub

Sub failingB(persona() As cls Coll)



persona(1).name = "phil"

persona(1).weight = 100
End Sub

我得到一个错误,只是将我的代码从使用变量更改为使用数组。

现在我在第二个代码中收到错误对象变量或未设置块变量”,但我不知道为什么。我想知道为什么使用数组作为对象会造成这样的麻烦,而使用普通变量工作正常。

【问题讨论】:

    标签: arrays excel vba class module


    【解决方案1】:

    数组中没有任何内容需要用类填充数组。您的 Dim 不会使用 new 关键字,您将创建新类并将它们添加到数组中。

    Sub test1()
    
    Dim d As New clsDimension
    
    Dim arrDimensions(5) As clsDimension
    
    Set arrDimensions(0) = d
    
    arrDimensions(0).Breadth = 100
    arrDimensions(0).Depth = 200
    
    End Sub
    

    或以与您的帖子类似的方式

    数组的一个类,像这样,clsDimensionArray

    Private arrDimensions() As clsDimension
    
    Public Property Get ArrItems(x As Long) As clsDimension
        Set ArrItems = arrDimensions(x)
    End Property
    
    Public Sub Create(lngSize As Long)
    
    Dim l As Long
    Dim d As clsDimension
    
    ReDim arrDimensions(lngSize - 1)
    
    For l = 0 To UBound(arrDimensions)
        Set d = New clsDimension
        Set arrDimensions(l) = d
        Set d = Nothing
    Next l
    
    End Sub
    

    并像这样使用

    Sub test1()
    
    Dim arrDimensions As New clsDimensionArray
    
    arrDimensions.Create (100)
    
    arrDimensions.ArrItems(90).Depth = 50
    arrDimensions.ArrItems(90).Breadth = 100
    
    End Sub
    

    保持整洁:o)

    【讨论】:

    • 感谢您的帮助,对我帮助很大
    【解决方案2】:

    你的代码行

    Dim persona As New clsColl
    

    的组合
    Dim persona As clsColl
    If persona Is Nothing Then Set persona = New clsColl
    

    至少在我看来,使用这种组合语法是不好的做法。

    现在对于数组,这不能再工作了,因为每个数组项必须首先是 Set 才能成为 clsColl 对象:

    Sub notMorefailingA()
     Dim persona() As clsColl
     Dim i As Integer
     ReDim persona(1 To 5)
     For i = 1 To 5
      Set persona(i) = New clsColl
     Next
     Call notMorefailingB(persona)
    End Sub
    
    Sub notMorefailingB(persona() As clsColl)
     persona(1).name = "phil"
     persona(1).weight = 100
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2020-12-19
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多