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

时间:2016-12-12 16:59:43

标签: excel vba excel-vba userform

有没有办法更新ListBox子网之外的UserForm上的Userform_Initialize

为什么吗 我正在建立一个二十一点游戏,并使用列表框告诉用户他们拥有哪些卡/经销商。我希望使用一个简单的子(ShowCards)将项目添加到列表框中,但我遇到了问题:

enter image description here

播放按钮调用位于普通模块中的 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

如果您认为自己需要更多代码,请告诉我们。 hand是卡片类的集合,其中.CardName返回3 of Hearts

之类的内容

我读到的所有东西似乎告诉我初始化后userform是静态的,所以我需要在添加新项目后以某种方式刷新它。我试了Userform.Repaint没有运气。

因此,如果没有其他方法,我应该将userHanddealerHand声明为全局变量,更新它们并调用Useform_Initialize以获取更新的值并将其显示给用户?鉴于游戏的性质是可以为两个玩家发出多张牌,因此每次游戏多次重新初始化用户形态似乎不合理。

欢迎所有建议。如果您认为我应该完全采用不同的方式,我仍然希望听到(但对工作表解决方案不感兴趣)

更新#1 为清楚起见,ShowGame由workhet上的按钮调用,然后从Userform上的Play按钮调用PlayBlackjack(userform代码中没有其他内容)

2 个答案:

答案 0 :(得分:3)

您也可以为手使用类,并将类列表框设置为表单列表框,例如,类clsHand

Public colHand As collection
Public lstToUpdate As MSForms.ListBox

Private Sub Class_Initialize()
    Set colHand = New collection
End Sub

Friend Function AddCard(card As clsCard)
    colHand.Add card, CStr(colHand.Count)
    If Not lstToUpdate Is Nothing Then
        lstToUpdate.AddItem card.strCardName
    End If
End Function

它以表格形式使用

Private clsPlayerHand As clsHand

Private Sub UserForm_Initialize()
    Set clsPlayerHand = New clsHand
    Set clsPlayerHand.lstToUpdate = Me.ListBox1
End Sub

Private Sub CommandButton1_Click()
    Dim clsC As New clsCard
    clsC.strCardName = "one"
    clsPlayerHand.AddCard clsC
End Sub

编辑:推荐,

使用卡片的数字和套装名称,然后你可以执行以下操作,比如启用分割按钮,顺便说一句,你要使用一组手然后arrHands(x)......

Public colHand As collection
Public lstToUpdate As MSForms.ListBox
Public cmdSplitButton As MSForms.CommandButton

Private Sub Class_Initialize()
    Set colHand = New collection
End Sub

Friend Function AddCard(card As clsCard)
    colHand.Add card, CStr(colHand.Count)
    If Not lstToUpdate Is Nothing Then
        lstToUpdate.AddItem card.CardName
    End If
    If Not cmdSplitButton Is Nothing Then
        If colHand.Count = 2 Then _
        cmdSplitButton.Enabled = colHand(1).NumericPart = colHand(2).NumericPart
    End If
End Function

考虑使用课程充分发挥潜力,同时观察事件,对某些事情做出反应。

答案 1 :(得分:3)

啊,我明白了。您不能将listBox参数声明为ListBox。后者保留用于Activex控件,而不是VBA控件。将navigationController?.popToRootViewControllerAnimated(true) 子的签名更改为:

ShowCards