任何人都可以向我解释以下代码行为吗? -->
Public Type User
firstName As String
lastName As String
End Type
Sub test()
Dim userList(1) As User
Dim user1 As User
user1.firstName = "Tom"
user1.lastName = "Hanks"
userList(0) = user1
Debug.Print "0 userList(0).firstName=" & userList(0).firstName & " userList(0).lastName=" & userList(0).lastName
user1.lastName = "Cruise"
Debug.Print "1 userList(0).firstName=" & userList(0).firstName & " userList(0).lastName=" & userList(0).lastName
End Sub
控制台显示:
0 userList(0).firstName=Tom userList(0).lastName=Hanks
1 userList(0).firstName=Tom userList(0).lastName=Hanks
所以我的问题是:为什么控制台不显示
1 userList(0).firstName=Tom userList(0).lastName=Cruise
?
看起来如果 vba 插入了我想要插入的对象的副本,而不是原始对象。
感谢您的回答。
这个问题刚刚发生,我没有成功解决它,但如果我不能,我可能会更改我的代码,以便在插入数组之前完成对象的所有初始化,但这不是很干净恕我直言。
cUser
) 通常保存在集合 (users
) 中,但您也可以使用数组(rCount
是(数据)行(对象,user
)的数量)。 类模块例如
Class1
:在“属性”窗口中重命名为 cUser
(F4)!!!
Option Explicit
Public ID As Long
Public FirstName As String
Public LastName As String
标准模块
Module1
Option Explicit
Sub Test()
' Reference the workbook.
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
' Reference the worksheet.
Dim ws As Worksheet: Set ws = wb.Sheets("Sheet1")
' Reference the data range (no headers).
Dim rg As Range, rCount As Long
With ws.Range("A1").CurrentRegion
rCount = .Rows.Count - 1
If rCount = 0 Then Exit Sub ' no data
Set rg = .Resize(rCount).Offset(1) ' exclude headers
End With
' Create a new collection that will hold all 'cUser' objects.
Dim users As Collection: Set users = New Collection
' Loop through the rows of the range...
Dim user As cUser, r As Long
For r = 1 To rCount
' Create a new 'user' object.
Set user = New cUser
' Populate the 'user'.
user.ID = rg.Cells(r, 1).Value
user.FirstName = rg.Cells(r, 2).Value
user.LastName = rg.Cells(r, 3).Value
' Add to the 'users' collection.
users.Add user
Next r
' Loop through all the elements (users) in the users collection
' and return user's properties in the Immediate window (Ctrl+G).
For Each user In users
Debug.Print user.ID & ". " & user.FirstName & " " & user.LastName
Next user
End Sub
立即窗口中的结果
1. Tom Hanks
2. Jack Nicholson
3. Michael J. Fox
4. Robert De Niro