You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VBA中通过循环遍历clsPlayerPicks类的Game系列属性?

如何循环遍历clsPlayerPicks类的Game属性并赋值?

你的问题核心是VBA里没法直接通过字符串拼接的属性名(比如"Game"&GameNum)来访问类的自定义属性,原来用Picks.Controls("Game" & GameNum)的思路不对——Controls是表单控件的集合,类模块里的自定义属性根本不在这个集合里。这里给你两种解决方案,一种是适配现有类的快速修改,另一种是更规范的长期优化方案:


方案1:用CallByName函数快速实现动态赋值

VBA提供了CallByName函数,可以通过字符串名称来调用对象的属性或方法,刚好能解决你动态访问Game1到Game16的需求。

只需要把你代码里的赋值语句替换成下面这行:

For Week = 1 To 18
    For GameNum = 1 To 16
        ' CallByName参数说明:对象、属性名、操作类型(vbLet表示赋值)、要赋的值
        CallByName Picks, "Game" & GameNum, vbLet, Sheet6.Cells(Week + x, GameNum + 1)
    Next GameNum
Next Week

这样就能循环给Picks.Game1到Picks.Game16逐一赋值了,不需要修改你的clsPlayerPicks类。


方案2:重构类设计(更推荐,长期维护更方便)

如果以后Game数量可能变化,或者你希望代码更清晰,建议把clsPlayerPicks里的16个单独Game属性改成一个集合或数组,这样遍历起来更直观,也不用写一堆重复的属性定义。

第一步:修改clsPlayerPicks类

把原来的Game1到Game16全部删掉,换成一个集合,并添加初始化逻辑:

Public Name As String
Public Games As Collection ' 用集合存储所有Game结果
Public MNS As Long

' 类初始化时自动创建集合并添加16个空元素
Private Sub Class_Initialize()
    Set Games = New Collection
    Dim i As Long
    For i = 1 To 16
        ' 添加空字符串,可选加Key方便按名称索引
        Games.Add vbNullString, Key:="Game" & i
    Next i
End Sub

' 可选:封装一个设置Game的方法,更安全(避免越界)
Public Sub SetGame(GameNum As Long, Value As String)
    If GameNum >= 1 And GameNum <= 16 Then
        Games(GameNum) = Value
        ' 也可以用Key索引:Games("Game" & GameNum) = Value
    End If
End Sub

第二步:修改GetPlayerRanking过程里的赋值逻辑

现在直接遍历集合索引就行,代码更简洁:

For Week = 1 To 18
    For GameNum = 1 To 16
        ' 方法1:直接通过集合索引赋值
        Picks.Games(GameNum) = Sheet6.Cells(Week + x, GameNum + 1)
        ' 方法2:用封装好的SetGame方法(更安全)
        ' Picks.SetGame GameNum, Sheet6.Cells(Week + x, GameNum + 1)
    Next GameNum
Next Week

这种方式的好处是:以后如果Game数量变成20个,只需要修改类初始化循环的数字(把16改成20),不用再添加一堆Game17、Game18之类的属性,代码扩展性更强。


内容的提问来源于stack exchange,提问作者Matthew Valenzuela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:02:38