如何找到数组的维数?

Posted

技术标签:

【中文标题】如何找到数组的维数?【英文标题】:How to find the number of dimensions that an array has? 【发布时间】:2018-06-09 17:10:20 【问题描述】:

下面是一段代码,我需要通过传递的消息来存储有关警告消息的一些信息。自身传递的参数是一个变体,由对SAPListOfMessages 的API 调用设置,它返回一个String 数组。然而,我注意到的是,只要有超过 1 个警告,列表就是 2D 的,messageList(x-1) 显然会导致错误,因为它不是正确的索引。同样奇怪的是for each 循环似乎忽略了维度,并且以某种方式只是将数组展平并循环遍历它,就好像它是一维的一样。我看到的唯一解决方法是在做任何其他事情之前检查数组有多少维,因此我的问题。我找不到任何关于获取维度数量的信息——我只找到了关于它们的界限的信息。是否可以在 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

【问题讨论】:

VBA using ubound on a multidimensional array的可能重复 这能回答你的问题吗? How to return the number of dimensions of a (Variant) variable passed to it in VBA 【参考方案1】:

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

这种方法增加了可能的维度计数,60 是内置的最大值(参见评论):

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 60        ' 60 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

更多链接(感谢@ChrisNeilson)

MS Using arrays

Big Array

【讨论】:

没有必要记住 dims 的限制。 Do ... Loop 就够了,而不是硬编码 60000 或其他一些......而且,顺便说一句,如果 L-UBound 肯定会返回 Long,那么 ErrorCheck As Variant 又如何呢? 回复: “我更喜欢短小。” 就个人而言,你甚至可以更喜欢加盐的咖啡。但是你向其他人建议错误的、糟糕的编程方法。此外,您向无数人宣传这一点...... Re: “..在这里,这种方式不需要......”是的。明天你拒绝Option Explicit 和变量类型分配,支持“here”回复: “无论如何都会发生错误” - 它是如此隐含,因此需要根据最佳实践对这种情况进行编程。但是,您以牺牲清晰度和良好的风格为代价,跳过了 1 (ONE!) exit(!) 代码行。 @user6698332 - 好的,是的,我们正在引导程序员进行最佳实践 - 我编辑了 OP 非常感谢您的编辑和正确理解! :) 一个讨厌的黑客。但似乎是唯一的方法。请注意,Application.Evaluate 可能会返回一个标量、两个暗淡的数组,或者,有时,一个暗淡的数组!【参考方案2】:

一个数组有 2 个边界:UpperLower

我想你是在问下限从哪里开始。

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

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。)


另见:

MSDN:Declaring Arrays(固定和动态)

MSDN:LBound Function

MSDN:UBound Function

【讨论】:

您能否澄清一下您所说的具有声明边界的数组不适用于许多函数 的意思?这样的数组不能使用哪些函数? 经过深思熟虑的书面答案,除了这个答案与另一个问题匹配。

以上是关于如何找到数组的维数?的主要内容,如果未能解决你的问题,请参考以下文章

连接两个 NumPy 数组给出“ValueError:所有输入数组必须具有相同的维数”

C#中如何把图片转化为2维数组

ValueError:所有输入数组必须具有相同的维数

ValueError:所有输入数组必须具有相同的维数

C#创建2维数组

Numpy hstack - “ValueError:所有输入数组必须具有相同的维数” - 但它们确实如此