Hindi gumagana ang Excel UDF: mga problema at solusyon

  • Ibahagi Ito
Michael Brown

Sa artikulong ito, titingnan namin ang mga isyu na maaari mong kaharapin kapag gumagamit ng mga custom na function sa iyong mga workbook. Susubukan kong ipakita sa iyo kung ano ang sanhi ng mga ito at kung gaano kadaling malutas ang mga ito.

Narito ang pag-uusapan natin:

    Kanina pa natin napag-usapan kung ano ang a ang custom na function ay, kung paano lumikha at gamitin ito. Kung sa palagay mo ay kailangan mong i-refresh ang pangunahing kaalaman sa mga UDF, huminto muna at tingnan ang aking nakaraang artikulo.

    Bakit hindi muling kinakalkula ang Excel UDF?

    Kapag gumawa ka ng anumang mga pagbabago sa iyong workbook, hindi kakalkulahin ng Excel ang bawat formula na mayroon ka doon. Ia-update nito ang mga resulta para sa mga formula na iyon na naka-link sa mga binagong cell lamang.

    Ngunit ito ay may kinalaman sa karaniwang mga function ng Excel. Tulad ng para sa mga custom, hindi mapapatunayan ng Excel ang VBA code at matukoy ang iba pang mga cell na maaari ring makaapekto sa resulta ng custom na function. Samakatuwid, maaaring hindi magbago ang iyong custom na formula kapag gumawa ka ng mga pagbabago sa workbook.

    Upang ayusin ang isyu, kakailanganin mo lang gamitin ang Application.Volatile na statement. Tingnan ang susunod na kabanata upang matutunan ang sunud-sunod na mga tagubilin sa kung paano ito ilapat.

    Volatile vs non-volatile custom functions

    Bilang default, ang mga custom na function sa Excel ay hindi pabagu-bago. Nangangahulugan ito na ang UDF ay muling kinakalkula kung ang halaga ng alinman sa mga cell na tinutukoy nito ay nagbabago. Ngunit kung ang format ng mga cell, ang pangalan ngworksheet, ang pangalan ng pagbabago ng file, pagkatapos ay walang mga pagbabagong magaganap sa UDF.

    Lumipat tayo mula sa mga salita patungo sa mga halimbawa. Halimbawa, kailangan mong isulat ang pangalan ng iyong workbook sa isang cell. Upang gawin ito, gumawa ka ng custom na function:

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

    Ngayon isipin ang sumusunod na case. Sumulat ka ng custom na formula =WorkbookName() sa cell at nakuha ang pangalan ng file doon. Sa ilang sandali, nagpasya kang palitan ang pangalan ng file at i-save ito gamit ang ibang pangalan. Ngunit titingnan mo ang halaga sa cell at nakita mong hindi ito nagbago. Mayroon pa ring lumang pangalan ng file na hindi na tama.

    Dahil walang mga argumento sa function na ito, ang function ay hindi muling kinalkula (kahit na baguhin mo ang pangalan ng workbook, isara ito, at pagkatapos ay muling buksan ito).

    Tandaan. Upang muling kalkulahin ang lahat ng mga function sa iyong file, maaari mong gamitin ang Ctrl + Alt + F9 shortcut.

    May mas madaling paraan ba? Upang gawing muling pagkalkula ang formula sa tuwing nagbabago ang worksheet, kailangan mo ng karagdagang linya ng code. I-paste ang sumusunod na piraso ng code sa simula ng iyong function:

    Application.Volatile

    Kaya, magiging ganito ang hitsura ng iyong code:

    Function WorkbookName() Bilang String Application.Volatile WorkbookName = ThisWorkbook.Name End Function

    Ngayon ang iyong UDF ay pabagu-bago, kaya awtomatiko itong muling kakalkulahin kung mayroong anumang cell sa worksheetay muling nakalkula o anumang pagbabago ay naganap sa workbook. Sa sandaling baguhin mo ang pangalan ng file, makikita mo kaagad ang update na iyon.

    Tandaan. Pakitandaan na ang masyadong maraming pabagu-bagong function ay maaaring makapagpabagal sa iyong Excel. Pagkatapos ng lahat, napakaraming custom na function na nagsasagawa ng mga kumplikadong kalkulasyon at patuloy na gumagana sa malalaking hanay ng data.

    Samakatuwid, inirerekumenda ko ang paggamit lamang ng volatility kung saan ito talagang kinakailangan.

    Bakit hindi available ang mga custom na function

    Kapag inilagay mo ang mga unang titik ng pangalan ng isang custom na function, ito ay lilitaw sa drop-down na listahan sa tabi ng input cell, tulad ng karaniwang mga function ng Excel.

    Gayunpaman, hindi ito palaging nangyayari. Anong mga pagkakamali ang maaaring magdulot ng sitwasyong ito?

    Kung mayroon kang Excel 2003-2007, hindi kailanman lalabas ang UDF sa listahan ng dropdown. Doon ay makikita mo lamang ang mga karaniwang function.

    Ngunit kahit na gumagamit ka ng mas bagong bersyon ng Excel, may isa pang pagkakamali na maaaring hindi mo sinasadyang gawin.

    Nakikita mo, ang custom na function ay dapat na nasa isang karaniwang VBA module na tinatawag na Modules. Kapag nagdagdag ka ng bagong module para isulat ang function code, awtomatikong gagawin ang isang folder ng Modules kung saan nakasulat ang lahat ng module.

    Ngunit minsan nangyayari na ang isang bagong module ay hindi nililikha. Sa susunod na screenshot makikita mo na ang custom na function code ay nasa module na "Microsoft Excel Objects" kasama ngThisWorkbook.

    Ang punto ay hindi ka makakapaglagay ng custom na function sa area ng code ng isang worksheet o workbook. Sa kasong ito, hindi gagana ang function. Bukod dito, hindi ito lilitaw sa dropdown na listahan ng mga function. Samakatuwid, ang code ay dapat palaging nasa folder na Mga Module .

    Hindi ipinapakita ang text ng tulong sa custom na function ng Excel

    Ang isa pang problema ay maaaring mangyari ay ang pahiwatig na nakikita mo kapag nag-paste ka isang custom na function. Kung gagamit ka ng karaniwang function, palagi kang makakakita ng tooltip para sa function at para sa mga argumento nito. Ngunit paano ang mga UDF?

    Kung marami kang custom na function, magiging lubhang mahirap para sa iyo na matandaan kung anong mga kalkulasyon ang ginagawa ng bawat isa sa kanila. Mas magiging mahirap na tandaan kung aling mga argumento ang gagamitin. Sa tingin ko, magandang ideya na magkaroon ng paglalarawan ng iyong mga custom na function bilang paalala.

    Para dito, iminumungkahi kong gamitin ang pamamaraang Application.MacroOptions . Makakatulong ito sa iyo na ipakita ang paglalarawan ng hindi lamang ng function kundi pati na rin ng bawat argument nito sa window ng Function Wizard. Makikita mo ang window na ito kapag na-click mo ang Fx button sa formula bar.

    Tingnan natin kung paano magdagdag ng gayong pahiwatig sa iyong mga UDF. Sa nakaraang artikulo ay tiningnan namin ang GetMaxBetween custom function. Hinahanap nito ang maximum na numero sa tinukoy na hanay at tumatagal ng tatlong argumento: isang hanay ng mga numeric na halaga, at isang maximum at minimum na halaga sahanapin.

    Ngayon, magdaragdag kami ng paglalarawan para sa custom na function na ito. Upang gawin ito, gawin at patakbuhin ang command na Application.MacroOptions . Para sa function na GetMaxBetween , maaari mong patakbuhin ang sumusunod na command:

    Sub RegisterUDF () Dim strFuncName As String 'pangalan ng function na gusto mong irehistro Dim strDescr As String ' paglalarawan ng function mismo Dim strArgs () Bilang String 'paglalarawan ng mga argumento ng function ' Magrehistro GetMaxBetween function ReDim strArgs (1 Hanggang 3) 'Bilang ng mga argumento sa iyong function strFuncName = "GetMaxBetween" strDescr = "Maximum na numero sa tinukoy na hanay" = strArgs (1) = "Range of numeric values" strArgs (2) = "Lower interval border " strArgs (3) = " Upper interval border " Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub

    o

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Paglalarawan: = "Maximum na numero sa tinukoy na hanay" , _ Kategorya: = "Aking Mga Custom na Function" , _ ArgumentDescriptions: = Array (_ "Range of numeric values" , _ "Lower interval bor der" , _ "Upper interval border" ) End Sub

    Variable str FuncName ay ang pangalan ng function. strDescr - paglalarawan ng function. Ang mga variable na strArgs ay naglalaman ng mga pahiwatig para sa bawat argumento.

    Maaari kang magtaka kung ano ang pang-apat na argumentoApplication.MacroOptions. Ang opsyonal na argument na ito ay pinangalanang Kategorya at ipinapahiwatig ang klase ng mga function ng Excel kung saan ilalagay ang aming custom na GetMaxBetween () function. Maaari mo itong pangalanan sa alinman sa mga kasalukuyang kategorya: Math & ; Trig, Statistical, Logical, atbp. Maaari kang tumukoy ng pangalan para sa bagong kategorya kung saan ilalagay mo ang mga function na iyong nilikha. Kung hindi mo gagamitin ang argumentong Kategorya, awtomatikong ilalagay ang custom na function sa kategoryang "Tukoy ng User."

    I-paste ang code ng function sa window ng module:

    Pagkatapos ay mag-click sa pindutang “Run”. Gagawin ng command ang lahat ng setting para sa paggamit ng button na Fx sa iyong GetMaxBetween() function.

    Kung susubukan mong magpasok ng function sa isang cell gamit ang Insert Function tool, makikita mo na ang iyong GetMaxBetween function ay nasa kategoryang "My Custom Functions":

    Ikaw maaari nang simulan ang pag-type ng pangalan ng function sa cell at makikita mo ang iyong custom na function sa dropdown na listahan ng mga function na pipiliin.

    Pagkatapos ay tawagan ang Function Wizard gamit ang Fx button.

    Tip. Maaari mo ring gamitin ang key combination na CRTL + A upang buksan ang Function Wizard.

    Sa window ng Function Wizard makikita mo ang isang paglalarawan ng iyong function, pati na rin ang isang pahiwatig para sa unang argumento. Kung ilalagay mo ang iyong cursor sa ibabaw ngpangalawa o pangatlong argumento, makakakita ka rin ng mga pahiwatig para sa kanila.

    Kung gusto mong baguhin ang text ng mga pahiwatig na ito, baguhin ang mga value ng strDescr at strArgs mga variable sa RegisterUDF () code. Pagkatapos ay patakbuhin muli ang RegisterUDF () command.

    Kung gusto mong i-undo ang lahat ng ginawang setting at i-clear ang paglalarawan ng function, patakbuhin ang code na ito:

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

    May isa pang paraan para makakuha ng hint kapag nagpasok ka ng custom na function. Ilagay ang pangalan ng function at pagkatapos ay pindutin ang Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Makakakita ka ng listahan ng lahat ng argumento ng function:

    Sa kasamaang palad, dito hindi mo makikita ang paglalarawan ng function at ang mga argumento nito. Ngunit kung ang mga pangalan ng mga argumento ay medyo nagbibigay-kaalaman, kaya maaaring makatulong din ang mga ito. Gayunpaman, ito ay mas mahusay kaysa sa wala :)

    Kailanganin ng kaunti pang trabaho upang lumikha ng intellisense para sa mga UDF na gumagana tulad ng karaniwang mga function ng Excel. Sa kasamaang palad, ang Microsoft ay hindi nagbibigay ng anumang mga pagpipilian. Ang tanging solusyon na magagamit ay kasalukuyang isang Excel-DNA IntelliSense extension. Makakahanap ka ng higit pang impormasyon sa website ng developer.

    Sana, makakatulong sa iyo ang mga alituntuning ito na malutas ang mga problema kapag hindi gumana o hindi gumana ang iyong custom na function.magtrabaho ayon sa gusto mo. Kung gayunpaman, hindi pa rin gumana ang iyong UDF, pakilarawan nang tumpak ang iyong isyu sa seksyon ng Mga Komento. Susubukan naming alamin ito at hanapin ang solusyon para sa iyo ;)

    Si Michael Brown ay isang dedikadong mahilig sa teknolohiya na may hilig sa pagpapasimple ng mga kumplikadong proseso gamit ang mga tool sa software. Sa higit sa isang dekada ng karanasan sa industriya ng tech, hinasa niya ang kanyang mga kasanayan sa Microsoft Excel at Outlook, pati na rin ang Google Sheets at Docs. Ang blog ni Michael ay nakatuon sa pagbabahagi ng kanyang kaalaman at kadalubhasaan sa iba, na nagbibigay ng madaling sundan na mga tip at mga tutorial para sa pagpapabuti ng pagiging produktibo at kahusayan. Isa ka mang batikang propesyonal o baguhan, nag-aalok ang blog ni Michael ng mahahalagang insight at praktikal na payo para masulit ang mahahalagang software tool na ito.