Arrays 检查数组VBA的值

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

我试图确保我构建的数组具有我期望的值

卡片阵列应该填充鞋子阵列

当我计算数组的值时,我得到了预期的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

您可以使用
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
vs
Integer
而是
Variant
vs非Variant。使用阵列时,Variant是迄今为止最灵活的数据类型。看看文章底部的编辑是否有帮助。因此,既然没有理由将我的数据定义为整数,我应该将其定义为变量,并在代码中具有更大的灵活性。;-)@Nelda.techspiress有优点也有缺点。变体有开销,因此可能会影响性能,加上相对缺乏类型检查,可能会掩盖错误。另一方面,它们无疑更加灵活。