【问题标题】:Creating a Range in VBA在 VBA 中创建范围
【发布时间】:2015-06-22 04:33:05
【问题描述】:

我正在开发我的第一个 VBA 函数。目标是有一个函数接受两个整数作为输入,并输出一个数组,其中包含两个输入之间的所有整数(包括端点)。

例子:如果我输入5和9,输出应该是5、6、7、8、9的数组。

VBA 似乎没有我在其他语言中习惯使用的任何对象或函数。 Python 有一个 range() 函数,但我所知道的大多数其他语言都有可以附加到的类似列表的类型。这在 VBA 中是如何工作的?

我不是要创建 Excel 范围,而是要创建一个包含两个值之间的范围的数组。

【问题讨论】:

标签: vba range


【解决方案1】:

如果您询问 Cells 多个范围,那么您可以使用:

Sub test1()
    Dim nStart&, nEnd&
    Dim Rng As Range
    nStart = 5: nEnd = 9
    Set Rng = Range("A" & nStart)
    While nStart <> nEnd
        Set Rng = Union(Rng, Range("A" & nStart + 1))
        nStart = nStart + 1
    Wend
    Debug.Print Rng.Address(0, 0)
End Sub

输出

A5:A9

如果您询问的不是 cells.range 而是数组范围,那么您可以使用:

Sub test2()
    Dim nStart&, nEnd&
    Dim Rng() As String, i&
    nStart = 5: nEnd = 9
    For i = 0 To nEnd - nStart
        ReDim Preserve Rng(i)
        Rng(i) = nStart
        nStart = nStart + 1
    Next i
    For i = 0 To UBound(Rng)
        Debug.Print Rng(i)
    Next i
End Sub

或者你可以使用这个:

Sub test3()
    Dim nStart&, nEnd&
    Dim Rng As Object, key As Variant
    Set Rng = CreateObject("Scripting.Dictionary")
    nStart = 5: nEnd = 9
    While nStart <> nEnd + 1
        Rng.Add nStart, Nothing
        nStart = nStart + 1
    Wend
    For Each key In Rng
        Debug.Print key
    Next key
    Set Rng = Nothing
End Sub

最后两个变体的输出将是相同的

 5 
 6 
 7 
 8 
 9 

【讨论】:

  • 谢谢。这很不错。我会在我的问题中澄清我的意思不是 Excel 范围。
【解决方案2】:
Function RangeArray(startAt As Long, endAt As Long) As Long()
    Dim arr() As Long, i As Long, n As Long
    n = endAt - startAt
    ReDim arr(0 To n)
    For i = 0 To n
        arr(i) = startAt + i
    Next i
    RangeArray = arr
End Function

Sub Tester()
    Dim arr
    arr = RangeArray(5, 10)
    Debug.Print arr(LBound(arr)), arr(UBound(arr))
End Sub

【讨论】:

    【解决方案3】:

    仅适用于 Excel 上下文(根据问题和标签不确定)

    如果您想要一个不处理数组的单行程序,您可以利用 Excel 中的 ROW 函数和 Application.Evaluate

    代码

    Function RangeArr(int_start As Integer, int_end As Integer) As Variant
    
        RangeArr = Application.Transpose( _
                        Application.Evaluate("=ROW(" & int_start & ":" & int_end & ")"))
    
    End Function
    

    结果

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多