Даведайцеся, як адладжваць карыстальніцкія функцыі ў Excel

  • Падзяліцца Гэтым
Michael Brown

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

Каб вырашыць некаторыя праблемы пры стварэнні карыстальніцкай функцыі, вам, хутчэй за ўсё, спатрэбіцца запусціць адладку. Тады вы можаце быць упэўнены, што функцыя працуе правільна.

Мы вывучым наступныя метады адладкі:

    Калі вы ствараеце карыстальніцкую функцыю, заўсёды ёсць магчымасць што вы зробіце памылку. Карыстальніцкія функцыі звычайна даволі складаныя. І не заўсёды яны пачынаюць правільна працаваць. Формула можа вярнуць няправільны вынік або #VALUE! памылка. У адрозненне ад стандартных функцый Excel, вы не ўбачыце іншых паведамленняў.

    Ці ёсць спосаб крок за крокам прайсці карыстальніцкую функцыю, каб праверыць, як працуе кожны з яе аператараў? Вядома! Для гэтага выкарыстоўваецца адладка.

    Я прапаную вам некалькі спосабаў адладкі вашай карыстальніцкай функцыі, каб вы маглі выбраць той, які працуе для вас.

    У якасці прыкладу мы выкарыстоўваем карыстальніцкую функцыю GetMaxBetween з аднаго з нашых папярэдніх артыкулаў, у якім вылічваецца максімальная колькасць у зададзеным дыяпазоне значэнняў:

    Функцыя GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) для кожнага NumRange у 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(запыт [, кнопкі] [, назва] [, файл даведкі, кантэкст])

    запыт з'яўляецца абавязковым аргументам. Ён змяшчае паведамленне, якое вы бачыце ў дыялогавым акне. Яго таксама можна выкарыстоўваць для адлюстравання значэнняў асобных зменных.

    Усе астатнія аргументы неабавязковыя.

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

    [ title ] - тут вы можаце ўказаць назву акна паведамлення.

    Давайце пераключымся з словы для практыкі і пачатку адладкі. Для адлюстраванняпаведамленне, дадайце наступны радок да кода вызначанай карыстальнікам функцыі GetMaxBetween перад аператарам Case Else :

    MsgBox vMax,, "Count -" & i

    Вось што мы атрымаем у выніку:

    Функцыя GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) Для кожнага NumRange у 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 у дыялогавым акне, мы ўбачым, якія лічбы адпавядаюць крытэрам выбару, таму што мы можам выбраць самы вялікі з іх. З выразам "Палічыць -" & I у радку загалоўка мы паказваем, колькі лікаў мы ўжо выбралі для вызначэння максімальнага значэння. Лічыльнік будзе павялічвацца з кожным новым значэннем.

    Пасля ўсталявання UDF мы прымяняем наступную формулу да дыяпазону дат:

    = GetMaxBetween (A1:A6,10,50)

    Пасля кнопкі Enter націснутая, вы ўбачыце паведамленне, як на скрыншоце ніжэй:

    Гэта першы лік у дыяпазоне A1: A6, які адпавядае крытэрам: больш за 10, але менш чым 50.

    Пасля таго як вы націснеце ОК, з'явіцца другое паведамленне з лічбай 14. Астатнія лічбы не адпавядаюць выбарукрытэрыі. Такім чынам, функцыя выходзіць і вяртае самае вялікае з двух значэнняў, 17.

    Функцыя MsgBox можа быць выкарыстана ў самых важных месцах вашай карыстальніцкай функцыі, каб кантраляваць, як значэнні змены асобных зменных. Скрыні паведамленняў могуць быць вельмі карысныя, калі ў вас ёсць вялікая функцыя і шмат вылічэнняў. У гэтым выпадку вам будзе лёгка вызначыць, у якой частцы кода ўзнікае памылка.

    Вызначце кропкі прыпынку і выканайце крок за крокам

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

    Каб дадаць кропку прыпынку, пастаўце курсор на радок, які змяшчае аператар, у якім вы вырашылі прыпыніць. Затым пстрыкніце правай кнопкай мышы і абярыце Debug -> Пераключыце кропку прыпынку або проста націсніце F9. Вы таксама можаце націснуць у патрэбным месцы на вертыкальнай шэрай вобласці злева ад кода функцыі.

    З'явіцца чырвоны круг, як вы можаце бачыць на скрыншоце ніжэй. Радок кода, у якім будзе спынены разлік, вылучаны чырвоным колерам.

    Цяпер акно рэдактара VBA будзе адкрыта, калі функцыя працуе. Курсор будзе размешчаны ў месцы, дзе вы спыніліся.

    Калі вы навядзеце курсор мышы на любую са зменных у кодзе функцыі, вы можаце ўбачыць іх бягучыvalue:

    Націсніце F5, каб працягнуць разлік.

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

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

    Наступнае націсканне F8 прывядзе нас на крок наперад . Такім чынам, вы можаце націскаць F8 да канца разліку. Або націсніце клавішу F5, каб працягнуць разлік да наступнай кропкі супыну.

    Калі ўзнікае памылка, курсор спыняецца ў месцы кода, дзе адбылася памылка. І вы таксама ўбачыце ўсплывальнае паведамленне пра памылку. Гэта дазваляе лёгка вызначыць прычыну праблемы.

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

    Аднак гэтую праблему можна вырашыць. Устаўце аператар Stop у код функцыі ў патрэбных месцах, і вы зможаце спыніць выкананне праграмы гэтак жа, як і пры выкарыстанні кропак прыпынку.

    Калі VBA сустракае аператар Stop , ён спыняе выкананне праграмы і чакае вашых дзеянняў. Затым праверце значэнні зменныхнацісніце F5, каб працягнуць.

    Або націсніце F8, каб выканаць функцыю крок за крокам, як апісана вышэй.

    Аператар Стоп з'яўляецца часткай праграмы і таму не выдаляецца, як у выпадку з кропкай прыпынку. Калі вы скончыце адладку, выдаліце ​​​​яго самастойна. Або ператварыце яго ў каментарый, паставіўшы перад ім адзінарнае двукоссе (').

    Адладка з выкарыстаннем аператара Debug.Print

    Вы можаце размясціць Debug.Print у код функцыі ў патрэбным месцы. Гэта карысна для праверкі значэнняў зменных, якія цыклічна змяняюцца.

    Вы можаце ўбачыць прыклад прадукцыйнасці Debug.Print на скрыншоце ніжэй.

    Аператар Debug.Print i, vMax друкуе значэнні і іх парадкавыя нумары.

    У акне Immediate вы бачыце два лікі (17 і 14) з выбранага дыяпазону, які адпавядае ўсталяваць ліміты і сярод якіх будзе абраны максімум. Лічбы 1 і 2 азначаюць, што функцыя завяршыла 2 цыклы, у якіх былі выбраны лікі. Мы бачым значэнні найбольш важных зменных, як мы рабілі раней з MsgBox . Але гэта не спыніла функцыю.

    Выклік функцыі з працэдуры

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

    Вось як вы можаце выклікаць вызначаную карыстальнікам функцыю GetMaxBerween зprocedure:

    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. Блог Майкла прысвечаны таму, каб падзяліцца сваімі ведамі і вопытам з іншымі, даючы простыя ў выкананні парады і падручнікі для павышэння прадукцыйнасці і эфектыўнасці. Незалежна ад таго, з'яўляецеся вы дасведчаным прафесіяналам або пачаткоўцам, блог Майкла прапануе каштоўную інфармацыю і практычныя парады, каб атрымаць максімальную аддачу ад гэтых неабходных праграмных інструментаў.