在 VBA 中创建范围
Posted
技术标签:
【中文标题】在 VBA 中创建范围【英文标题】:Creating a Range in VBA 【发布时间】:2015-06-22 04:33:05 【问题描述】:我正在开发我的第一个 VBA 函数。目标是有一个函数接受两个整数作为输入,并输出一个数组,其中包含两个输入之间的所有整数(包括端点)。
例子:如果我输入5和9,输出应该是5、6、7、8、9的数组。
VBA 似乎没有我在其他语言中习惯使用的任何对象或函数。 Python 有一个 range() 函数,但我所知道的大多数其他语言都有可以附加到的类似列表的类型。这在 VBA 中是如何工作的?
我不是要创建 Excel 范围,而是要创建一个包含两个值之间的范围的数组。
【问题讨论】:
在 VBA 中你ReDim
一个数组到所需的大小,然后填充它。 cpearson.com/excel/vbaarrays.htm
【参考方案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
结果
【讨论】:
以上是关于在 VBA 中创建范围的主要内容,如果未能解决你的问题,请参考以下文章