Excel UDF не працуе: праблемы і рашэнні

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

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

Вось пра што мы пагаворым:

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

    Чаму Excel UDF не пералічвае?

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

    Але гэта тычыцца стандартных функцый Excel. Што тычыцца карыстальніцкіх, Excel не можа праверыць код VBA і вызначыць іншыя ячэйкі, якія таксама могуць паўплываць на вынік карыстацкай функцыі. Такім чынам, ваша карыстальніцкая формула можа не змяніцца, калі вы ўносіце змены ў кнігу.

    Каб выправіць праблему, вам проста трэба будзе выкарыстаць аператар Application.Volatile . Праверце наступны раздзел, каб даведацца пакрокавыя інструкцыі аб тым, як яго прымяняць.

    Незалежныя і энерганезалежныя карыстальніцкія функцыі

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

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

    Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function

    А цяпер уявіце наступны выпадак. Вы запісалі карыстальніцкую формулу =WorkbookName() у ячэйку і атрымалі там назву файла. Праз некаторы час вы вырашылі перайменаваць файл і захавалі яго пад іншым імем. Але вы глядзіце на значэнне ў вочку і бачыце, што яно не змянілася. Па-ранейшаму ёсць старое імя файла, якое больш не адпавядае рэчаіснасці.

    Паколькі ў гэтай функцыі няма аргументаў, функцыя не пералічваецца (нават калі вы зменіце імя працоўнай кнігі, зачыніце яе і потым зноў адкрыеце гэта).

    Заўвага. Каб пералічыць усе функцыі ў вашым файле, вы можаце выкарыстоўваць спалучэнне клавіш Ctrl + Alt + F9.

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

    Application.Volatile

    Такім чынам, ваш код будзе выглядаць так:

    Функцыя WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    Цяпер ваш UDF з'яўляецца зменлівым, таму ён будзе аўтаматычна пералічаны ў любой ячэйцы працоўнага аркушабыў пераразлічаны або адбыліся якія-небудзь змены ў працоўнай кніжцы. Як толькі вы зменіце назву файла, вы адразу ўбачыце гэтае абнаўленне.

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

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

    Чаму карыстальніцкія функцыі недаступныя

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

    Аднак гэта адбываецца не заўсёды. Якія памылкі могуць выклікаць гэтую сітуацыю?

    Калі ў вас Excel 2003-2007, UDF ніколі не з'яўляецца ў выпадальным спісе. Там вы бачыце толькі стандартныя функцыі.

    Але нават калі вы выкарыстоўваеце больш новую версію Excel, ёсць іншая памылка, якую вы можаце выпадкова зрабіць.

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

    Але часам здараецца, што новы модуль не ствараецца. На наступным скрыншоце вы бачыце, што карыстальніцкі код функцыі знаходзіцца ў модулі «Аб'екты Microsoft Excel» разам зThisWorkbook.

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

    Тэкст даведкі карыстальніцкай функцыі Excel не адлюстроўваецца

    Можа ўзнікнуць яшчэ адна праблема: падказка, якую вы бачыце пры ўстаўцы карыстацкая функцыя. Калі вы выкарыстоўваеце стандартную функцыю, вы заўсёды будзеце бачыць падказку для функцыі і яе аргументаў. Але як наконт UDF?

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

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

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

    Цяпер мы дадамо апісанне гэтай карыстальніцкай функцыі. Для гэтага стварыце і выканайце каманду Application.MacroOptions . Для функцыі GetMaxBetween вы можаце выканаць наступную каманду:

    Sub RegisterUDF () Dim strFuncName As String 'імя функцыі, якую вы хочаце зарэгістраваць Dim strDescr As String ' апісанне функцыі сябе Dim strArgs () As String 'апісанне аргументаў функцыі ' Register GetMaxBetween function ReDim strArgs (1 To 3) 'Колькасць аргументаў у вашай функцыі strFuncName = "GetMaxBetween" strDescr = "Максімальная колькасць у паказаным дыяпазоне" strArgs (1) = "Дыяпазон лікавых значэнняў" strArgs (2) = "Ніжняя мяжа інтэрвалу " strArgs (3) = " Верхняя мяжа інтэрвалу " Application.MacroOptions Macro: = strFuncName, _ Апісанне: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Мае карыстальніцкія функцыі " End Sub

    or

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Максімальная колькасць у зададзеным дыяпазоне" , _ Category: = "Мой Карыстальніцкія функцыі" , _ ArgumentDescriptions: = Масіў (_ "Дыяпазон лікавых значэнняў" , _ "Бор ніжняга інтэрвалу der" , _ "Верхняя мяжа інтэрвалу" ) End Sub

    Пераменная str FuncName - гэта імя функцыі. strDescr - апісанне функцыі. Зменныя strArgs утрымліваюць падказкі для кожнага аргумента.

    Вы можаце задацца пытаннем, які чацвёрты аргумент дляApplication.MacroOptions. Гэты неабавязковы аргумент называецца Катэгорыя і паказвае клас функцый Excel, у які будзе змешчана наша карыстальніцкая функцыя GetMaxBetween () . Вы можаце назваць яго ў адпаведнасці з любой з існуючых катэгорый: Math & ; Trig, Statistical, Logical і г. д. Вы можаце вызначыць імя для новай катэгорыі, у якую вы будзеце размяшчаць створаныя вамі функцыі. Калі вы не выкарыстоўваеце аргумент "Катэгорыя", карыстальніцкая функцыя будзе аўтаматычна змешчана ў катэгорыю "Вызначана карыстальнікам".

    Устаўце код функцыі ў акно модуля:

    Затым націсніце на кнопку «Выканаць». Каманда выканае ўсе налады для выкарыстання кнопкі Fx з вашай функцыяй GetMaxBetween() .

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

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

    Затым выклічце Майстар функцый кнопкай Fx.

    Савет. Вы таксама можаце выкарыстоўваць камбінацыю клавіш CRTL + A, каб адкрыць майстар функцый.

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

    Калі вы хочаце змяніць тэкст гэтых падказак, змяніце значэнні strDescr і strArgs зменныя ў кодзе RegisterUDF () . Затым запусціце каманду RegisterUDF () яшчэ раз.

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

    Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub

    Ёсць яшчэ адзін спосаб атрымаць падказку пры ўводзе карыстальніцкай функцыі. Увядзіце назву функцыі і націсніце Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Вы ўбачыце спіс усіх аргументаў функцыі:

    На жаль, тут вы не ўбачыце апісання функцыі і яе аргументаў. Але калі назвы аргументаў даволі інфарматыўныя, яны таксама могуць быць карыснымі. Тым не менш, гэта лепш, чым нічога :)

    Каб стварыць intellisense для UDF, якія працуюць як стандартныя функцыі Excel, спатрэбіцца крыху больш працы. На жаль, Microsoft не дае ніякіх варыянтаў. Адзіным даступным рашэннем на дадзены момант з'яўляецца пашырэнне Excel-DNA IntelliSense. Вы можаце знайсці дадатковую інфармацыю на вэб-сайце распрацоўшчыка.

    Спадзяемся, што гэтыя рэкамендацыі дапамогуць вам вырашыць праблемы, калі ваша карыстацкая функцыя не працуе або не працуепрацаваць, як вы хочаце. Аднак калі ваша UDF па-ранейшаму не працуе, дакладна апішыце праблему ў раздзеле каментарыяў. Мы паспрабуем разабрацца і знайсці для вас рашэнне ;)

    Майкл Браўн - адданы энтузіяст тэхналогій, які любіць спрашчэнне складаных працэсаў з дапамогай праграмных інструментаў. Маючы больш чым дзесяцігадовы досвед працы ў індустрыі тэхналогій, ён удасканальваў свае навыкі ў Microsoft Excel і Outlook, а таксама ў Google Sheets і Docs. Блог Майкла прысвечаны таму, каб падзяліцца сваімі ведамі і вопытам з іншымі, даючы простыя ў выкананні парады і падручнікі для павышэння прадукцыйнасці і эфектыўнасці. Незалежна ад таго, з'яўляецеся вы дасведчаным прафесіяналам або пачаткоўцам, блог Майкла прапануе каштоўную інфармацыю і практычныя парады, каб атрымаць максімальную аддачу ад гэтых неабходных праграмных інструментаў.