【问题标题】:VB: Type Mismatch Error, Array Dimensions 1x1VB:类型不匹配错误,阵列尺寸 1x1
【发布时间】:2014-03-17 22:52:11
【问题描述】:

我正在尝试使用 Variant 数据类型来存储字符串数组。这是我正在使用的代码示例。

Sub Selecto()

Dim numRows As Integer    
Dim Badger As Variant

numRows = InputBox("How many rows?", "Rows",0)
Badger = Range("C21:C"& 21 -1 + numRows).Value    

For i = 1 To UBound(Badger)
    MsgBox (Badger(i, 1))
Next

End Sub

我的目标是使Badger 成为一个数组,其长度可以由用户通过输入框运行宏来定义。代码工作得很好,除非输入的numRows 的值为 1,它会吐出“类型不匹配错误”。

错误导致For i=1 to UBound(Badger) 行突出显示,错误消息框显示“类型不匹配”。

我猜测对于 1×1 数组,数据只是存储为字符串而不是数组,并且像 Ubound() 这样的数组函数和像 Badger(i,1) 这样的数组索引语法不起作用.是这样吗?有没有办法强制它将该变量识别为数组?

【问题讨论】:

  • 您的数组不应该以 0 而不是 1 开头
  • 如果 numRows=1 那么你不会得到一个数组,而是一个值。如果 numRows>1 那么你得到一个基于 1 的二维数组,所以你需要将你想要获取值的维度传递给 UBound。所以:UBound(Badger,1) 将为您提供数组中的“行”数。此外,您可能通过使用 vb.net 标记您的问题无意中造成了一些混乱...
  • 感谢 VB.NET 标签的提醒,Tim。

标签: arrays vba dimensions type-mismatch


【解决方案1】:

如果只从范围中读取一个值,则该变体不会创建数组,这就是为什么在尝试对其进行索引时会出现类型不匹配的原因。尝试检查 Badger 是否是带有 IsArray(Badger) 的数组。下面的代码在我使用时有效:

Sub Selecto()
    Dim numRows As Integer
    Dim Badger As Variant

    numRows = InputBox("How many rows?", "Rows", 0)

    Badger = Range("C21:C" & 21 - 1 + numRows).Value

    If IsArray(Badger) Then
        For i = 1 To UBound(Badger)
            MsgBox (Badger(i, 1))
        Next
    Else
        MsgBox Badger
    End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2012-06-10
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多