Ошибка «Недостаточно памяти» VBA после попытки зарегистрировать описания UDF - PullRequest
0 голосов
/ 25 ноября 2018

Я создал ряд математических функций VBA в электронной таблице Excel (т.е. алгоритмы минимизации).Эти функции были проверены, и они, кажется, работают должным образом.Я хочу добавить описание этих функций и их аргументов, поэтому, основываясь на этом вопросе по теме , я попытался написать несколько подпрограмм, которые бы достигли этого:

  • Сначала я создал подпрограмму, которая фактически инкапсулирует описания:

    Sub RegisterUDF()
    
    myFunctionOneDescription = "Long FunctionOne description" & vbLf _ 
        & "myFunctionOne(<...>, ..., <...>)"
    myFunctionOneArguments = Array("FunctionOne argument 1 description", _
                                   "FunctionOne argument 2 description", _
                                   "FunctionOne argument 3 description", _
                                   "FunctionOne argument 4 description", _
                                   "[Optional] FunctionOne argument 5 description")
    
    myFunctionTwoDescription = "Long FunctionTwo description" & vbLf _ 
        & "myFunctionTwo(<...>, ..., <...>)"
    myFunctionTwoArguments = Array("FunctionTwo argument 1 description", _
                                   "FunctionTwo argument 2 description", _
                                   "FunctionTwo argument 3 description", _
                                   "FunctionTwo argument 4 description", _
                                   "[Optional] FunctionTwo argument 5 description")
    
    myFunctionThreeDescription = "Long FunctionThree description" & vbLf  _ 
        & "myFunctionThree(<...>, ..., <...>)"
    myFunctionThreeArguments = Array("FunctionThree argument 1 description", _
                                     "FunctionThree argument 2 description", _
                                     "FunctionThree argument 3 description", _
                                     "FunctionThree argument 4 description", _
                                     "[Optional] FunctionThree argument 5 description")
    
    Application.MacroOptions Macro:="myFunctionOne", Description:=myFunctionOneDescription, ArgumentDescriptions:=myFunctionOneArguments, Category:=9
    Application.MacroOptions Macro:="myFunctionTwo", Description:=myFunctionTwoDescription, ArgumentDescriptions:=myFunctionTwoArguments, Category:=9
    Application.MacroOptions Macro:="myFunctionThree", Description:=myFunctionThreeDescription, ArgumentDescriptions:=myFunctionThreeArguments, Category:=9
    
    End Sub
    
  • Затем я создаю следующую подпрограмму в объекте ThisWorkbook:

    Private Sub Workbook_Open()
      Call RegisterUDF
    End Sub
    

    , поэтомучто описания автоматически загружаются при открытии книги.

При создании этих двух подпрограмм и оценке вида описаний функций в пользовательском интерфейсе функций (а именно той, которая появляется принажмите Ctrl + Shift + A или fx), я начал закрывать и открывать книгу, данные описания обновляются только при выполнении Workbook_Open().Затем, в какой-то момент, я начал получать ошибку Out of Memory сразу после открытия книги;ошибка возникла из третьего описания функции, приведенного выше:

image

Я начал избавляться от этих двух подпрограмм, но теперь все еще вижу ошибку Out of Memory при обновлении своей книги(чьи вкладки заполнены экземплярами моих пользовательских функций);Кажется, что каждый раз ошибка Out of Memory возникает в одном из моих UDF, но не всегда одинакова.Кроме того, когда я пытаюсь отменить отладку путем сброса VBA, сразу после этого я получаю новую ошибку Out of Memory, прежде чем обновлять книгу или выполнять какие-либо дополнительные действия, таким образом, я попадаю в «цикл» ошибок Out of Memory.и я вынужден закрыть Excel из диспетчера задач (1) .Этого никогда не было до того, как я попытался закодировать описания функций.

Кто-нибудь может мне помочь в понимании того, что может происходить? Я подозреваю, что это связано с использованием Application.MacroOptionsно я не уверен Любая помощь очень ценится.

(1) Я подозреваю, что это на самом деле объясняется тем фактом, что, когда я обновляю книгу или вкладку, несколько экземпляров моих пользовательских функций будутпоэтому попробуйте переоценить, поэтому каждая ошибка Out of Memory соответствует одному экземпляру моих UDF.

[EDIT # 1] Я наблюдаю очень странное поведение.Например, на вкладке с ранее существовавшими экземплярами моих пользовательских функций в некоторых ячейках я попытался оценить одну из своих функций в новой ячейке после того, как закомментировал 2 подпрограммы, описанные выше .При записи функции в ячейку и нажатии Enter я получил ошибку Out of Memory, исходящую из кода этого UDF.Затем я удалил из кода VBA подпрограммы с комментариями и при нажатии введите функцию, оцененную правильно!Однако при обновлении этой вкладки я получил ту же ошибку памяти, но на этот раз из другой UDF.

1 Ответ

0 голосов
/ 25 ноября 2018

Похоже, что это было решено с помощью процедуры, описанной ниже (1) :

  1. Удаление подпрограмм RegisterUDF() из модуля и Workbook_Open() из объекта Workbook;
  2. Скопируйте весь код VBA из модуля (2) , например, в блокнот;
  3. Удалите модуль рабочей книги;
  4. Создайте новый модуль вта же самая рабочая книга;
  5. Вставьте код в новый модуль.

Ошибки Out of Memory прекратились после этой манипуляции, однако я до сих пор не знаю, что было в начале,и я не уверен, что это может произойти снова, если я попытаюсь перепрограммировать RegisterUDF() и Workbook_Open(). Будем весьма благодарны за любые дополнительные пояснения к этой ошибке.

(1) Другие приемы, такие как копирование всей книги;перезагрузка компьютера;копирование / вставка кода в новую рабочую книгу без удаления старого модуля из исходной рабочей книги;и т. д., похоже, не удалось решить проблему.

(2) Весь мой код находился в одном модуле.

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