Excel UDF virkar ekki: vandamál og lausnir

  • Deildu Þessu
Michael Brown

Í þessari grein munum við skoða vandamálin sem þú gætir lent í þegar þú notar sérsniðnar aðgerðir í vinnubókunum þínum. Ég mun reyna að sýna þér hvað veldur þeim og hversu auðvelt er að leysa þau.

Hér er það sem við munum tala um:

    Áður ræddum við hvað sérsniðin aðgerð er, hvernig á að búa til og nota hana. Ef þér finnst þú þurfa að hressa upp á grunnþekkingu UDFs fyrirfram skaltu gera hlé og skoða fyrri greinina mína.

    Hvers vegna endurreikna Excel UDF ekki?

    Þegar þú gerir einhverjar breytingar á vinnubókina þína mun Excel ekki endurreikna hverja og eina formúlu sem þú hefur þar. Það mun aðeins uppfæra niðurstöðurnar fyrir þær formúlur sem eru tengdar við breyttar frumur.

    En þetta varðar staðlaðar Excel aðgerðir. Eins og fyrir sérsniðnu sjálfur getur Excel ekki staðfest VBA kóðann og auðkennt aðrar frumur sem gætu einnig haft áhrif á niðurstöðu sérsniðnu aðgerðarinnar. Þess vegna gæti sérsniðna formúlan þín ekki breyst þegar þú gerir breytingar á vinnubókinni.

    Til að laga málið þarftu bara að nota Application.Volatile yfirlýsinguna. Skoðaðu næsta kafla til að læra skref-fyrir-skref leiðbeiningar um hvernig á að beita því.

    Rokgjarnar vs óstöðugar sérsniðnar aðgerðir

    Sjálfgefið er að sérsniðnar aðgerðir í Excel eru ekki rokgjarnar. Þetta þýðir að UDF er aðeins endurreiknað ef gildi einhverra frumna sem það vísar til breytist. En ef sniðið á frumunum, nafnið ávinnublaði, nafni skráarbreytingarinnar, þá munu engar breytingar eiga sér stað í UDF.

    Við skulum skipta úr orðum yfir í dæmi. Til dæmis þarftu að skrifa niður nafn vinnubókarinnar í reit. Til að gera þetta, býrðu til sérsniðna aðgerð:

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

    Ímyndaðu þér nú eftirfarandi tilvik. Þú skrifaðir sérsniðna formúlu =WorkbookName() inn í reitinn og fékkst skráarnafnið þar. Eftir smá stund ákvaðstu að endurnefna skrána og vistaðir hana með öðru nafni. En þú horfir á gildið í reitnum og sér að það hefur ekki breyst. Enn er gamalt skráarnafn sem er ekki lengur rétt.

    Þar sem engin rök eru í þessari aðgerð er aðgerðin ekki endurreiknuð (jafnvel þótt þú breytir nafni vinnubókarinnar, lokar henni og opnar svo aftur það).

    Athugið. Til að endurreikna allar aðgerðir í skránni þinni geturðu notað flýtileiðina Ctrl + Alt + F9.

    Er til auðveldari leið? Til að gera formúluna endurreikna í hvert sinn sem vinnublaðið breytist þarftu auka kóðalínu. Límdu eftirfarandi kóða í byrjun falls þíns:

    Application.Volatile

    Svo mun kóðinn þinn líta svona út:

    Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name Lokaaðgerð

    Nú er UDF-ið þitt óstöðugt, þess vegna verður það endurreiknað sjálfkrafa ef einhver hólf í vinnublaðinuhefur verið endurreiknað eða einhver breyting hefur orðið á vinnubókinni. Um leið og þú breytir nafninu á skránni muntu sjá þá uppfærslu strax.

    Athugið. Vinsamlegast hafðu í huga að of margar rokgjarnar aðgerðir geta hægt á Excel. Þegar öllu er á botninn hvolft eru of margar sérsniðnar aðgerðir sem framkvæma flókna útreikninga og starfa stöðugt á stórum gagnasviðum.

    Þess vegna mæli ég með því að nota sveiflur aðeins þar sem þess er raunverulega þörf.

    Af hverju sérsniðnar aðgerðir eru ekki tiltækar

    Þegar þú slærð inn fyrstu stafina í nafni sérsniðinnar falls birtist það í fellilistanum við hlið inntaksreitsins, rétt eins og venjuleg Excel aðgerðir.

    Slíkt gerist hins vegar ekki alltaf. Hvaða mistök geta valdið þessu ástandi?

    Ef þú ert með Excel 2003-2007, þá birtist UDF aldrei í fellilistanum. Þar geturðu aðeins séð staðlaðar aðgerðir.

    En jafnvel þó þú sért að nota nýrri útgáfu af Excel, þá eru önnur mistök sem þú gætir gert óvart.

    Þú sérð, sérsniðna aðgerðin verður að vera í staðlað VBA mát sem kallast Modules. Þegar þú bætir við nýrri einingu til að skrifa aðgerðakóðann er sjálfkrafa búin til Modules mappa sem allar einingar eru skrifaðar í.

    En stundum gerist það að ný eining er ekki að verða til. Á næstu skjámynd geturðu séð að sérsniðinn aðgerðarkóði er í „Microsoft Excel Objects“ einingunni ásamtThisWorkbook.

    Málið er að þú getur ekki sett sérsniðna aðgerð á kóðasvæði vinnublaðs eða vinnubókar. Í þessu tilviki mun aðgerðin ekki virka. Þar að auki mun það ekki birtast í fellilistanum yfir aðgerðir. Þess vegna ætti kóðinn alltaf að vera í möppunni Modules .

    Hjálpartexti Excel sérsniðinna aðgerða birtist ekki

    Annað vandamál gæti komið upp er vísbendingin sem þú sérð þegar þú límir sérsniðin aðgerð. Ef þú notar staðlaða aðgerð muntu alltaf sjá tól fyrir fallið og fyrir rök þess. En hvað með UDF?

    Ef þú ert með mikið af sérsniðnum aðgerðum, verður það mjög erfitt fyrir þig að muna hvaða útreikninga hver þeirra gerir. Það verður enn erfiðara að muna hvaða rök á að nota. Ég held að það sé góð hugmynd að hafa lýsingu á sérsniðnum aðgerðum þínum til áminningar.

    Til þess mæli ég með að þú notir Application.MacroOptions aðferðina. Það mun hjálpa þér að sýna lýsingu á ekki aðeins fallinu heldur einnig hverri röksemdafærslu hennar í Function Wizard glugganum. Þú sérð þennan glugga þegar þú smellir á Fx hnappinn á formúlustikunni.

    Við skulum sjá hvernig á að bæta slíkri vísbendingu við UDF-skjölin þín. Í fyrri grein skoðuðum við GetMaxBetween sérsniðna aðgerðina. Það finnur hámarksfjöldann á tilgreindu bili og tekur þrjú rök: bil tölugilda og hámarks- og lágmarksgildi til aðleita að.

    Nú munum við bæta við lýsingu fyrir þessa sérsniðnu aðgerð. Til að gera þetta skaltu búa til og keyra Application.MacroOptions skipunina. Fyrir GetMaxBetween aðgerðina geturðu keyrt eftirfarandi skipun:

    Sub RegisterUDF () Dim strFuncName As String 'heiti fallsins sem þú vilt skrá Dim strDescr As String ' lýsing á fallinu sjálft Dim strArgs () As String 'lýsing á aðgerðarrökum ' Skráðu GetMaxBetween fall ReDim strArgs (1 Til 3) 'Fjöldi færa í fallinu þínu strFuncName = "GetMaxBetween" strDescr = "Hámarksfjöldi á tilgreindu bili" strArgs (1) = "Range of numeric values" strArgs (2) = "Neðri millibilsrammi " strArgs (3) = " Efri bilsrammi " Application.MacroOptions Fjölvi: = strFuncName, _ Lýsing: = strDescr, _ ArgumentDescriptions: = strArgs, _ Flokkur: = " Sérsniðnar aðgerðir mínar " End Sub

    eða

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Hámarksfjöldi á tilgreindu bili" , _ Flokkur: = "My Custom Functions" Sérsniðnar aðgerðir" , _ ArgumentDescriptions: = Fylki (_ "Svið tölugilda" , _ "Lærra bil bor der" , _ "Efri bilsmörk" ) End Sub

    Variable str FuncName er heiti fallsins. strDescr - aðgerðalýsing. strArgs breyturnar innihalda vísbendingar fyrir hverja röksemdafærslu.

    Þú gætir velt því fyrir þér hver er fjórða rökin til aðUmsókn.MacroOptions. Þessi valkvæða rök er nefnd Category og gefur til kynna flokk Excel falla sem sérsniðna GetMaxBetween () fallið okkar verður sett í. Þú getur nefnt það eftir hvaða flokkum sem fyrir eru: Math & ; Trig, Statistical, Logical, o.s.frv. Þú getur tilgreint nafn fyrir nýja flokkinn þar sem þú setur aðgerðirnar sem þú býrð til. Ef þú notar ekki Category argumentið, þá verður sérsniðna aðgerðin sjálfkrafa sett í "User Defined" flokkinn.

    Límdu fallkóðann inn í einingagluggann:

    Smelltu síðan á „Run“ hnappinn. Skipunin mun framkvæma allar stillingar til að nota Fx hnappinn með GetMaxBetween() aðgerðinni.

    Ef þú reynir að setja fall inn í reit með GetMaxBetween() aðgerðinni. 6>Setja inn aðgerð tól, þú munt sjá að GetMaxBetween aðgerðin þín er í flokknum „Mínar sérsniðnu aðgerðir“:

    Þú getur einfaldlega byrjað að slá aðgerðaheitið inn í reitinn og þú munt sjá sérsniðna aðgerðina þína í fellilistanum yfir aðgerðir til að velja úr.

    Hringdu síðan í Function Wizard með Fx hnappinum.

    Ábending. Þú getur líka notað lyklasamsetninguna CRTL + A til að opna aðgerðahjálpina.

    Í glugganum Function Wizard muntu sjá lýsingu á fallinu þínu, sem og vísbendingu um fyrstu rökin. Ef þú setur bendilinn yfirönnur eða þriðju rök, þú munt líka sjá vísbendingar um þær.

    Ef þú vilt breyta texta þessara vísbendinga skaltu breyta gildum strDescr og strArgs breytur í RegisterUDF () kóðanum. Keyrðu síðan RegisterUDF () skipunina aftur.

    Ef þú vilt afturkalla allar gerðar stillingar og hreinsa aðgerðalýsinguna skaltu keyra þennan kóða:

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

    Það er enn ein leiðin til að fá vísbendingu þegar þú slærð inn sérsniðna aðgerð. Sláðu inn heiti fallsins og ýttu svo á Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Þú munt sjá lista yfir öll rök fallsins:

    Því miður, hér muntu ekki sjá lýsingu á fallinu og rökum þess. En ef nöfn rökanna eru frekar upplýsandi, gætu þau líka verið gagnleg. Samt er það betra en ekkert :)

    Það mun taka aðeins meiri vinnu til að búa til vitsmuni fyrir UDF sem virka eins og venjuleg Excel aðgerðir. Því miður býður Microsoft ekki upp á neina valkosti. Eina lausnin í boði er eins og er Excel-DNA IntelliSense viðbót. Þú getur fundið frekari upplýsingar á vefsíðu þróunaraðila.

    Vonandi munu þessar leiðbeiningar hjálpa þér að leysa vandamál þegar sérsniðna aðgerðin þín virkar ekki eða virkar ekkivinna eins og þú vilt. Ef UDF þinn virkar samt ekki, vinsamlegast lýstu vandamálinu þínu nákvæmlega í athugasemdahlutanum. Við reynum að finna út úr því og finna lausnina fyrir þig ;)

    Michael Brown er hollur tækniáhugamaður með ástríðu fyrir því að einfalda flókna ferla með hugbúnaðarverkfærum. Með meira en áratug af reynslu í tækniiðnaðinum hefur hann aukið færni sína í Microsoft Excel og Outlook, sem og Google Sheets og Docs. Blogg Michael er tileinkað því að deila þekkingu sinni og sérfræðiþekkingu með öðrum, veita auðveld ráð og leiðbeiningar til að bæta framleiðni og skilvirkni. Hvort sem þú ert vanur fagmaður eða byrjandi, þá býður blogg Michaels upp á dýrmæta innsýn og hagnýt ráð til að fá sem mest út úr þessum nauðsynlegu hugbúnaðarverkfærum.