繁体   English   中英

对数组使用UBound

[英]Using UBound for Array

我的代码中有一个声明为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作为数组?

如果转置,您将最终得到一个从零开始的数组,而不是从一个从一开始的数组。 坚持使用“下边界”和“上边界”进行循环迭代,可以为自己节省一些痛苦。

一个简单的行检查将告诉您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

实际上,单成员数组以其类型而不是数组的形式出现。 一个好的解决方法是使用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

问题在于Range.Value可以是单个Variant或Variants数组,因此在读取这样的值时必须分支:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM