【问题标题】:VBA array loop not using last elementVBA数组循环不使用最后一个元素
【发布时间】:2017-02-10 18:46:19
【问题描述】:

我已经盯着这段代码看了好几个小时,想知道它为什么不正常。我需要一个理智的人来看看这个并告诉我哪里出错了,拜托。

我正在寻找一个包含模式元素的数组。我开始为一行中的每个元素添加一个“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

【问题讨论】:

  • 您的代码适用于我:PatternArray 第 0 行是:Void,"x","x","x","x","x","xxxxx"
  • 您的模块中是否有Option Base 0Option Base 1stackoverflow.com/questions/31606203/…
  • 我没有在任何地方更改选项库
  • " 这意味着它应该循环 6 次" 你从 1 to UBound(PatternArray, 2) - 1 循环,这是 1 To (6-1) 这是 1 to 5 那么为什么你期望它看起来 6 次?
  • 嗨乔,这只是一个错误的输入。你是对的,它应该是“循环 5 次”

标签: arrays excel vba


【解决方案1】:

也许这个测试功能可以帮助您确定如何在 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

编辑添加了一个复制到工作表范围的数组

【讨论】:

  • 您好,感谢您花时间回答我的问题,但它并没有真正回答我的问题。我正在寻找关于我的代码为何如此行事的解释。特别是当我看到代码编辑器和粘贴的数组之间存在差异时。您是尝试了我的代码还是自己编写了代码?
  • @Mark 添加了复制到工作表,调整大小功能不允许值为 0,您必须使用 1..n 扩展值。这是您实际上需要对行轴和列轴都执行 +1 的原因。
  • 好的,现在说得通了。当您将一个数组加载到一个范围内时,它也以 1 开头。谢谢,我现在放心了。
猜你喜欢
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2021-04-22
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多