Cal*_*mDA 5 excel vba userform
有什么方法可以更新子系统外部的ListBoxa吗?UserFormUserform_Initialize
为什么?
我正在构建一个二十一点游戏,并使用列表框告诉用户他们/庄家拥有哪些牌。我希望使用一个简单的 sub ( ShowCards) 将项目添加到列表框中,但我遇到了问题:
Play按钮调用位于普通模块中的PlayBlackjack子组件
Option Explicit
Dim cards As New Collection
Sub ShowGame()
UFDisplay.Show
End Sub
Sub PlayBlackjack()
'fill the cards collection with 5 shuffled decks
PrepareCards
Dim i As Integer
Dim userHand As New Collection
Dim dealerHand As New Collection
'deal cards (removing the dealt cards from the cards collection)
For i = 1 To 2
DealCard cards, userHand
DealCard cards, dealerHand
Next i
ShowCards userHand, UFDisplay.UserHandList <-- ERROR HERE (Type mismatch)
'more code to follow
End Sub
Private Sub ShowCards(hand As Collection, list As ListBox)
Dim i As Integer
For i = 1 To hand.Count
list.AddItem hand(i).CardName
Next i
End Sub
Run Code Online (Sandbox Code Playgroud)
如果您认为需要更多代码,请告诉我。hand是卡片类的集合,其中.CardName返回类似的内容3 of Hearts
我读到的所有内容似乎都告诉我,用户表单在初始化后是静态的,因此在添加新项目后我需要以某种方式刷新它。我尝试过Userform.Repaint但没有运气。
因此,如果确实没有其他方法,我是否应该将userHand和声明dealerHand为全局变量,更新它们并调用Useform_Initialize以获取更新的值并将其显示给用户?考虑到游戏的性质是可以为两个玩家发多张牌,因此每次游戏多次重新初始化用户表单似乎并不明智。
欢迎所有建议。如果您认为我应该完全不同地完成它,我仍然很乐意听到(但对工作表解决方案不太感兴趣)
更新 #1 为清楚起见,ShowGame 通过工作表上的按钮调用,然后从用户窗体上的 Play 按钮调用 PlayBlackjack(用户窗体代码中没有其他内容)
啊,我明白了。您不能将 listBox 参数声明为 ListBox。后者是为 Activex 控件保留的,而不是为 VBA 控件保留的。将您的ShowCards子签名更改为:
Private Sub ShowCards(hand As Collection, list As Control) '<~~ or MSForms.ListBox, or simply as Object...
Run Code Online (Sandbox Code Playgroud)