Excel UDF ne funkcias: problemoj kaj solvoj

  • Kundividu Ĉi Tion
Michael Brown

En ĉi tiu artikolo, ni rigardos la problemojn, kiujn vi povas renkonti kiam vi uzas kutimajn funkciojn en viaj laborlibroj. Mi provos montri al vi kio kaŭzas ilin kaj kiom facile ili povas esti solvitaj.

Jen kion ni parolos:

    Antaŭe ni parolis pri kio estas kutima funkcio estas, kiel krei kaj uzi ĝin. Se vi sentas, ke vi bezonas refreŝigi la bazajn sciojn pri UDF-oj antaŭe, faru paŭzon kaj trarigardu mian antaŭan artikolon.

    Kial Excel UDF ne rekalkulas?

    Kiam vi faras ŝanĝojn en via laborlibro, Excel ne rekalkulos ĉiujn formulojn, kiujn vi havas tie. Ĝi ĝisdatigos la rezultojn por tiuj formuloj, kiuj estas ligitaj nur al la ŝanĝitaj ĉeloj.

    Sed ĉi tio koncernas la normajn Excel-funkciojn. Koncerne al la kutimaj, Excel ne povas validigi la VBA-kodon kaj identigi aliajn ĉelojn, kiuj ankaŭ povus influi la rezulton de la kutima funkcio. Tial, via kutima formulo eble ne ŝanĝiĝas kiam vi faras ŝanĝojn al la laborlibro.

    Por solvi la problemon, vi nur bezonos uzi la deklaron Apliko.Volatile . Rigardu la sekvan ĉapitron por lerni la paŝon post paŝo instrukciojn pri kiel apliki ĝin.

    Volivolaj kontraŭ nevolatilaj kutimaj funkcioj

    Defaŭlte, kutimaj funkcioj en Excel ne estas volatilaj. Ĉi tio signifas, ke la UDF estas rekalkulita nur se la valoro de iu ajn el la ĉeloj al kiuj ĝi rilatas ŝanĝiĝas. Sed se la formato de la ĉeloj, la nomo de lalaborfolio, la nomo de la dosiero ŝanĝas, tiam neniuj ŝanĝoj okazos en la UDF.

    Ni ŝanĝu de vortoj al ekzemploj. Ekzemple, vi devas noti la nomon de via laborlibro en ĉelo. Por fari tion, vi kreas kutiman funkcion:

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

    Nun imagu la sekvan kazon. Vi skribis kutiman formulon =WorkbookName() en la ĉelon kaj ricevis la dosiernomon tie. Post iom da tempo, vi decidis renomi la dosieron kaj konservis ĝin kun alia nomo. Sed vi rigardas la valoron en la ĉelo kaj vidas, ke ĝi ne ŝanĝiĝis. Estas ankoraŭ malnova dosiernomo, kiu ne plu pravas.

    Ĉar ne estas argumentoj en ĉi tiu funkcio, la funkcio ne estas rekalkulita (eĉ se vi ŝanĝas la nomon de la laborlibro, fermas ĝin kaj poste remalfermas). ĝi).

    Rimarku. Por rekalkuli ĉiujn funkciojn en via dosiero, vi povas uzi la ŝparvojon Ctrl + Alt + F9.

    Ĉu estas pli facila maniero? Por ke la formulo rekalkulu ĉiufoje kiam la laborfolio ŝanĝiĝas, vi bezonas kroman linion de kodo. Algluu la sekvan kodon komence de via funkcio:

    Application.Volatile

    Do, via kodo aspektos tiel:

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

    Nun via UDF estas volatila, tial ĝi estos rekalkulita aŭtomate se iu ĉelo en la laborfolioestis rekalkulita aŭ iu ajn ŝanĝo okazis en la laborlibro. Tuj kiam vi ŝanĝas la nomon de la dosiero, vi tuj vidos tiun ĝisdatigon.

    Noto. Bonvolu memori, ke tro da volatilaj funkcioj povas malrapidigi vian Excel. Post ĉio, estas tro multaj kutimaj funkcioj, kiuj plenumas kompleksajn kalkulojn kaj funkcias sur grandaj datumintervaloj senĉese.

    Sekve, mi rekomendas uzi volatilon nur tie kie ĝi vere bezonas.

    Kial kutimaj funkcioj ne disponeblas

    Kiam vi enigas la unuajn literojn de la nomo de kutima funkcio, ĝi aperas en la fallisto apud la eniga ĉelo, same kiel normaj Excel-funkcioj.

    Tamen tio ne ĉiam okazas. Kiuj eraroj povas kaŭzi ĉi tiun situacion?

    Se vi havas Excel 2003-2007, tiam la UDF neniam aperas en la fallisto. Tie vi povas vidi nur normajn funkciojn.

    Sed eĉ se vi uzas pli novan version de Excel, estas alia eraro, kiun vi hazarde faras.

    Vi vidas, la kutima funkcio devas esti en norma VBA-modulo nomita Moduloj. Kiam vi aldonas novan modulon por skribi la funkciokodon, aŭtomate kreiĝas dosierujo de Moduloj, en kiu ĉiuj moduloj estas skribitaj.

    Sed foje okazas, ke nova modulo ne estas; kreiĝinte. Sur la sekva ekrankopio vi povas vidi, ke la kutima funkciokodo estas en la modulo "Microsoft Excel Objects" kune kunĈi tiu Laborlibro.

    La punkto estas, ke vi ne povas meti laŭmendan funkcion en la kodareo de laborfolio aŭ laborlibro. En ĉi tiu kazo, la funkcio ne funkcios. Plie, ĝi ne aperos en la menua listo de funkcioj. Tial, la kodo ĉiam estu en la dosierujo Moduloj .

    La helpteksto de la propra funkcio de Excel ne estas montrata

    Alia problemo povas okazi estas la sugesto, kiun vi vidas kiam vi algluas kutima funkcio. Se vi uzas norman funkcion, vi ĉiam vidos konsileton por la funkcio kaj por ĝiaj argumentoj. Sed kio pri UDF-oj?

    Se vi havas multajn kutimajn funkciojn, estos ege malfacile por vi memori kiajn kalkulojn faras ĉiu el ili. Eĉ pli malfacile estos memori kiujn argumentojn uzi. Mi pensas, ke estos bona ideo havi priskribon de viaj kutimaj funkcioj kiel rememorigilo.

    Por tio, mi sugestus uzi la metodon Apliko.MacroOptions . Ĝi helpos vin montri la priskribon de ne nur la funkcio sed ankaŭ de ĉiu el ĝiaj argumentoj en la fenestro de Funkcia Sorĉisto. Vi vidas ĉi tiun fenestron kiam vi alklakas la butonon Fx en la formulbreto.

    Ni vidu kiel aldoni tian sugeston al viaj UDF-oj. En la antaŭa artikolo ni rigardis la kutiman funkcion GetMaxBetween. Ĝi trovas la maksimuman nombron en la specifita gamo kaj prenas tri argumentojn: gamo da nombraj valoroj, kaj maksimuma kaj minimuma valoro alserĉi.

    Nun ni aldonos priskribon por ĉi tiu kutima funkcio. Por fari tion, kreu kaj rulu la komandon Apliko.MacroOptions . Por la funkcio GetMaxBetween , vi povas ruli la jenan komandon:

    Sub RegisterUDF () Dim strFuncName As String 'nomo de la funkcio kiun vi volas registri Dim strDescr As String ' priskribo de la funkcio mem Dim strArgs () As String 'priskribo de funkcio argumentoj ' Register GetMaxBetween funkcio ReDim strArgs (1 To 3) 'Number of arguments in your function strFuncName = "GetMaxBetween" strDescr = "Maksimuma nombro en la specifita gamo" strArgs (1) = "Range of numeric values" strArgs (2) = "Malsupra intervalbordo " strArgs (3) = " Supra intervalbordo " Apliko.MacroOptions Makro: = strFuncName, _ Priskribo: = strDescr, _ ArgumentDescriptions: = strArgs, _ Kategorio: = " Miaj Propraj Funkcioj " End Sub

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Maksimuma nombro en la specifita intervalo" , _ Kategorio: = "Mia Propraj Funkcioj" , _ ArgumentDescriptions: = Tabelo (_ "Gamo de nombraj valoroj" , _ "Malsupra intervalo bor der" , _ "Upper intervalborder" ) End Sub

    Variable str FuncName estas la nomo de la funkcio. strDescr - priskribo de funkcio. La strArgs variabloj enhavas sugestojn por ĉiu argumento.

    Vi povas scivoli, kio estas la kvara argumento porApliko.MakroOpcioj. Ĉi tiu laŭvola argumento estas nomita Kategorio kaj indikas la klason de Excel-funkcioj en kiuj estos metita nia kutima funkcio GetMaxBetween () . Vi povas nomi ĝin laŭ iu ajn el la ekzistantaj kategorioj: Math & ; Trig, Statistika, Logika, ktp. Vi povas specifi nomon por la nova kategorio en kiu vi metos la funkciojn, kiujn vi kreas. Se vi ne uzas la argumenton Kategorio, tiam la kutima funkcio estos aŭtomate metita en la kategorion "Uzanto Difinita".

    Algluu la funkciokodon en la modulan fenestron:

    Tiam alklaku la butonon "Run". La komando plenumos ĉiujn agordojn por uzi la butonon Fx kun via funkcio GetMaxBetween() .

    Se vi provas enmeti funkcion en ĉelon per la GetMaxBetween() . 6>Enmeti Funkcion -ilo, vi vidos, ke via funkcio GetMaxBetween estas en la kategorio "Miaj Propraj Funkcioj":

    Vi povas simple komenci tajpi la funkcionomon en la ĉelon kaj vi vidos vian kutiman funkcion en la falliston de funkcioj por elekti.

    Tiam voku la Funkcian Sorĉiston. kun la butono Fx.

    Konsileto. Vi ankaŭ povas uzi la klavkombinon CRTL + A por malfermi la Funkcian Sorĉiston.

    En la fenestro Funkcia Sorĉisto vi vidos priskribon de via funkcio, kaj ankaŭ sugeston por la unua argumento. Se vi metas vian kursoron super ladua aŭ tria argumento, vi ankaŭ vidos sugestojn por ili.

    Se vi volas ŝanĝi la tekston de ĉi tiuj sugestoj, ŝanĝu la valorojn de la strDescr kaj strArgs variabloj en la RegisterUDF () kodo. Poste rulu la komandon RegisterUDF () denove.

    Se vi volas malfari ĉiujn faritajn agordojn kaj forigi la funkciopriskribon, rulu ĉi tiun kodon:

    Sub UnregisterUDF () Apliko.MacroOptions Macro: = "GetMaxBetween" , _ Priskribo: = Malplena , ArgumentDescriptions: = Malplena , Kategorio: = Malplena Fina Sub

    Estas unu plia maniero por ricevi sugeston kiam vi enigas kutiman funkcion. Enigu la nomon de la funkcio kaj poste premu la Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    Vi vidos liston de ĉiuj argumentoj de la funkcio:

    Bedaŭrinde, ĉi tie vi ne vidos la priskribon de la funkcio kaj ĝiaj argumentoj. Sed se la nomoj de la argumentoj estas sufiĉe informaj, do ili ankaŭ povus esti helpemaj. Tamen, estas pli bone ol nenio :)

    Necesos iom pli da laboro por krei intellisense por UDF-oj, kiuj funkcias kiel normaj Excel-funkcioj. Bedaŭrinde, Microsoft ne provizas iujn ajn eblojn. La sola disponebla solvo estas nuntempe etendo de Excel-DNA IntelliSense. Vi povas trovi pliajn informojn en la retejo de la programisto.

    Espereble, ĉi tiuj gvidlinioj helpos vin solvi problemojn kiam via kutima funkcio ne funkcias aŭ ne funkcias.laboru kiel vi volas. Se tamen via UDF ankoraŭ ne funkcias, bonvolu priskribi vian problemon precize en la sekcio de Komentoj. Ni provos eltrovi ĝin kaj trovi la solvon por vi ;)

    Michael Brown estas diligenta teknologia entuziasmulo kun pasio por simpligi kompleksajn procezojn uzante programarajn ilojn. Kun pli ol jardeko da sperto en la teknologia industrio, li perfektigis siajn kapablojn en Microsoft Excel kaj Outlook, same kiel Google Sheets kaj Docs. La blogo de Mikaelo estas dediĉita al kunhavigi siajn sciojn kaj kompetentecon kun aliaj, provizante facilajn sekvajn konsiletojn kaj lernilojn por plibonigi produktivecon kaj efikecon. Ĉu vi estas sperta profesiulo aŭ komencanto, la blogo de Mikaelo ofertas valorajn komprenojn kaj praktikajn konsilojn por eltiri la plej multajn el ĉi tiuj esencaj programaj iloj.