VBA扑克手

VBA扑克手,vba,excel,Vba,Excel,我正在尝试编写代码,将生成4个随机扑克手 (来源:) 显然,这些值应该是唯一的。这是我已经尝试过的代码,但是我无法让它工作 Sub poker_is_hard() Dim r As Range Dim c As Variant Dim s As Variant Dim cs As Variant Set r = Workbooks("Poker game.xls").Worksheets("Cards").Range("B2:E6") cs = c & "" & s Fo

我正在尝试编写代码,将生成4个随机扑克手
(来源:)

显然,这些值应该是唯一的。这是我已经尝试过的代码,但是我无法让它工作

Sub poker_is_hard()

Dim r As Range
Dim c As Variant
Dim s As Variant
Dim cs As Variant

Set r = Workbooks("Poker game.xls").Worksheets("Cards").Range("B2:E6")
cs = c & "" & s

For Each cs In r

    c = Int(Math.Rnd * 13) + 1

    'Card's value
    If c = 11 Then
        c = "J"
    ElseIf c = 12 Then
        c = "Q"
    ElseIf c = 13 Then
        c = "K"
    ElseIf c = 1 Then
        c = "A"
    Else
    End If

    'Card's symbol
    s = Int(Math.Rnd * 4) + 1

    If s = 1 Then
        s = ThisWorkbook.Worksheets("Symbols").Range("B1").Value
    ElseIf s = 2 Then
        s = ThisWorkbook.Worksheets("Symbols").Range("B2").Value
    ElseIf s = 3 Then
        s = ThisWorkbook.Worksheets("Symbols").Range("B3").Value
    Else
        s = ThisWorkbook.Worksheets("Symbols").Range("B4").Value
    End If

 Next cs

 End Sub
  • cs
    更改为键入
    Range
    而不是
    Variant
    ,以迭代单元格而不是单元格值

    Dim cs As Range
    
  • 将下面的行移动到循环中,使其针对生成的每张卡运行

    cs = c & "" & s
    
    将其放置在下一个cs之前

  • 顺便说一句,生成卡片的更简单方法可能如下:

    Const SUITS As String = "CDHS"
    Const RANKS As String = "A23456789TJQK"
    
    Dim s As String, r As String
    s = Mid$(SUITS, Int(Math.Rnd *  4) + 1, 1)
    r = Mid$(RANKS, Int(Math.Rnd * 13) + 1, 1)
    
    或者,利用Unicode:

    Dim SUITS As String
    SUITS = ChrW$(9824) & ChrW$(9827) & ChrW$(9829) & ChrW$(9830) ' ♠♣♥♦
    

    这比OP要求的要多,但这里还有一些要看。结果与OP提供的图像类似,手被处理到工作表上从[B2]开始的范围

    我在用电话

    只需运行
    Deal()
    例程:

    Public Sub Deal()
        Const PLAYERS = 6, CARDS = 5
        Dim i&, j&, k&, deck
        CreateAndShuffle deck
        ReDim hands(1 To CARDS, 1 To PLAYERS)
        For i = 1 To CARDS
            For j = 1 To PLAYERS
                k = k + 1
                hands(i, j) = deck(k)
            Next
        Next
        [b2].Resize(CARDS, PLAYERS) = hands
    End Sub
    Private Sub CreateAndShuffle(a)
        Dim i&, j&, k&, p&, suit
        ReDim a(1 To 52)
        suit = Array(ChrW$(9829), ChrW$(9830), ChrW$(9827), ChrW$(9824))
        Randomize
        For i = 1 To 13
            For j = 0 To 3
                k = k + 1
                p = Int((k - 1 + 1) * Rnd + 1)
                If j <> k Then a(k) = a(p)
                a(p) = Mid$("A234567890JQK", i, 1): If i = 10 Then a(p) = 10
                a(p) = a(p) & " " & suit(j)
            Next
        Next
    End Sub
    
    公开子交易()
    常量玩家=6张,卡片=5张
    尺寸i&,j&,k&,甲板
    CreateAndShuffle牌组
    重拨牌(1对牌,1对玩家)
    对于i=1到卡
    对于j=1的玩家
    k=k+1
    手(i,j)=甲板(k)
    下一个
    下一个
    [b2]。调整大小(牌、玩家)=手
    端接头
    私有子创建和随机播放(a)
    尺寸i&,j&,k&,p&,套装
    重拨a(1至52)
    套装=阵列(ChrW$(9829)、ChrW$(9830)、ChrW$(9827)、ChrW$(9824))
    随机化
    对于i=1到13
    对于j=0到3
    k=k+1
    p=Int((k-1+1)*Rnd+1)
    如果j k那么a(k)=a(p)
    a(p)=Mid$(“A234567890JQK”,i,1):如果i=10,则a(p)=10
    a(p)=a(p)&“和”与诉讼(j)
    下一个
    下一个
    端接头
    
    Mid
    中,
    $
    做什么?@BruceWayne-将值视为
    字符串而不是
    变量。这不是必需的,但会阻止转换为
    变量
    并再次转换回
    字符串
    。@BruceWayne
    $
    是Mid()函数的字符串版本。如果未指定,则使用变体版本。字符串版本更快。@BruceWayne-是,因为没有使用
    Mid$()
    进行类型转换。但是,使用
    Mid()
    ,所有字符串参数的类型都转换为
    Variant
    ,返回值的类型从
    Variant
    转换为
    string
    @BruceWayne-几乎每个VBA字符串函数都有一个
    $
    版本。有关示例,请参见。这不是官方文档(也是针对VB6的),但应该足够了。