首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何找出数组的维数?

如何找出数组的维数?
EN

Stack Overflow用户
提问于 2018-06-10 01:10:21
回答 2查看 4.8K关注 0票数 10

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-10 01:25:12

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

这种方法增加了可能的尺寸计数,60是内置的最大尺寸(c.f.评论):

代码语言:javascript
复制
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

更多链接(thx @ Further )

MS Using arrays

Big Array

票数 9
EN

Stack Overflow用户

发布于 2018-06-10 01:27:09

数组有两个界限:

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

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

代码语言:javascript
复制
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开始的,但很少见。一个例子是用一个范围填充数组:

代码语言:javascript
复制
Sub test()
    Dim arr
    arr = Range("A2:A4")
    Debug.Print "Lower: " & LBound(arr), "Upper: " & UBound(arr)
End Sub

...returns:Lower: 1 Upper: 3

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

代码语言:javascript
复制
Sub test()
    Dim arr(99 To 101) As String
    arr(100) = "blah"
    Debug.Print "Lower: " & LBound(arr), "Upper: " & UBound(arr)
End Sub

...returns:Lower: 99 Upper: 101,但是声明了边界的数组不能与许多函数一起工作(就像前面的例子。

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

代码语言:javascript
复制
Option Base 1

...but有太多的地方它不能应用,它有点没用。(更多here。)

另请参阅:

Fixed& Dynamic)

  • MSDN:

  • MSDN:

(

  • MSDN:
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50776690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档