Как использовать формулы массива Excel для UDF для правильного чтения каждой ячейки?

Добрый день,

У меня есть вопрос, который больше направлен на то, чтобы помочь себе понять, как формулы массива Excel (Control + Shift + Enter) могут динамически считывать каждую ячейку в формулу.

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

Я создал небольшую вымышленную ферму, на которой есть несколько животных, перечисленных по именам, и я буду воспроизводить звук того, что издает животное. В следующем столбце я создал определяемую пользователем функцию под названием MakesSound, которая получает данные о том, какое это животное, и отвечает на звук, который оно издает. Как показано на снимке ниже.

введите здесь описание изображения

К сожалению, я думал, что формула массива может определить, что у меня есть разные ячейки со списком животных, и вместо этого она заканчивается вот таким снимком.

введите здесь описание изображения

Итак, как я могу попросить формулу массива распознать, что у меня есть разные ячейки в столбце B, поскольку я знаю, что Quacks не является ответом для других животных. :-)

Вот еще один снимок, показывающий формулы рядом с формулами массива для сравнения и код, который я также использовал.

введите здесь описание изображения

Public Function MakesSound(AnimalName As String) As Variant
    Select Case AnimalName
        Case Is = "Duck"
            MakesSound = "Quack!"
        Case Is = "Cow"
            MakesSound = "Moo!"
        Case Is = "Bird"
            MakesSound = "Tweet!"
        Case Is = "Sheep"
            MakesSound = "Ba-Ba-Ba!"
        Case Is = "Dog"
            MakesSound = "Woof!"
        Case Else
            MakesSound = "Eh?"
    End Select
End Function

Я открыт для предложений.

Спасибо, Питер.


person Peter M Taylor    schedule 02.02.2013    source источник
comment
Почему бы вам просто не использовать INDEX/MATCH или даже VLOOKUP?   -  person brettdj    schedule 03.02.2013
comment
Сейчас я изучаю формулы массива, чтобы увидеть, какие эффекты возникают. Я благодарю вас за предложение, brettadj.   -  person Peter M Taylor    schedule 03.02.2013


Ответы (2)


вам нужно, чтобы функция массива читала данные в массив, обрабатывала их и создавала выходной массив.
Затем функцию массива необходимо ввести в формулу массива из нескольких ячеек (D3:D7) с помощью клавиш Ctrl-Shift-Enter.

Public Function MakesSound(AnimalName As Range) As Variant
Dim Ansa() As Variant
Dim vData As Variant
Dim j As Long
vData = AnimalName.Value2
ReDim Ansa(1 To UBound(vData), 1 To 1)
For j = 1 To UBound(vData)
    Select Case vData(j, 1)
    Case Is = "Duck"
        Ansa(j, 1) = "Quack!"
    Case Is = "Cow"
        Ansa(j, 1) = "Moo!"
    Case Is = "Bird"
        Ansa(j, 1) = "Tweet!"
    Case Is = "Sheep"
        Ansa(j, 1) = "Ba-Ba-Ba!"
    Case Is = "Dog"
        Ansa(j, 1) = "Woof!"
    Case Else
        Ansa(j, 1) = "Eh?"
    End Select
Next j
MakesSound = Ansa
End Function
person Charles Williams    schedule 03.02.2013
comment
Итак... мой урок, который можно извлечь из этого простыми словами, состоит в том, чтобы преобразовать входные данные из диапазона в 2D-массив любого размера (или типа?), Функция или определяемая пользователем функция (UDF) может обрабатывать массив как угодно пользователям нравится, после того, как это будет сделано, выход as variant выполняет преобразование из массива обратно в диапазон соответственно. Я просто люблю изучать Excel!! :-) - person Peter M Taylor; 04.02.2013

Цель использования формул массива для данного образца для меня действительно неясна, но в любом случае, если вы настаиваете - попробуйте следующее:

  1. Выберите регион C3:C7 (как на самом верхнем экране).
  2. Нажмите F2 для редактирования на месте и введите следующую формулу: =MakesSound(B2:B7)
  3. Нажмите CTRL+SHIFT+ENTER вместо обычного ENTER — это определит формулу МАССИВА и приведет к {} скобки вокруг него (но НЕ вводите их вручную!).

Я не уверен, может ли ваш UDF правильно обрабатывать запись массива, но для обычных формул Excel это работает, как и ожидалось, например. попробуйте =LEFT(B2:B7,2) в качестве массива один для шага 2 - и это вернет 2 начальные буквы из каждого имени животного.

Надеюсь, это было как-то полезно. Удачи!

person Peter L.    schedule 02.02.2013
comment
Вы правы, Питер Л., он не справился с этим правильно. Получилось #ЦЕННОСТИ!. Я надеялся, что он справится с такой обработкой массива. - person Peter M Taylor; 03.02.2013
comment
@user1924393 user1924393 Если ответ был чем-то полезен - не стесняйтесь проголосовать за него, у вас достаточно репутации для этой привилегии) - person Peter L.; 03.02.2013
comment
@user1924393 user1924393 я тоже) удачи в улучшении ваших знаний, возвращайтесь с более интересными вопросами) - person Peter L.; 04.02.2013