2014-09-21 1 views
2

Я пытаюсь найти практический способ прямого распределения значений в многомерном массиве в VBA без итерации. Я Googled решение, какой вид работ, но терпит неудачу, когда я пытаюсь использовать его в сочетании с переменными ..VBA - Выделение многомерного массива напрямую с помощью скобок

Это работает:

Sub SomeSub() 
    Dim vArray As Variant 
    Dim iCounter As Integer 
    vArray = [{"Zip", "22150";"City", "Springfield"; "State", "VA"}] 

    For iCounter = LBound(vArray, 1) To UBound(vArray, 1) 
     Debug.Print vArray(iCounter, 1), vArray(iCounter, 2) 
    Next iCounter 
End Sub 

Это, однако, не делает, и поднимает «Тип ошибка несоответствия ". Разница заключается в том, что я стараюсь (и желание) использовать переменные вместо постоянных значений:

Sub SomeSub() 
    Dim vArray As Variant 

    Dim iZip As Integer 
    Dim sCity As String 
    Dim sState As String 

    iZip = 22150 
    sCity = "Springfield" 
    sState = "VA" 

    Dim iCounter As Integer 
    vArray = [{"Zip", iZip;"City", sCity; "State", sState}] 

    For iCounter = LBound(vArray, 1) To UBound(vArray, 1) 
     Debug.Print vArray(iCounter, 1), vArray(iCounter, 2) 
    Next iCounter 
End Sub 

Я считаю, мало или нет информации об этом методе для выделения массивов, поэтому я надеюсь, что кто-то имеет некоторое представление о том, чтобы предложить ,

Спасибо!

ответ

1

У VBA также есть встроенная функция Array. Вы можете использовать Array в функции Array, чтобы сделать его «многомерным».

Sub SomeSub() 
    Dim vArray As Variant 

    Dim iZip As Integer 
    Dim sCity As String 
    Dim sState As String 

    iZip = 22150 
    sCity = "Springfield" 
    sState = "VA" 
    vArray = Array(Array("Zip", iZip), Array("City", sCity), Array("State", sState))  

    Dim iCounter As Integer 

    For iCounter = LBound(vArray, 1) To UBound(vArray, 1) 
     Debug.Print vArray(iCounter, 1), vArray(iCounter, 2) 
    Next iCounter 
End Sub 

Хотя приведенный выше код действительно соответствует OP, я редактирую этот ответ с дополнительной информацией. Технически это не «многомерное». Скорее, это «зубчатый». Это вариант одномерного массива одномерных массивов. В VBA, когда вы определяете действительно многомерный массив, можно использовать следующий синтаксис:

Sub someSub() 
    Dim vArray(5, 5) As Long 
    vArray(0, 1) = 5 
    vArray(0, 2) = 3 
    vArray(1, 3) = 4 
    Debug.Print vArray(1, 3) 'Prints 4 
End Sub 

Другой пользователь Stackflow предложил эту техническую коррекцию, и я хотел бы включить эти знания в ответ.

+1

Хорошо сыграл, мой друг .. Хорошо сыграл. –

1

[...] синтаксиса ярлык для Application.Evaluate() и, как вы обнаружили, что это работает только для среды выполнения постоянных выражений, вы можете использовать реальный вызов Application.Evaluate() проходящий строку dynamc, но (* имо) тот вполне Hacky.

Альтернативы:

  • Создать фабричную функцию, которая принимает paramarray() аргументов, степ через него, используя модуль счетчика, чтобы выяснить, какие размеры выделить.

  • Поскольку первое измерение, как представляется, фиксированная строка используется User Defined Type, чтобы udt_var.City = "XXX"/udt_var.Zip = 12345 ...

  • Используйте Коллекцию (или словарь), который в отличии от выше итерации (последний по ключу).

+0

Благодарим вас за разъяснение. Я решил написать функцию, используя ParamArray для сборки массива. Я не поклонник использования методов приложения. –

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