Cuprins
În acest articol, vom examina problemele cu care vă puteți confrunta atunci când utilizați funcții personalizate în registrele de lucru. Voi încerca să vă arăt care este cauza acestora și cât de ușor pot fi rezolvate.
Iată despre ce vom vorbi:
Mai devreme am vorbit despre ce este o funcție personalizată, cum să o creăm și să o folosim. Dacă simțiți că trebuie să reîmprospătați cunoștințele de bază despre UDF-uri înainte, faceți o pauză și răsfoiți articolul meu anterior.
De ce nu se recalculează Excel UDF?
Atunci când efectuați modificări în registrul de lucru, Excel nu va recalcula fiecare formulă pe care o aveți acolo, ci va actualiza rezultatele doar pentru acele formule care sunt legate de celulele modificate.
Dar acest lucru se referă la funcțiile Excel standard. În ceea ce le privește pe cele personalizate, Excel nu poate valida codul VBA și nu poate identifica alte celule care ar putea afecta, de asemenea, rezultatul funcției personalizate. Prin urmare, este posibil ca formula personalizată să nu se schimbe atunci când faceți modificări în registrul de lucru.
Pentru a remedia problema, va trebui doar să utilizați Aplicație.Volatile Consultați capitolul următor pentru a afla instrucțiunile pas cu pas despre cum să o aplicați.
Funcții personalizate volatile vs. nevolatile
În mod implicit, funcțiile personalizate din Excel nu sunt volatile. Aceasta înseamnă că UDF este recalculată numai dacă se modifică valoarea oricăreia dintre celulele la care se referă. Dar dacă se schimbă formatul celulelor, numele foii de calcul, numele fișierului, atunci nu se va produce nicio modificare în UDF.
Să trecem de la cuvinte la exemple. De exemplu, trebuie să scrieți numele registrului de lucru într-o celulă. Pentru a face acest lucru, creați o funcție personalizată:
Function WorkbookName() As String WorkbookName = ThisWorkbook.Name End Function
Acum imaginați-vă următorul caz: ați scris o formulă personalizată =WorkbookName() în celulă și ați obținut acolo numele fișierului. După un timp, ați decis să redenumiți fișierul și l-ați salvat cu un nume diferit. Dar vă uitați la valoarea din celulă și vedeți că nu s-a schimbat. Există încă un nume de fișier vechi care nu mai este corect.
Deoarece nu există argumente în această funcție, funcția nu este recalculată (chiar dacă schimbați numele registrului de lucru, îl închideți și apoi îl redeschideți).
Notă. Pentru a recalcula toate funcțiile din fișier, puteți utiliza comanda rapidă Ctrl + Alt + F9.
Există o modalitate mai ușoară? Pentru ca formula să se recalculeze de fiecare dată când se schimbă foaia de calcul, aveți nevoie de o linie de cod suplimentară. Lipiți următoarea bucată de cod la începutul funcției dvs:
Aplicație.Volatile
Deci, codul tău va arăta astfel:
Function WorkbookName() As String Application.Volatile WorkbookName = ThisWorkbook.Name End Function
Acum UDF-ul dumneavoastră este volatil, prin urmare va fi recalculat automat dacă orice celulă din foaia de calcul a fost recalculată sau dacă a avut loc vreo modificare în registrul de lucru. De îndată ce schimbați numele fișierului, veți vedea imediat actualizarea.
Notă. Vă rugăm să rețineți că prea multe funcții volatile pot încetini Excel-ul. La urma urmei, există prea multe funcții personalizate care efectuează calcule complexe și operează în mod continuu pe intervale mari de date.
Prin urmare, recomand utilizarea volatilității numai acolo unde este cu adevărat necesară.
De ce nu sunt disponibile funcțiile personalizate
Atunci când introduceți primele litere ale numelui unei funcții personalizate, aceasta apare în lista derulantă de lângă celula de intrare, la fel ca și funcțiile Excel standard.
Totuși, acest lucru nu se întâmplă întotdeauna. Ce greșeli pot cauza această situație?
Dacă aveți Excel 2003-2007, atunci UDF nu apare niciodată în lista derulantă. Acolo puteți vedea numai funcții standard.
Dar chiar dacă utilizați o versiune mai nouă de Excel, există o altă greșeală pe care o puteți face din greșeală.
Vedeți, funcția personalizată trebuie să se afle într-un modul VBA standard numit Modules. Când adăugați un nou modul pentru a scrie codul funcției, se creează automat un dosar Modules în care sunt scrise toate modulele.
Dar, uneori, se întâmplă ca un nou modul să nu fie creat. În următoarea captură de ecran puteți vedea că codul funcției personalizate se află în modulul "Microsoft Excel Objects" împreună cu ThisWorkbook.
Ideea este că nu puteți plasa o funcție personalizată în zona de cod a unei foi de calcul sau a unui registru de lucru. În acest caz, funcția nu va funcționa. Mai mult, nu va apărea în lista derulantă de funcții. Prin urmare, codul trebuie să fie întotdeauna în folderul Module .
Textul de ajutor al funcției personalizate Excel nu este afișat
O altă problemă care poate apărea este indicatorul pe care îl vedeți atunci când lipiți o funcție personalizată. Dacă utilizați o funcție standard, veți vedea întotdeauna un tooltip pentru funcție și pentru argumentele sale. Dar cum rămâne cu UDF-urile?
Dacă aveți o mulțime de funcții personalizate, vă va fi extrem de dificil să vă amintiți ce calcule face fiecare dintre ele. Va fi și mai dificil să vă amintiți ce argumente să folosiți. Cred că ar fi o idee bună să aveți o descriere a funcțiilor dvs. personalizate, ca un memento.
Pentru aceasta, vă sugerez să folosiți Aplicație.MacroOpțiuni Aceasta vă va ajuta să afișați descrierea nu numai a funcției, ci și a fiecăruia dintre argumentele sale în fereastra Function Wizard. Această fereastră apare atunci când faceți clic pe butonul Fx din bara de formule.
Să vedem cum să adăugăm un astfel de indiciu la UDF-urile dvs. În articolul anterior am analizat funcția personalizată GetMaxBetween. Aceasta găsește numărul maxim din intervalul specificat și primește trei argumente: un interval de valori numerice și o valoare maximă și minimă de căutat.
Acum vom adăuga o descriere pentru această funcție personalizată. Pentru a face acest lucru, creați și rulați fișierul Aplicație.MacroOpțiuni Pentru comanda GetMaxBetween puteți rula următoarea comandă:
Sub RegisterUDF () Dim strFuncName As String 'numele funcției pe care doriți să o înregistrați Dim strDescr As String ' descrierea funcției în sine Dim strArgs () As String 'descrierea argumentelor funcției ' Înregistrați funcția GetMaxBetween ReDim strArgs (1 To 3) 'Numărul de argumente din funcția dvs. strFuncName = "GetMaxBetween" strDescr = "Numărul maxim în intervalul specificat" strArgs (1) ="Interval de valori numerice" strArgs (2) = "Limita inferioară a intervalului" strArgs (3) = "Limita superioară a intervalului" Application.MacroOptions Macro: = strFuncName, _ _ Description: = strDescr, _ ArgumentDescriptions: = strArgs, _ Category: = " My Custom Functions " End Sub
sau
Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = "Numărul maxim din intervalul specificat" , _ Category: = "My Custom Functions" , _ ArgumentDescriptions: = Array (_ "Interval de valori numerice" , _ "Limita inferioară a intervalului" , _ "Limita superioară a intervalului" ) End SubVariabila str FuncName este numele funcției. strDescr - descrierea funcției. strArgs conțin indicii pentru fiecare argument.
Poate vă întrebați care este cel de-al patrulea argument pentru Application.MacroOptions. Acest argument opțional se numește Categoria și indică clasa de funcții Excel pe care o poate folosi aplicația noastră personalizată GetMaxBetween () în care va fi plasată funcția personalizată. Puteți să o numiți după oricare dintre categoriile existente: Math & Trig, Statistical, Logical etc. Puteți specifica un nume pentru noua categorie în care veți plasa funcțiile pe care le creați. Dacă nu utilizați argumentul Category, funcția personalizată va fi plasată automat în categoria "User Defined".
Lipiți codul funcției în fereastra modulului:
Apoi, faceți clic pe butonul "Run". Comanda va efectua toate setările pentru utilizarea Fx cu butonul GetMaxBetween() funcție.
Dacă încercați să inserați o funcție într-o celulă folosind funcția Funcția de inserție veți vedea că există un instrument GetMaxBetween se află în categoria "Funcțiile mele personalizate":
Puteți începe pur și simplu să tastați numele funcției în celulă și veți vedea funcția dvs. personalizată în lista derulantă de funcții din care puteți selecta.
Apoi apelați la Expertul de funcții cu ajutorul butonului Fx.
Sfat. Puteți utiliza, de asemenea, combinația de taste CRTL + A pentru a deschide Expertul de funcții.
În Expertul de funcții veți vedea o descriere a funcției dvs., precum și un indiciu pentru primul argument. Dacă plasați cursorul pe al doilea sau al treilea argument, veți vedea și indicii pentru acestea.
Dacă doriți să modificați textul acestor indicații, modificați valorile din strDescr și strArgs variabilele din ÎnregistrareUDF () Apoi executați codul RegisterUDF () comanda din nou.
Dacă doriți să anulați toate setările efectuate și să ștergeți descrierea funcției, executați acest cod:
Sub UnregisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Description: = Empty , ArgumentDescriptions: = Empty , Category: = Empty End Sub
Mai există o modalitate de a obține un indiciu atunci când introduceți o funcție personalizată. Introduceți numele funcției și apoi apăsați Ctrl + Shift + A :
=GetMaxBetween(
+ Ctrl + Shift + A
Veți vedea o listă cu toate argumentele funcției:
Din nefericire, aici nu veți vedea descrierea funcției și a argumentelor sale. Dar dacă numele argumentelor sunt destul de informative, atunci ar putea fi și ele utile. Totuși, este mai bine decât nimic :)
Va fi nevoie de ceva mai multă muncă pentru a crea intellisense pentru UDF-uri care să funcționeze ca și funcțiile standard Excel. Din păcate, Microsoft nu oferă nicio opțiune. Singura soluție disponibilă este în prezent o extensie Excel-DNA IntelliSense. Puteți găsi mai multe informații pe site-ul web al dezvoltatorului.
Sperăm că aceste orientări vă vor ajuta să rezolvați problemele atunci când funcția dvs. personalizată nu funcționează sau nu funcționează așa cum v-ați dori. Dacă totuși, UDF-ul dvs. tot nu reușește să funcționeze, vă rugăm să descrieți cu precizie problema dvs. în secțiunea Comentarii. Vom încerca să ne dăm seama și să găsim soluția pentru dvs. ;)