我在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
答案 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
这显式地实例化了类
的新实例