如何在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
相关产品推荐
相关产品推荐

