Есть ли программный интерфейс к формулам массива в Excel? - PullRequest
4 голосов
/ 14 октября 2011

Например, предположим, у меня есть

{={1,2,3,4,5}}

в клетке. Есть ли способ узнать, сколько элементов в этом массиве, и что это за элементы?

Теперь, реализуя идею @chris neilsen, теперь у меня есть функция VBA, как показано ниже

Function rinfo(r As Range) As String
    With r.CurrentArray
        rinfo = .Address & ", " & .Rows.Count & ", " & .Columns.Count & ", " & .Value & ", " & .Value2
    End With
End Function

однако данные из него не выглядят обнадеживающими, а именно

$A$29, 1, 1, 1, 1

Rows.Count и Columns.Count имеют смысл, если они подсчитывают строки и столбцы, используемые в рабочей таблице. Но как указание данных в формуле массива, нет.

Ответы [ 2 ]

5 голосов
/ 14 октября 2011

Ваша формула занимает только одну ячейку, и ячейка может содержать только скалярное значение, поэтому после вычисления ячейки она будет содержать 1.
Но вы можете вычислять формулу из VBA, и это может дать вам результат массива. Если ваша формула в A1, то

Dim vArr As Variant
vArr = Evaluate(Range("a1").Formula)

приведет к тому, что vArr будет содержать массив из 4 вариантов из 4 чисел.
Существует несколько «причуд» к методу Evaluate: см. одну из моих веб-страниц для получения подробной информации.

1 голос
/ 14 октября 2011

В Sub, если cl является Range и для него задана ячейка, являющаяся частью формулы массива, то

cl.CurrentArray

возвращает диапазон, содержащий формулу массива.

Если ваша примерная формула была в ячейках A1:E1, а активная ячейка - любая из ячеек A1 .. E1, то выполнение

Sub zx()
    MsgBox "ref = " & ActiveCell.CurrentArray.Address
End Sub

вернет сообщение ref = $A$1:$E$1

Вы можете использовать .Rows.Count и .Columns.Count, чтобы получить размер, и .Value, чтобы получить значения

...