VBA 类实例

zaz*_*aza 3 excel vba class object

我在 VBA 中遇到了一个问题,每次我向该数组添加内容时,数组中的每个项目都会被替换。

我试图遍历给定范围内的行并将其中的每一行转换为自定义类(在下面的示例中名为“CustomRow”)。还有一个管理器类(下面称为“CustomRow_Manager”),它包含一个行数组并具有添加新行的函数。

添加第一行后,它工作正常:https : //drive.google.com/file/d/0B6b_N7sDgjmvTmx4NDN3cmtYeGs/view?usp=sharing

但是,当它循环到第二行时,它会替换第一行的内容并添加第二个条目:https : //drive.google.com/file/d/0B6b_N7sDgjmvNXNLM3FCNUR0VHc/view?usp=sharing

关于如何解决这个问题的任何想法?

我创建了一些显示问题的代码,观察“CustomRow_Manager”类中的“rowArray”变量

宏文件 https://drive.google.com/file/d/0B6b_N7sDgjmvUXYwNG5YdkoySHc/view?usp=sharing

否则代码如下:

数据

    A   B   C
1   X1  X2  X3
2   xx11    xx12    xx13
3   xx21    xx22    xx23
4   xx31    xx32    xx33
Run Code Online (Sandbox Code Playgroud)

模块“模块 1”

Public Sub Start()
Dim cusRng As Range, row As Range
Set cusRng = Range("A1:C4")
Dim manager As New CustomRow_Manager
Dim index As Integer
index = 0
For Each row In cusRng.Rows
    Dim cusR As New CustomRow
    Call cusR.SetData(row, index)
    Call manager.AddRow(cusR)
    index = index + 1
Next row
End Sub
Run Code Online (Sandbox Code Playgroud)

类模块“CustomRow”

Dim iOne As String
Dim itwo As String
Dim ithree As String
Dim irowNum As Integer


Public Property Get One() As String
    One = iOne
End Property
Public Property Let One(Value As String)
    iOne = Value
End Property

Public Property Get Two() As String
    Two = itwo
End Property
Public Property Let Two(Value As String)
    itwo = Value
End Property

Public Property Get Three() As String
    Three = ithree
End Property
Public Property Let Three(Value As String)
    ithree = Value
End Property

Public Property Get RowNum() As Integer
    RowNum = irowNum
End Property
Public Property Let RowNum(Value As Integer)
    irowNum = Value
End Property

Public Function SetData(row As Range, i As Integer)
    One = row.Cells(1, 1).Text
    Two = row.Cells(1, 2).Text
    Three = row.Cells(1, 3).Text
    RowNum = i
End Function
Run Code Online (Sandbox Code Playgroud)

类模块“CustomRow_Manager”

    Dim rowArray(4) As New CustomRow
    Dim totalRow As Integer

    Public Function AddRow(r As CustomRow)
        Set rowArray(totalRow) = r

        If totalRow > 1 Then
            MsgBox rowArray(totalRow).One & rowArray(totalRow - 1).One
        End If
        totalRow = totalRow + 1
    End Function
Run Code Online (Sandbox Code Playgroud)

chr*_*sen 6

您的问题正在使用

Dim cusR As New CustomRow
Run Code Online (Sandbox Code Playgroud)

For循环。这一行实际上只执行一次(请注意,当您按 F8 单步执行代码时,它不会停在该行上)

For循环的每个迭代都使用相同的 cusR 实例。因此,manager添加到类中的所有实例都指向相同的cusR

替换这个

For Each row In cusRng.Rows
    Dim cusR As New CustomRow
Run Code Online (Sandbox Code Playgroud)

有了这个

Dim cusR As CustomRow
For Each row In cusRng.Rows
    Set cusR = New CustomRow
Run Code Online (Sandbox Code Playgroud)

这显式实例化了类的一个新实例