Узнайте, как отлаживать пользовательские функции в Excel

  • Поделись Этим
Michael Brown

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

Чтобы решить некоторые проблемы при создании пользовательской функции, вам, скорее всего, потребуется запустить отладку. Тогда вы сможете убедиться, что функция работает правильно.

Мы изучим следующие методы отладки:

    Когда вы создаете пользовательскую функцию, всегда есть вероятность, что вы допустите ошибку. Пользовательские функции обычно довольно сложные. И они не всегда сразу начинают работать правильно. Формула может вернуть неверный результат или ошибку #VALUE! В отличие от стандартных функций Excel, вы не увидите никаких других сообщений.

    Есть ли способ пройти через пользовательскую функцию шаг за шагом, чтобы проверить, как работает каждое из ее утверждений? Конечно! Для этого используется отладка.

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

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

    Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End Function

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

    Поместите функцию MsgBox в важные места

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

    MsgBox это диалоговое окно, которое можно использовать для отображения какого-либо сообщения пользователю.

    Синтаксис MsgBox похож на синтаксис других функций VBA:

    MsgBox(prompt [, buttons] [, title] [, helpfile, context])

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

    Все остальные аргументы являются необязательными.

    [ кнопки ] - определяет, какие кнопки и значки отображаются в MsgBox Например, если мы используем опцию vbOkOnly , то только OK Даже если вы пропустили этот аргумент, эта кнопка будет использоваться по умолчанию.

    [ название ] - здесь можно указать заголовок окна сообщения.

    Давайте перейдем от слов к делу и начнем отладку. Чтобы вывести сообщение на экран, добавьте в код следующую строку GetMaxBetween пользовательская функция перед Дело Эльза оператор:

    MsgBox vMax,, "Count -" & i

    Вот что мы получим в результате:

    Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween.WorksheetFunction.Max(arrNums) End Function

    Использование vMax переменной в диалоговом окне мы увидим, какие числа соответствуют критериям выбора, чтобы выбрать наибольшее из них. с помощью выражения "Count -" & I в строке заголовка мы укажем, сколько чисел мы уже выбрали для определения максимального значения. счетчик будет увеличиваться с каждым новым значением.

    После того как мы установили UDF, мы применим приведенную ниже формулу к диапазону дат:

    = GetMaxBetween (A1:A6,10,50)

    После нажатия кнопки Enter вы увидите сообщение, как на скриншоте ниже:

    Это первое число в диапазоне A1: A6, которое удовлетворяет критериям: больше 10, но меньше 50.

    После нажатия кнопки OK появляется второе сообщение с числом 14. Остальные числа не соответствуют критериям выбора. Поэтому функция выходит и возвращает наибольшее из двух значений - 17.

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

    Определите точки остановки и выполняйте шаг за шагом

    Вы можете добавить точки останова в код вашей функции, где выполнение кода будет остановлено. Таким образом, вы можете следить за процессом вычисления шаг за шагом. При этом вы можете видеть, как изменяются значения переменных.

    Чтобы добавить точку останова, установите курсор на строку, содержащую оператор, в котором вы хотите сделать паузу. Затем щелкните правой кнопкой мыши и выберите пункт Отладка -> Переключить точку останова или просто нажмите F9 . Вы также можете щелкнуть в нужном месте на вертикальной серой области слева от кода функции.

    Появится красный круг, как показано на скриншоте ниже. Строка кода, в которой расчет будет остановлен, выделена красным цветом.

    Теперь при выполнении функции будет открыто окно редактора VBA. Курсор будет расположен в точке, где вы остановились.

    Если навести курсор мыши на любую из переменных в коде функции, можно увидеть ее текущее значение:

    Нажмите F5, чтобы продолжить расчет.

    Примечание. После точки останова можно начать отслеживать ход вычислений шаг за шагом. Если нажать кнопку F8, будет выполнена только одна следующая строка кода VBA. Желтая линия со стрелкой также переместится на последнюю выполненную позицию кода.

    Поскольку выполнение функции снова приостановлено, вы можете просмотреть текущие значения всех переменных функции с помощью курсора мыши.

    Следующее нажатие F8 сделает один шаг вперед. Таким образом, вы можете нажимать F8 до конца вычисления. Или нажмите F5, чтобы продолжить вычисление до следующей точки останова.

    При возникновении ошибки курсор будет остановлен в той точке кода, где произошла ошибка. Кроме того, вы увидите всплывающее сообщение об ошибке. Это позволяет легко определить причину проблемы.

    Указанные вами точки останова будут действовать до тех пор, пока вы не закроете файл. Когда вы откроете его снова, вам нужно будет установить их снова. Не самый удобный метод, не находите?

    Однако эта проблема может быть решена. Вставьте a Остановить оператор в код функции в нужных местах, и вы можете остановить выполнение программы так же, как и при использовании точек останова.

    Когда VBA сталкивается с Остановить оператор остановит выполнение программы и будет ждать ваших действий. Проверьте значения переменных, затем нажмите F5, чтобы продолжить.

    Или нажмите F8 для пошагового выполнения функции, как описано выше.

    Сайт Остановить Оператор является частью программы и поэтому не удаляется, как в случае с точкой останова. Когда вы закончите отладку, удалите его самостоятельно. Или превратите его в комментарий, заключив его в одинарную кавычку (').

    Отладка с помощью оператора Debug.Print

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

    Пример работы Debug.Print можно увидеть на скриншоте ниже.

    Заявление Debug.Print i, vMax печатает значения и их порядковые номера.

    В окне Immediate вы видите два числа (17 и 14) из выбранного диапазона, который соответствует установленным границам и среди которых будет выбран максимум. Цифры 1 и 2 означают, что функция выполнила 2 цикла, в которых были выбраны числа. Мы видим значения наиболее важных переменных, как мы это делали ранее с MsgBox Но это не остановило функцию.

    Вызов функции из процедуры

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

    Вот как можно вызвать пользовательскую функцию GetMaxBerween из процедуры:

    Sub Test() Dim x x = GetMaxBetween(Range ("A1:A6" ), 10, 50) MsgBox(x) End Sub

    Установите курсор в любом месте кода и нажмите F5. Если в функции нет ошибки, вы увидите всплывающее окно с результатом вычисления.

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

    Вот и все. Теперь вы создали свою надстройку, добавили ее в Excel и можете использовать в ней UDF. Если вы хотите использовать больше UDF, просто напишите код в модуле надстройки в редакторе VBA и сохраните его.

    На этом сегодня все. Мы рассмотрели различные способы отладки пользовательских функций и научились использовать их в рабочей книге. Мы очень надеемся, что эти рекомендации будут вам полезны. Если у вас возникли вопросы, пишите в комментариях к этой статье.

    Майкл Браун — увлеченный технологический энтузиаст, стремящийся упростить сложные процессы с помощью программных инструментов. Имея более чем десятилетний опыт работы в технологической отрасли, он отточил свои навыки в Microsoft Excel и Outlook, а также в Google Sheets и Docs. Блог Майкла посвящен тому, чтобы делиться своими знаниями и опытом с другими, предоставляя простые советы и учебные пособия для повышения производительности и эффективности. Являетесь ли вы опытным профессионалом или новичком, в блоге Майкла вы найдете ценную информацию и практические советы, которые помогут вам максимально эффективно использовать эти важные программные инструменты.