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)
您的问题正在使用
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)
这显式实例化了类的一个新实例