VBA数组循环不使用最后一个元素

时间:2017-02-10 09:38:35

标签: arrays excel vba

我几个小时以来一直盯着这段代码,想知道为什么它没有表现。我需要一个理智的人来看看这个并告诉我哪里出错了,拜托。

我希望使用模式中的元素播种数组。我开始添加" x"到一行中的每个元素。除了第一个和最后一个

正如我所知道的那样,我已经省略了遍历数组行的循环,并且只在一个遍历列的循环上工作。

我想暂时将元素(0,0)留空,因为我会在其中放置一个名称,所以我在1开始循环到上限。

我想将模式作为字符串添加到行中的最后一个元素。

所以这应该生成7个元素: "",X,X,X,X,X,为XXXXX

我将数组0的大小设置为3和0到6,这样我每行有4行和7个元素

我在1开始循环,留下(0,0)空白,这意味着它应该循环6次,因为我要求它在ubound(1-5)下面加1" x"到元素(0,1)到(0,5)

当每个循环运行时,我应该连接" x"一起创造长串。

一切看似合乎逻辑。不起作用下面的代码输出: "",X,X,X,X,X,""

NumberOfPatterns = 3
PatternLoc = 6

ReDim PatternArray(0 To NumberOfPatterns, 0 To PatternLoc)

For j = 1 To UBound(PatternArray, 2) - 1

    PatternArray(0, j) = "x"  ' xxxxxx
    PatternArray(0, PatternLoc) = PatternArray(0, PatternLoc) & PatternArray(0, j)
Next

请告诉我我错过了什么?

编辑:

为了回应它有效的注释,当我使用调试器观察循环时,似乎但是当我将数组粘贴到工作表时它不会

Sheets("Test1").Select

Set pasteDestination = Range("AX2")
pasteDestination.Resize(UBound(PatternArray, 1), UBound(PatternArray, 2)).Value = PatternArray

编辑2:

所以我找到了一个解决方法。但我还是不知道为什么!如果我向第二个维度添加+ 1,那么当我粘贴回到工作表时,它会正确粘贴...这是一个错误吗?

Sheets("Test1").Select

Set pasteDestination = Range("AX2")
pasteDestination.Resize(UBound(PatternArray, 1), UBound(PatternArray, 2) + 1).Value = PatternArray

1 个答案:

答案 0 :(得分:0)

也许这个测试功能可以帮助您确定如何在VBA脚本中单步执行二维数组。每行都有一个字符值。

Public Sub TestArrLoop()
    Dim NumberOfPatterns As Long
    Dim PatternLoc  As Long
    Dim PatternArray() As String
    Dim j As Long
    Dim idx As Long
    Dim str As String

    NumberOfPatterns = 3
    PatternLoc = 6
    ReDim PatternArray(0 To NumberOfPatterns, 0 To PatternLoc) As String

    For j = 0 To UBound(PatternArray, 1)
        PatternArray(j, 0) = LCase(Chr(65 + j)) ' a,b,c,..
        For idx = 1 To UBound(PatternArray, 2) - 1
            PatternArray(j, idx) = Chr(65 + j) ' A,B,C,..
            PatternArray(j, PatternLoc) = PatternArray(j, PatternLoc) & PatternArray(j, idx)
        Next
    Next

    Debug.Print "Rows: " & LBound(PatternArray, 1) & "-" & UBound(PatternArray, 1) & ", Cols: " & LBound(PatternArray, 2) & "-" & UBound(PatternArray, 2)
    For j = 0 To UBound(PatternArray, 1)
        str = ""
        For idx = 0 To UBound(PatternArray, 2)
            If idx > 0 Then str = str & ","
            str = str & PatternArray(j, idx)
        Next
        Debug.Print "Row " & j & ": " & str
    Next

    ' Copy array to sheet, resize arguments are 1..n value
    ' it does not allow a value of 0.
    Dim ws As Worksheet
    Dim rRange As Range
    Set ws = Application.Sheets("Sheet1")
    'Set rRange = ws.Range(ws.Cells(14, 1), ws.Cells(14 + UBound(PatternArray, 1), 1 + UBound(PatternArray, 2)))
    Set rRange = ws.Range("A14")
    Set rRange = rRange.Resize(UBound(PatternArray, 1) + 1, UBound(PatternArray, 2) + 1)
    rRange.Value = PatternArray
End Sub

VBA调试屏幕应显示此

Rows: 0-3, Cols: 0-6
Row 0: a,A,A,A,A,A,AAAAA
Row 1: b,B,B,B,B,B,BBBBB
Row 2: c,C,C,C,C,C,CCCCC
Row 3: d,D,D,D,D,D,DDDDD

修改添加了复制到工作表范围的数组