Arrays 检查数组VBA的值
我试图确保我构建的数组具有我期望的值 卡片阵列应该填充鞋子阵列 当我计算数组的值时,我得到了预期的104,但是当我将这些值粘贴到excel工作表中时,只填充了13个单元格 有没有检查数组内容的简单方法Arrays 检查数组VBA的值,arrays,vba,excel,Arrays,Vba,Excel,我试图确保我构建的数组具有我期望的值 卡片阵列应该填充鞋子阵列 当我计算数组的值时,我得到了预期的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
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
您可以使用
Join
:
Sub test()
Dim Directions As Variant
Directions = Array("North", "South", "East", "West")
Debug.Print Join(Directions, ", ")
End Sub
哪张照片
North, South, East, West
在即时窗口中。此外,如果使用调试器单步执行代码,则可以在“局部变量”窗口中展开数组名称并检查各个元素
编辑时:在此最后一点上展开。如果在VBA编辑器中选择视图->局部变量窗口
,并在向工作表发送shoe
的代码行之前设置断点(通过单击行的左侧),您应该会看到如下内容:
如果运行sub,它将进入中断模式,如下所示:
然后,如果展开shoe
,您将看到:
这足以表明您没有在索引13之后初始化shoe
。其他人已经发布了显示这个bug来源的答案——但正如你所问的那样,能够检查数组的值确实是一项重要的技能
编辑时的加入与既不是变量也不是字符串的数组不兼容。如果您有一个声明如下的数组,例如
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),“,”)
将按预期工作。此处仅填充前13个值:
For i = LBound(Cards) To UBound(Cards)
shoe(cnt) = Cards(i)
cnt = cnt + 1
Next i
你需要循环8次才能得到104
你想干什么?用104张卡片(每张8张)填满鞋子?如果是这样的话,我会使用split/join方法。如果你需要的话,很乐意发布一些代码。想法是在一个循环上构建一个字符串,根据需要多次附加连接的卡片阵列(在本例中为8),然后将其拆分到鞋子上。您已经通过丢弃套装使卡片均匀化,但它们仍然需要添加到循环中,以获得每个牌组的正确数量
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
我已经包括了一个可选的代码行,其中包括每个卡的套装,因为它正在建立。出于调试目的,最好将其包括在内,直到鞋子生成正确,然后在衣服运行后丢弃。在for
循环中,可以将当前数组值打印到调试窗口(也称为即时窗口)。只需添加Debug.print卡(i)
。这将有助于确定卡中的内容。我正在努力完成你的宏,但最终目标是什么?将shoe
阵列输出到范围A1。鞋子阵列由什么组成?您的鞋当前可容纳(1至104)
。据我所知,你从来没有填充过54次?我正在尝试创建一个你可能在赌场找到的纸牌鞋。在这种情况下,我希望鞋子包含两组常规卡片。我已经将10、jack、queen和king标准化为10,但没有包括套装,因为我将在21点模拟中使用它。很好地解释了调试和显示数组内容。但是,本文开头的debug.print示例似乎不适用于除字符串以外的其他数据类型。你能为debug.print提供一个整数数组的代码吗?(因为这也是OP的功能。)@Nelda.techspires问题不在于String
vsInteger
而是Variant
vs非Variant。使用阵列时,Variant是迄今为止最灵活的数据类型。看看文章底部的编辑是否有帮助。因此,既然没有理由将我的数据定义为整数,我应该将其定义为变量,并在代码中具有更大的灵活性。;-)@Nelda.techspiress有优点也有缺点。变体有开销,因此可能会影响性能,加上相对缺乏类型检查,可能会掩盖错误。另一方面,它们无疑更加灵活。