2015-06-22 6 views
2

Я работаю над своей первой функцией VBA. Цель состоит в том, чтобы иметь функцию, которая принимает два целых числа в качестве входных данных и выводит массив, содержащий все целые числа между двумя входами (включая конечные точки).Создание диапазона в VBA

Пример: Если я вход 5 и 9, выходной сигнал должен быть массив из 5, 6, 7, 8, 9.

VBA, кажется, не имеют какой-либо из объектов или функций, которыми я используется на других языках. Python имеет функцию range(), но большинство других языков, о которых я знаю, имеют типы списка, к которым можно добавить. Как это работает в VBA?

Я не ищу, чтобы создать диапазон Excel, а скорее массив, который содержит диапазон между двумя значениями.

+2

В VBA вы 'ReDim' массив до нужного размера, а затем заполнить его. http://www.cpearson.com/excel/vbaarrays.htm –

ответ

2

если вы спрашиваете о 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 
+0

Спасибо. Это очень хорошо. Я уточню в своем вопросе, что я не имею в виду диапазон Excel. – indigochild

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 
0

Применяется только в контексте Excel (не уверены, основываясь на вопросе и тегах)

Если вы хотите использовать однострочный вкладыш, который не имеет дело с массивами, вы можете воспользоваться функцией ROW и Application.Evaluate в Excel.

Код

Function RangeArr(int_start As Integer, int_end As Integer) As Variant 

    RangeArr = Application.Transpose(_ 
        Application.Evaluate("=ROW(" & int_start & ":" & int_end & ")")) 

End Function 

Результаты

array results

Смежные вопросы