【问题标题】:Using UBound for Array将 UBound 用于数组
【发布时间】:2019-02-14 03:06:42
【问题描述】:

我的代码中有一个变量声明为 Variant

Dim All_WorkWeeks_Entered As Variant

我正在分配如下值

With Worksheets("workweeks")
    All_WorkWeeks_Entered = Application.Transpose(.Range(.Range("A1"), .Cells(.Rows.Count, "A").End(xlUp)))
End With

如果我的列“A”只有一个元素,那么我的 All_WorkWeeks_Entered 将是一个字符串。

在我正在使用的代码的其他部分

For Counter = 1 To UBound(All_WorkWeeks_Entered)

Next Counter

UBound 不能用于字符串。我将如何始终将 All_WorkWeeks_Entered 作为数组?

【问题讨论】:

  • 你想做什么?
  • 我希望我的 All_WorkWeeks_Entered 变量始终是一个数组。
  • @urdearboy 但它运行良好。

标签: arrays excel vba


【解决方案1】:

如果你转置,你最终会得到一个从零开始的数组,而不是一个从一开始的数组。通过坚持循环迭代的下边界和上边界来省去一些痛苦。

一个简单的行检查将告诉您 A 列中是否有多个工作表名称。如果是单个值,则拆分一个非法的工作表名称字符,您最终将得到一个包含一个元素的数组。

Dim All_WorkWeeks_Entered As Variant, counter as long

With Worksheets("workweeks")
    if .Cells(.Rows.Count, "A").End(xlUp).row>1 then
        All_WorkWeeks_Entered = Application.Transpose(.Range(.cells(1, "A"), .Cells(.Rows.Count, "A").End(xlUp)))
    else
        All_WorkWeeks_Entered = split(.Range("A1"), "/")
    end if
End With

For Counter = LBound(All_WorkWeeks_Entered) To UBound(All_WorkWeeks_Entered)
    'do stuff with All_WorkWeeks_Entered(Counter)
Next Counter

【讨论】:

    【解决方案2】:

    确实,单个成员数组以其类型而不是数组的形式呈现。一个好的解决方法是检查数组,使用IsArray() 函数并采取相应措施。

    Public Sub TestMe()
    
        Dim alldata As Variant    
        With Worksheets(1)
            'works ok, returning array:
            'alldata = Application.Transpose(.Range("A1:A2"))
    
            'problematic - does not return an array, but a type not supporting Ubound():
            alldata = Application.Transpose(.Range("A1"))
        End With
    
        If IsArray(alldata) Then
            Debug.Print UBound(alldata)
        Else
            Debug.Print "Single member array!"
        End If
    
    End Sub
    

    在条件中,可以使用一些逻辑来返回单个成员数组:

    If IsArray(alldata) Then
        Debug.Print UBound(alldata)
    Else
        Debug.Print "Single member array!"
        ReDim alldata(1)
        alldata(1) = Application.Transpose(Worksheets(1).Range("A1"))
        Debug.Print UBound(alldata)
    End If
    

    【讨论】:

      【解决方案3】:

      问题是 Range.Value 可以是单个 Variant 也可以是一个 Variant 数组,因此在读取值时必须像这样进行分支:

      With Worksheets("workweeks")
          Dim rngTarget As Range: Set rngTarget = .Range(.Range("A1"), .Cells(.Rows.Count, "A").End(xlUp))
          If IsArray(rngTarget.Value) Then
              All_WorkWeeks_Entered = Application.Transpose(rngTarget.Value)
          Else
              Dim varArray(1 To 1) As Variant: varArray(1) = rngTarget.Value
              All_WorkWeeks_Entered = varArray
          End If
      End With
      

      第二个循环看起来会更好:

      For Counter = LBound(All_WorkWeeks_Entered) To UBound(All_WorkWeeks_Entered)
      ' ...
      Next Counter
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多