2012-04-24 6 views
7

У меня есть функция в VBA, которая генерирует массив строк. Он отлично работает при вызове из другой функции VBA, но не при вызове с рабочего листа.Функция массива в Excel VBA

Вот как это должно быть использовано:

  • выберите A1: A3
  • записи в строке формул =Test(), а затем нажмите Ctrl-Shift-Enter, чтобы сделать его функцию массива
  • A1 должна содержать A, A2 должны содержат B и A3 должны содержать C

Когда я на самом деле попробовать это, о.е. ts A во всех трех ячейках массива. Как я могу получить данные, возвращенные Test в разные ячейки массива?


Для тех, кто хотел бы его увидеть, вот код функции. Имейте в виду, что функция отлично работает при вызове из других функций.

Function Test() As String() 
    Dim a(1 To 3) As String 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = a 
End Function 

ответ

8

Вы работаете хорошо, если вы переносите данные. Чтобы сделать это, вам нужно Variant() вместо String():

Function Test() As Variant() 
    Dim a(1 To 3) As Variant 
    a(1) = "A" 
    a(2) = "B" 
    a(3) = "C" 
    Test = Application.Transpose(a) 
End Function 
+1

Я понятия не имел, что направление по умолчанию массива было справа, а не вниз. – Joe

+0

К сожалению, не существует простого автоматического способа для Excel заполнить массив горизонтальным или вертикальным. Однако могут быть некоторые трюки. –

+0

Yup, так как @andy holaday указывает, Чип Пирсон также разобрался с горизонтальной/вертикальной дилеммой. –

0

Просто понял, проблема - первое измерение массива происходит из VBA в Excel является горизонтальный, не вертикально. Чтобы увидеть выход Test, поместите функцию массива =Test() в A1: C1 (не A1: A3).

+0

Чтение этого ответа в сочетании с одним из Чарльза Уильямса выше немного сбивает с толку, хотя и являются правильными. 1D массив VBA передается в Excel как одна строка (как показано в исходном тестовом UDF). Массив 2D VBA передается с первым измерением в столбце (как видно из теста UDF, опубликованного Чарльзом). –

4

Вы можете проверить Chip Pearson's advice on returning an array from a UDF.

Это мой первый ответ здесь. Надеюсь, это не неуместно.

+0

Никогда не ошибайтесь, ссылаясь на сайт Чипа Пирсона. По крайней мере, я надеюсь, что нет, поскольку я делаю это все время! +1 –

3

Я считаю, что проще всегда работать с 2-мерных массивов, то вам не нужно переставлять и т.д.

Function Test() As String() 
    Dim a(1 To 3, 1) As String 
    a(1, 1) = "A" 
    a(2, 1) = "B" 
    a(3, 1) = "C" 
    Test = a 
End Function 
Смежные вопросы