Отображение массива (неопределенной длины), возвращаемого VBA в Excel - PullRequest
0 голосов
/ 29 января 2020

У меня есть функция Excel VBA, которая сравнивает два диапазона и возвращает значения ячеек в диапазоне A, которых нет в диапазоне B. Теперь я хотел бы отобразить список пропущенных значений в другом листе Excel. Диапазоны А и В имеют длину сотен клеток. Пропущенные значения из A в B обычно могут быть от 0 до дюжины или двух. Меня не интересует просто выделение ячеек с условным форматированием.

Функция вызывается несколько раз на одном листе, создавая таблицу. Выходные данные выглядят так: Example Table

Мое текущее решение - создать выходной диапазон для каждого столбца с формулой массива (Control Shift Enter), которая вызывает мою функцию. {=MyFormula(range1, range2)}. С параметром, отличающимся для формулы массива каждого столбца.

Внутри функции я затем устанавливаю выходной массив таким же размером, что и диапазон формул массива:

    With Application.Caller
        CallerRows = .Rows.Count
        CallerCols = .Columns.Count
    End With
    ReDim Result(1 To CallerRows)

По мере заполнения Result если только заполнить его N-1 пробелами с результатом, а в N-е место я поместил что-то вроде «еще 4 записи ...»

Очевидно, что это несколько неловко, поскольку данные потеряны , Конечно, я мог бы просто еще больше расширить диапазон CSE, но в таком случае go, если я сделаю это 25 строками, завтра я обязательно получу экземпляр, где будет найдено 26 отличий.

На мой вопрос:

  • Есть ли способ динамического изменения диапазона формулы массива?
  • ИЛИ мне как-то просто сделать необработанную вставку значений в обычные ячейки (при условии, что под выходным диапазоном больше нет данных, поэтому я могу добавить как можно больше записей)?

Я предполагаю, что первое, вероятно, невозможно, но я хочу подтвердить.

Так что, если я go со вторым параметром, каков наилучший способ сделать это, сохраняя вызов функции в ячейка, а не кнопка «повторное заполнение» и т. п.

По независящим от меня причинам в настоящее время я ограничен Excel 2013 для этого приложения.

1 Ответ

1 голос
/ 29 января 2020

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

  1. Ваш возвращаемый массив называется myArray
  2. Ваш новый лист называется mySheet
Dim myR as Range
Dim item as Variant
Set myR = mySheet.Cells(1, UBound(myArray))

For i = 0 to UBound(myArray)
    myR(i + 1).Value = myArray(i)
Next i

Это действительно так просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...