Заполнение нескольких ячеек Excel данными из пользовательской функции надстройки (UDF)
Я работаю над надстройкой для Excel, которая должна заполнять одну или несколько ячеек на листе данными с сервера. Я сделал следующее:
- Создал надстройку (xlam) и создал определенную пользователем функцию: GetMyData ()
- Я вызываю эту функцию из простого листа Excel. В ячейке A1 я ввел формулу = GetMyData ()
- Мой сервер возвращает массив JSON. Я могу разобрать JSON и теперь пытаюсь заполнить A1 и ниже строки значениями, полученными с сервера. (в этом случае у меня 20 значений, поэтому я хочу заполнить ячейки A1: A20).
Проблема заключается в том, что, согласно Microsoft KB, пользовательская функция может изменять только значение активной ячейки. https://support.microsoft.com/en-us/help/170787/description-of-limitations-of-custom-functions-in-excel Я также попытался запустить приведенный ниже код, который изменяет только одну ячейку на твердое значение :
ActiveWorkbook.Sheets("DataSheet").Cells(1, 1).Value = '12312'
Все еще – получение исключения.
- Создание диаграммы на втором листе Excel
- Как записать в файл .xlsx с двумя предварительно определенными листами с помощью C #?
- Использование Interop.Excel для проверки наличия файла Excel в макросах VBA
- Как удалить скрытую колонку / строку из листа Excel?
- Должен ли быть выпущен * каждый * объект взаимодействия Excel с помощью Marshal.ReleaseComObject?
Может ли кто-нибудь помочь в решении этой проблемы?
- Powershell и Excel, чувствительность к регистру с .replace
- EPPLUS сдвигается вниз
- Как объединить несколько файлов excel в один файл excel
- Как получить доступ к уже открытому файлу Excel в C #?
- Определение версии Excel / культуры через Microsoft.Office.Interop.Excel
- Есть ли причина для переключения MSExcel.Excel.ApplicationClass.DisplayAlerts?
- Как скопировать диаграмму из файла excel в точку питания?
- IIS не открывает XLS
Пусть функция вернет вертикальный массив.
Например:
Function GetMyData() As Variant() Dim test() As Variant test = Array(1, 2, 3, 4) GetMyData = Application.Transpose(test) End Function
Затем выделите все ячейки, которые вам когда-либо понадобится, с верхней частью в качестве активной ячейки.
Затем поместите эту формулу в строку формул:
=GetMyData()
И нажмите Ctrl-Shift-Enter вместо Enter для массива, введите формулу.
Если вы выберете больше, чем возвращает массив, вы получите ошибки.
Или вы можете, используя возврат Array, использовать это, чтобы справиться с ошибкой и войти нормально, но она запускает функцию для каждого момента, когда она помещается в ячейку.
Поместите это в первую ячейку:
=IFERROR(INDEX(GetMyData(),ROW(1:1)),"")
Затем скопируйте / перетащите, пока не получите пробелы
Вот простой пример:
Public Function cerial(d As Date) Dim bry(1 To 20, 1 To 1) As String For i = 1 To 20 bry(i, 1) = CStr(d) & "_" & i Next i cerial = bry End Function
Он создает массив из 20 элементов.
Есть крошечный трюк, чтобы использовать его на листе.
Выберите, скажем, E1- E20 . Затем нажмите на панели формул и введите формулу массива:
=cerial(TODAY())
Формулы массива должны вводиться с помощью Ctrl + Shift + Enter, а не только клавиши Enter . Если это будет сделано правильно, формула появится в скобках в строке формул.
ЗАМЕТКА:
В этом примере внутренний массив bry()
является двумерным.