用户表单初始化后更新用户表单列表框

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(用户窗体代码中没有其他内容)

A.S*_*S.H 4

啊,我明白了。您不能将 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)