VBA类实例

时间:2015-12-11 06:01:13

标签: excel vba class excel-vba 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

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

我已经创建了一些显示问题的代码,请观看' rowArray' ' CustomRow_Manager'中的变量类

宏文件 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

模块"模块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

课程模块" 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

课程模块" 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

1 个答案:

答案 0 :(得分:4)

您的问题正在使用

Dim cusR As New CustomRow

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

For循环的每个itteration都使用相同的cusR实例。因此,添加到班级的manager的所有实例都指向相同的cusR

替换此

For Each row In cusRng.Rows
    Dim cusR As New CustomRow

用这个

Dim cusR As CustomRow
For Each row In cusRng.Rows
    Set cusR = New CustomRow

这显式地实例化了类

的新实例