奇怪的行为:如何在 vba 数组中插入元素?

问题描述 投票:0回答:1

任何人都可以向我解释以下代码行为吗? -->

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 插入了我想要插入的对象的副本,而不是原始对象。

感谢您的回答。

这个问题刚刚发生,我没有成功解决它,但如果我不能,我可能会更改我的代码,以便在插入数组之前完成对象的所有初始化,但这不是很干净恕我直言。

arrays vba reference
1个回答
0
投票

类的简单用法

  • 这只是一个简单的例子,在我看来,你想做的事情。它几乎只是“触及表面”。
  • 对象 (
    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
© www.soinside.com 2019 - 2024. All rights reserved.