【问题标题】:VBA Traverse through each non-empty element of 2-d arrayVBA遍历二维数组的每个非空元素
【发布时间】:2019-11-24 09:43:29
【问题描述】:

我想对二维数组的每个元素执行一些操作,其中数组的第二维在每个第一维元素上都不同。我希望循环跳过空元素。

一维数组可以让它在循环中运行,而不会在数组的空元素上浪费任何时间,但我想使用二维数组更容易将数据关联到某个组,并使代码更容易如果需要,稍后由其他人修改。一维数组的运行速度比二维数组快得多。

Application.EnableCancelKey = xlDisabled

On Error Resume Next

For i = 0 To UBound(somearray,1)    
    For j = 0 To UBound(somearray,2)
        perform some action on somearray(i,j)    
    Next j
Next i

应该注意的是,如果没有On Error Resume Next,我确实会得到一个下标 9 超出范围的错误。我认为这是因为它试图对不存在的东西执行操作。它按预期工作,但速度较慢。

如果问题微不足道,我深表歉意。我无法找到答案,而且我对 VBA 一无所知。

【问题讨论】:

  • 你如何定义somearray?认为我们需要更多的代码。您发布的代码没有明显错误。
  • 数组的下界是多少?此外,On Error Resume Next 像这样使用也很糟糕。错误应该被修复或至少被处理,而不是被压制。
  • 您能否详细说明 的两个部分,其中数组的第二维在每个第一维元素上都不同。我希望循环跳过空元素。?我不想错误地假设空元素在哪里(,1 或 ,2)
  • 如果您的阵列确实有different number of elements in the second dimension,您不能以somearray(i,j) 访问它,而是以somearray(i)(j) 访问它。如果您的数组是一个普通数组,其中每行中的最后一些元素是Empty,那么请使用IsEmpty() 来避免“循环遍历它们”。
  • 我设法弄明白了,cmets 很有帮助。出于某种原因,IsEmpty() 对我不起作用,但 = "" 起作用了。

标签: excel vba


【解决方案1】:

去掉On Error Resume Next,不要硬编码下界:

Dim currentRow As Long
For currentRow = LBound(somearray, 1) To UBound(somearray, 1)
    Dim currentColumn As Long
    For currentColumn = LBound(somearray, 2) To UBound(somearray, 2)
        DoSomething somearray(currentRow, currentColumn)
    Next
Next

如果您从 Range 获取二维数组,则它是基于 1 的 Variant 数组,因此下标 0 超出范围

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多