VBA:如何查找数组所具有的维数?

时间:2018-06-09 17:10:21

标签: vba excel-vba excel

下面是一段代码,我需要通过浏览传递的消息来存储有关警告消息的一些信息。传递给它的参数是一个变体,它由对SAPListOfMessages的API调用设置,返回String数组。然而,我注意到,只要有超过1个警告,列表就是2D,messageList(x-1)显然会导致错误,因为它不是正确的索引。同样奇怪的是,for each循环似乎忽略了维度,并且不知何故只是将数组展平并循环遍历它,就好像它是1D一样。我看到的唯一方法是在做其他任何事情之前检查数组有多少维度,因此我的问题。我无法找到任何有关维度数量的信息 - 我只找到了有关其边界的信息。是否可以在VBA中找到数组的维数?如果没有,你会怎么建议我解决这个问题?

Sub getOverlapWarnings(ByRef messageList As Variant, ByRef warnings As Dictionary)

  Dim msg As Variant
  Dim x As Integer
  x = 1
 'look for an overlap warning message in the list of messages
  For Each msg In messageList
    'look for the keyword 'overlap' in the list of messages

    If InStr(1, msg, "overlap") <> 0 Then
       warnings.Add messageList(x - 1), msg
    End If
   x = x + 1
  Next msg
End Sub

提前致谢!

2 个答案:

答案 0 :(得分:7)

是否可以在VBA中找到数组的维数?

这种方法对维度进行倒计时,60000是内置的最大值:

Private Function nDim(ByVal vArray As Variant) As Long
' Purpose: get array dimension (MS)
Dim dimnum     As Long
Dim ErrorCheck As Long    ' OP: As Variant
On Error GoTo FinalDimension

For dimnum = 1 To 60000    ' 60000 being the absolute dimensions limitation 
    ErrorCheck = LBound(vArray, dimnum)
Next
' It's good use to formally exit a procedure before error handling
' (though theoretically this wouldn't needed in this special case - see comment) 
Exit Function

FinalDimension:
nDim = dimnum - 1

End Function

答案 1 :(得分:1)

数组有2个边界:上部下部

我认为你在问下界的起点。

默认情况下,下限为零。例如:

Sub test()
    Dim arr
    arr = Array("a", "b", "c")
    Debug.Print "Lower: " & LBound(arr), "Upper: " & UBound(arr)
End Sub

返回:Lower: 0 Upper: 2因为3个元素的索引为012

默认情况下,某些功能可能会从1开始,但这种情况很少见。一个例子是使用范围填充数组:

Sub test()
    Dim arr
    arr = Range("A2:A4")
    Debug.Print "Lower: " & LBound(arr), "Upper: " & UBound(arr)
End Sub

...返回:Lower: 1 Upper: 3

如果您完全声明了数组,则可以根据需要设置上限和下限:

Sub test()
    Dim arr(99 To 101) As String
    arr(100) = "blah"
    Debug.Print "Lower: " & LBound(arr), "Upper: " & UBound(arr)
End Sub

...返回:Lower: 99 Upper: 101,但是带有声明边界的数组不能使用许多函数(如前面的示例。

您还可以使用每个模块最顶部的语句设置默认下限:

Option Base 1

...但是它有很多地方可以应用它没用。 (更多here。)

另见: