Я не хочу, чтобы моя надстройка Excel возвращала массив (вместо этого мне нужен UDF для изменения других ячеек)

Я создал надстройку Excel и одну из функций этой надстройки, позволяет сказать, что New_Years настоящее время занимает 2 года и выводит каждый Новый год между этими 2 годами в виде массива в Excel. Итак, New_Years(2000,2002) вернется 1 января 2000 года, 1 января 2001 года и 1 января 2002 года в последнюю ячейку.

Проблема в том, что я должен знать, что в это время будет 3 даты, выберите 3 ячейки, введите мою формулу в верхнюю ячейку и нажмите Ctrl + Shift + Enter чтобы заполнить массив.

Я использую XLW версию 5 для преобразования моего кода на C ++ в файл .xll. Мне бы очень понравилось, если бы я мог просто заполнить один квадрат своей формулой, и Excel заполнил бы квадраты ниже по мере необходимости с соответствующими датами. Кто-нибудь знает, возможно ли это? Или невозможно?

Большое спасибо!

One Solution collect form web for “Я не хочу, чтобы моя надстройка Excel возвращала массив (вместо этого мне нужен UDF для изменения других ячеек)”

Это действительно возможно, хотя и сложный. Я пересказываю эту магию от Кевина Джонса, а также Зорвека, поскольку он сидит за EE Paywall (ссылка прикреплена, если у кого есть доступ)

Хотя Excel строго запрещает UDF изменять какие-либо свойства ячейки, рабочей таблицы или рабочей книги, существует способ сделать такие изменения, когда UDF вызывается с использованием таймера Windows и таймера Application.OnTime в последовательности. Таймер Windows должен использоваться в UDF, потому что Excel игнорирует любые вызовы Application.OnTime внутри UDF. Но поскольку таймер Windows имеет ограничения (Excel немедленно прекратит работу, если таймер Windows попытается запустить код VBA, если ячейка редактируется или диалог открыт), он используется только для планирования таймера Application.OnTime, безопасного таймера который Excel только позволяет уволить, если ячейка не редактируется и диалоговые windows не открыты.

Пример кода ниже иллюстрирует, как запустить таймер Windows изнутри UDF, как использовать эту процедуру таймера для запуска таймера Application.OnTime и как передавать информацию, известную только UDF, в последующие выполняемые таймером процедуры. Код ниже должен быть помещен в обычный модуль.

 Private Declare Function SetTimer Lib "user32" ( _ ByVal HWnd As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimerFunc As Long _ ) As Long Private Declare Function KillTimer Lib "user32" ( _ ByVal HWnd As Long, _ ByVal nIDEvent As Long _ ) As Long Private mCalculatedCells As Collection Private mWindowsTimerID As Long Private mApplicationTimerTime As Date Public Function AddTwoNumbers( _ ByVal Value1 As Double, _ ByVal Value2 As Double _ ) As Double ' This is a UDF that returns the sum of two numbers and starts a windows timer ' that starts a second Appliction.OnTime timer that performs activities not ' allowed in a UDF. Do not make this UDF volatile, pass any volatile functions ' to it, or pass any cells containing volatile formulas/functions or ' uncontrolled looping will start. AddTwoNumbers = Value1 + Value2 ' Cache the caller's reference so it can be dealt with in a non-UDF routine If mCalculatedCells Is Nothing Then Set mCalculatedCells = New Collection On Error Resume Next mCalculatedCells.Add Application.Caller, Application.Caller.Address On Error GoTo 0 ' Setting/resetting the timer should be the last action taken in the UDF If mWindowsTimerID <> 0 Then KillTimer 0&, mWindowsTimerID mWindowsTimerID = SetTimer(0&, 0&, 1, AddressOf AfterUDFRoutine1) End Function Public Sub AfterUDFRoutine1() ' This is the first of two timer routines. This one is called by the Windows ' timer. Since a Windows timer cannot run code if a cell is being edited or a ' dialog is open this routine schedules a second safe timer using ' Application.OnTime which is ignored in a UDF. ' Stop the Windows timer On Error Resume Next KillTimer 0&, mWindowsTimerID On Error GoTo 0 mWindowsTimerID = 0 ' Cancel any previous OnTime timers If mApplicationTimerTime <> 0 Then On Error Resume Next Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2", , False On Error GoTo 0 End If ' Schedule timer mApplicationTimerTime = Now Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2" End Sub Public Sub AfterUDFRoutine2() ' This is the second of two timer routines. Because this timer routine is ' triggered by Application.OnTime it is safe, ie, Excel will not allow the ' timer to fire unless the environment is safe (no open model dialogs or cell ' being edited). Dim Cell As Range ' Do tasks not allowed in a UDF... Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Do While mCalculatedCells.Count > 0 Set Cell = mCalculatedCells(1) mCalculatedCells.Remove 1 Cell.Offset(0, 1).Value = Cell.Value Loop Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub 
  • Многомерный массив с разной длиной
  • Как удалить объекты из массива в Java?
  • Как я могу расширить типизированные массивы в Swift?
  • Когда имя массива или имя функции «преобразуется» в указатель? (в С)
  • JavaScript - почему Array.prototype.fill фактически заполняет «указатель» объекта при заполнении чего-либо типа «новый объект ()»
  • Как преобразовать ArrayList, содержащий целые числа в примитивный массив int?
  • Эффективность: массивы против указателей
  • Использование malloc для размещения многомерных массивов с разной длиной строк
  • Являются ли массивы Java максимальным?
  • Проверьте, существует ли значение в массиве Postgres
  • Как создать неизменяемый массив в Swift?
  • Interesting Posts

    Является ли CPU активным в спящем режиме?

    Запись на несколько выходов с помощью ключа Spark – одно искровое задание

    Как выбрать между хеш-таблицей и Trie (префиксное дерево)?

    Невозможно преобразовать значение типа «Meme!» к ожидаемому типу аргументов ‘@noescape (Meme) throws -> Bool’

    Прокрутка jQuery В нижней части страницы

    Метод android finish () не очищает приложение из памяти

    Насколько безопасно unguessable являются GUID?

    Извлечение данных между двумя символами в Excel

    .profile или .bash_profile

    Объединение двух изображений

    Как я могу выяснить, какой процесс постоянно обращается к моему жесткому диску в Windows XP?

    Подclass classа Java Builder

    Разрешения NTFS – запретить удаление не работает

    Блокнот ++: как добавить возврат каретки (нажатие клавиши ввода) после определенного символа

    Facebook JavaScript SDK через HTTPS, загрузка незащищенных элементов

    Давайте будем гением компьютера.