"Excel" UDF neveikia: problemos ir sprendimai

  • Pasidalinti
Michael Brown

Šiame straipsnyje apžvelgsime problemas, su kuriomis galite susidurti naudodami pasirinktines funkcijas savo darbalaukiuose. Pabandysiu parodyti, dėl ko jos kyla ir kaip lengvai jas galima išspręsti.

Štai apie ką kalbėsime:

    Anksčiau kalbėjome apie tai, kas yra pasirinktinė funkcija, kaip ją sukurti ir naudoti. Jei manote, kad prieš tai reikia atnaujinti pagrindines žinias apie UDF, stabtelėkite ir peržiūrėkite ankstesnį mano straipsnį.

    Kodėl "Excel" UDF neperskaičiuoja?

    Atlikus bet kokius pakeitimus darbaknygėje, "Excel" neperskaičiuos kiekvienos ten esančios formulės. Ji atnaujins tik tų formulių, kurios yra susijusios su pakeistomis ląstelėmis, rezultatus.

    Tačiau tai susiję su standartinėmis "Excel" funkcijomis. Kalbant apie pasirinktines funkcijas, "Excel" negali patvirtinti VBA kodo ir nustatyti kitų ląstelių, kurios taip pat gali turėti įtakos pasirinktinės funkcijos rezultatui. Todėl jūsų pasirinktinė formulė gali nepasikeisti, kai pakeisite darbo knygą.

    Norint išspręsti šią problemą, tereikia naudoti Taikymas.Lakus Pareiškimas. Kitame skyriuje rasite išsamius nurodymus, kaip jį taikyti.

    Einamųjų ir neeinamųjų pasirinktinių funkcijų palyginimas

    Pagal numatytuosius nustatymus "Excel" pasirinktinės funkcijos nėra nepastovios. Tai reiškia, kad UDF perskaičiuojama tik tada, jei pasikeičia bet kurios ląstelės, į kurią ji nurodo, vertė. Tačiau jei pasikeičia ląstelių formatas, darbalapio pavadinimas, failo pavadinimas, UDF nebus keičiama.

    Nuo žodžių pereikime prie pavyzdžių. Pavyzdžiui, jums reikia ląstelėje užrašyti darbo knygos pavadinimą. Tam sukuriama pasirinktinė funkcija:

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

    Dabar įsivaizduokite tokį atvejį. Parašėte pasirinktinę formulę =Darbo knygos pavadinimas() į langelį ir jame gavote failo pavadinimą. Po kurio laiko nusprendėte pervadinti failą ir išsaugojote jį kitu pavadinimu. Tačiau pažvelgėte į langelio reikšmę ir pamatėte, kad ji nepasikeitė. Vis dar yra senasis failo pavadinimas, kuris nebetinka.

    Kadangi šioje funkcijoje nėra argumentų, funkcija nėra perskaičiuojama (net jei pakeisite sąsiuvinio pavadinimą, jį uždarysite ir vėl atidarysite).

    Pastaba. Norėdami perskaičiuoti visas savo failo funkcijas, galite naudoti spartųjį klavišą Ctrl + Alt + F9.

    Ar yra paprastesnis būdas? Kad formulė perskaičiuotų kiekvieną kartą, kai pasikeičia darbalapis, reikia papildomos kodo eilutės. Funkcijos pradžioje įklijuokite šią kodo dalį:

    Taikymas.Lakus

    Taigi, jūsų kodas atrodys taip:

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

    Dabar jūsų UDF yra nepastovus, todėl jis bus automatiškai perskaičiuojamas, jei bus perskaičiuota bet kuri darbalapio ląstelė arba jei darbaknygėje įvyks koks nors pakeitimas. Kai tik pakeisite failo pavadinimą, iš karto pamatysite šį atnaujinimą.

    Pastaba. Atminkite, kad per daug nepastovių funkcijų gali sulėtinti "Excel" darbą. Juk yra per daug pasirinktinių funkcijų, kurios atlieka sudėtingus skaičiavimus ir nuolat veikia didelius duomenų intervalus.

    Todėl rekomenduoju nepastovumą naudoti tik ten, kur jo tikrai reikia.

    Kodėl negalima naudoti pasirinktinių funkcijų

    Įvedus pirmąsias pasirinktinės funkcijos pavadinimo raides, ji bus rodoma šalia įvesties langelio esančiame išskleidžiamajame sąraše, kaip ir standartinės "Excel" funkcijos.

    Tačiau taip nutinka ne visada. Kokios klaidos gali sukelti tokią situaciją?

    Jei naudojate "Excel 2003-2007", UDF niekada nerodoma išskleidžiamajame sąraše. Jame matomos tik standartinės funkcijos.

    Tačiau net jei naudojate naujesnę "Excel" versiją, galite netyčia padaryti dar vieną klaidą.

    Matote, pasirinktinė funkcija turi būti standartiniame VBA modulyje, vadinamame Modules (moduliai). Kai pridedate naują modulį funkcijos kodui įrašyti, automatiškai sukuriamas aplankas Modules (moduliai), į kurį įrašomi visi moduliai.

    Tačiau kartais pasitaiko, kad naujas modulis nesukuriamas. Kitoje ekrano kopijoje matote, kad pasirinktinės funkcijos kodas yra modulyje "Microsoft Excel Objects" kartu su ThisWorkbook.

    Esmė ta, kad pasirinktinės funkcijos negalite patalpinti darbalapio ar sąsiuvinio kodo srityje. Tokiu atveju funkcija neveiks. Be to, ji nebus rodoma išskleidžiamajame funkcijų sąraše. Todėl kodas visada turi būti aplanke Moduliai .

    Nerodomas "Excel" pasirinktinės funkcijos pagalbos tekstas

    Kita problema gali kilti dėl užuominos, kurią matote įkėlę pasirinktinę funkciją. Jei naudojate standartinę funkciją, visada matysite funkcijos ir jos argumentų užuominą. O kaip dėl UDF?

    Jei turite daug pasirinktinių funkcijų, bus labai sunku prisiminti, kokius skaičiavimus atlieka kiekviena iš jų. Dar sunkiau bus prisiminti, kokius argumentus naudoti. Manau, kad būtų gerai turėti pasirinktinių funkcijų aprašymą kaip priminimą.

    Šiuo atveju siūlyčiau naudoti Application.MacroOptions metodas. Jis padės parodyti ne tik funkcijos, bet ir kiekvieno jos argumento aprašymą funkcijos vedlio lange. Šį langą pamatysite, kai formulės juostoje spustelėsite mygtuką Fx.

    Pažiūrėkime, kaip tokią užuominą įtraukti į savo UDF. Ankstesniame straipsnyje apžvelgėme pasirinktinę funkciją GetMaxBetween. Ji suranda didžiausią skaičių nurodytame intervale ir priima tris argumentus: skaitinių reikšmių intervalą ir didžiausią bei mažiausią ieškomą reikšmę.

    Dabar pridėsime šios pasirinktinės funkcijos aprašymą. Norėdami tai padaryti, sukurkite ir paleiskite Application.MacroOptions komandą. Dėl GetMaxBetween funkciją, galite paleisti šią komandą:

    Sub RegisterUDF () Dim strFuncName As String 'norimos registruoti funkcijos pavadinimas Dim strDescr As String ' pačios funkcijos aprašymas Dim strArgs () As String 'funkcijos argumentų aprašymas ' Registruokite funkciją GetMaxBetween ReDim strArgs (1 To 3) 'Jūsų funkcijos argumentų skaičius strFuncName = "GetMaxBetween" strDescr = "Maksimalus skaičius nurodytame intervale" strArgs (1) ="Skaitmeninių reikšmių diapazonas" strArgs (2) = "Apatinė intervalo riba" strArgs (3) = "Viršutinė intervalo riba" Application.MacroOptions Macro: = strFuncName, _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " Mano pasirinktinės funkcijos " End Sub

    arba

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Didžiausias skaičius nurodytame intervale" , _ Category: = "Mano pasirinktinės funkcijos" , _ ArgumentDescriptions: = Array (_ "Skaitmeninių reikšmių intervalas" , _ "Apatinė intervalo riba" , _ "Viršutinė intervalo riba" ) End Sub

    Kintamas str FuncName yra funkcijos pavadinimas. strDescr - funkcijos aprašymas. strArgs kintamuosiuose pateikiamos kiekvieno argumento užuominos.

    Jums gali kilti klausimas, koks yra ketvirtasis argumentas į Application.MacroOptions. Šis neprivalomas argumentas pavadintas Kategorija ir nurodo "Excel" funkcijų klasę, kurią mūsų pasirinktinis GetMaxBetween () Funkcija bus patalpinta. Ją galite pavadinti bet kuria iš esamų kategorijų: Math & amp; Trig, Statistical, Logical ir t. t. Galite nurodyti naujos kategorijos, į kurią patalpinsite sukurtas funkcijas, pavadinimą. Jei nenaudojate argumento Category, pasirinktinė funkcija bus automatiškai patalpinta į kategoriją "User Defined".

    Įkelkite funkcijos kodą į modulio langą:

    Tada spustelėkite mygtuką "Paleisti". Komanda atliks visus nustatymus, skirtus naudoti Fx mygtuką su savo GetMaxBetween() funkcija.

    Jei bandote įterpti funkciją į ląstelę naudodami Įterpimo funkcija įrankis, pamatysite, kad yra jūsų GetMaxBetween funkcija yra kategorijoje "Mano pasirinktinės funkcijos":

    Galite tiesiog pradėti rašyti funkcijos pavadinimą į langelį ir išskleidžiamajame funkcijų sąraše pamatysite savo pasirinktinę funkciją.

    Tada skambinkite į Funkcijų vedlys su mygtuku Fx.

    Patarimas. Funkcijų vedlį taip pat galite atidaryti naudodami klavišų kombinaciją CRTL + A.

    Į Funkcijų vedlys lange pamatysite savo funkcijos aprašymą ir užuominą apie pirmąjį argumentą. Jei žymeklį užvesite ant antrojo ar trečiojo argumento, taip pat pamatysite užuominą apie juos.

    Jei norite pakeisti šių užuominų tekstą, pakeiskite reikšmes strDescr ir strArgs kintamieji RegisterUDF () kodą. Tada paleiskite RegisterUDF () dar kartą įveskite komandą.

    Jei norite atšaukti visus atliktus nustatymus ir išvalyti funkcijos aprašymą, paleiskite šį kodą:

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

    Yra dar vienas būdas gauti užuominą, kai įvedate pasirinktinę funkciją. Įveskite funkcijos pavadinimą ir paspauskite Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Pamatysite visų funkcijos argumentų sąrašą:

    Deja, čia nematysite funkcijos ir jos argumentų aprašymo. Bet jei argumentų pavadinimai yra gana informatyvūs, todėl jie taip pat gali būti naudingi. Vis dėlto tai geriau nei nieko :)

    Norint sukurti UDF, veikiančių kaip standartinės "Excel" funkcijos, intellisense, reikės šiek tiek daugiau darbo. Deja, "Microsoft" nepateikia jokių galimybių. Šiuo metu vienintelis galimas sprendimas yra "Excel-DNA IntelliSense" plėtinys. Daugiau informacijos rasite kūrėjo svetainėje.

    Tikimės, kad šios gairės padės jums išspręsti problemas, kai jūsų pasirinktinė funkcija neveikia arba veikia ne taip, kaip norėtumėte. Jei vis dėlto jūsų UDF vis tiek neveikia, tiksliai aprašykite savo problemą komentarų skiltyje. Pasistengsime ją išsiaiškinti ir rasti sprendimą ;)

    Michaelas Brownas yra atsidavęs technologijų entuziastas, mėgstantis supaprastinti sudėtingus procesus naudojant programinės įrangos įrankius. Turėdamas daugiau nei dešimtmetį patirtį technologijų pramonėje, jis patobulino savo įgūdžius „Microsoft Excel“ ir „Outlook“, taip pat „Google“ skaičiuoklėse ir dokumentuose. Michaelio tinklaraštis skirtas dalytis savo žiniomis ir patirtimi su kitais, jame pateikiami lengvai įgyvendinami patarimai ir vadovėliai, kaip pagerinti produktyvumą ir efektyvumą. Nesvarbu, ar esate patyręs profesionalas, ar pradedantysis, Michaelo tinklaraštyje rasite vertingų įžvalgų ir praktinių patarimų, kaip išnaudoti visas šių pagrindinių programinės įrangos įrankių galimybes.