检查数组VBA的值

时间:2015-08-17 21:13:17

标签: arrays excel vba excel-vba

我试图确保我构建的阵列具有我期待的值。

Cards数组应该填充Shoe数组。

当我计算数组的值时,我得到预期的104,但是当我将值粘贴到Excel工作表中时,只填充了13个单元格。

有没有简单的方法来检查数组的内容?

Sub CreateShoe()

Dim decks As Integer
decks = 2


Dim Cards As Variant
Dim shoe As Variant
Dim cnt As Integer


Cards = Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, "A")
ReDim shoe(1 To 52 * decks)

cnt = 1

For i = LBound(Cards) To UBound(Cards)
shoe(cnt) = Cards(i)
cnt = cnt + 1
Next i

Range("A1:A99") = WorksheetFunction.Transpose(shoe)

End Sub

3 个答案:

答案 0 :(得分:3)

您可以使用Join

Sub test()
    Dim Directions As Variant
    Directions = Array("North", "South", "East", "West")
    Debug.Print Join(Directions, ", ")
End Sub

打印

North, South, East, West
立即窗口中的

。此外,如果您使用调试器逐步执行代码,那么在Locals窗口中,您可以展开数组的名称并检查各个元素。

编辑:扩展最后一点。如果在VBA编辑器中选择View -> Locals Window并在将shoe发送到工作表的代码行之前设置断点(通过单击行的左侧),您应该看到如下内容:< / p>

enter image description here

如果您运行sub,它将进入中断模式,如下所示:

enter image description here

然后,如果您展开shoe,您会看到:

enter image description here

这足以表明您没有在索引13之后初始化shoe。其他人已经发布了显示错误来源的答案 - 但它确实是一项重要技能能够像你提出的问题一样检查一个数组的值。

关于修改 Join对于既不是Variant也不是String的数组效果不佳。如果你有一个声明为例如

Dim Directions(1 to 4) as Integer

您可以先通过以下功能运行它:

Function ToVariant(v As Variant) As Variant
    Dim temp As Variant
    Dim i As Long
    ReDim temp(LBound(v) To UBound(v))
    For i = LBound(v) To UBound(v)
        temp(i) = v(i)
    Next i
   ToVariant = temp
End Function

然后Join(ToVariant(Directions), ", ")将按预期工作。

答案 1 :(得分:1)

您只在此填充前13个值:

For i = LBound(Cards) To UBound(Cards)
shoe(cnt) = Cards(i)
cnt = cnt + 1
Next i

您需要循环8次以获得104

你想做什么?用104张卡(每张8张)填充鞋子?如果是这样,我会使用split / join方法。如果您需要,很高兴为此发布一些代码。我的想法是在一个循环上构建一个字符串,根据需要多次附加已连接的卡片阵列(在这种情况下为8),然后将其拆分为鞋子。

答案 2 :(得分:0)

您通过丢弃套装来均匀化牌,但仍然需要将它们添加到圈中以获得每张套牌的正确牌数。

Sub CreateShoe()

    Dim Cards As Variant, suits As Variant, shoe As Variant
    Dim decks As Long, i As Long, d As Long, s As Long

    decks = 2
    suits = Array("H", "D", "S", "C")
    Cards = Array(2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A")
    ReDim shoe(1 To (52 * decks))

    For d = 1 To decks
        For s = LBound(suits) To UBound(suits)
            For i = LBound(Cards) To UBound(Cards)
                shoe(1 + i + (s * (UBound(Cards) + 1)) + ((d - 1) * 52)) = Cards(i)
                'optionally include the suit
                'shoe(1 + i + (s * (UBound(Cards) + 1)) + ((d - 1) * 52)) = Cards(i) & suits(s)
            Next i
        Next s
    Next d

    Range("A1").Resize(UBound(shoe), 1) = WorksheetFunction.Transpose(shoe)

End Sub

我已经加入了一个可选的代码行,其中包含每张卡的正在生成的套装。最好将其包含在调试目的中,直到您的鞋子生成正确,然后在运行后丢弃该套装。