我试图确保我构建的阵列具有我期待的值。
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
答案 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>
如果您运行sub,它将进入中断模式,如下所示:
然后,如果您展开shoe
,您会看到:
这足以表明您没有在索引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
我已经加入了一个可选的代码行,其中包含每张卡的正在生成的套装。最好将其包含在调试目的中,直到您的鞋子生成正确,然后在运行后丢弃该套装。