Excel UDF werkt niet: problemen en oplossingen

  • Deel Dit
Michael Brown

In dit artikel bekijken we de problemen die u kunt tegenkomen bij het gebruik van aangepaste functies in uw werkmappen. Ik zal proberen te laten zien wat de oorzaak is en hoe ze gemakkelijk kunnen worden opgelost.

Hier is waar we het over gaan hebben:

    Eerder hebben we het gehad over wat een aangepaste functie is, hoe je die maakt en gebruikt. Als je het gevoel hebt dat je de basiskennis van UDF's vooraf moet opfrissen, neem dan even de tijd om mijn vorige artikel door te nemen.

    Waarom berekent Excel UDF niet opnieuw?

    Wanneer u wijzigingen aanbrengt in uw werkmap, berekent Excel niet elke formule opnieuw, maar worden alleen de resultaten bijgewerkt van de formules die gekoppeld zijn aan de gewijzigde cellen.

    Maar dit betreft de standaard Excel-functies. Wat de aangepaste functies betreft, kan Excel de VBA-code niet valideren en andere cellen identificeren die ook het resultaat van de aangepaste functie zouden kunnen beïnvloeden. Daarom is het mogelijk dat uw aangepaste formule niet verandert wanneer u wijzigingen aanbrengt in de werkmap.

    Om het probleem op te lossen, moet u gewoon de Application.Volatile verklaring. Kijk in het volgende hoofdstuk voor de stap-voor-stap instructies voor het toepassen ervan.

    Vluchtige vs. niet-vluchtige aangepaste functies

    Standaard zijn aangepaste functies in Excel niet vluchtig. Dit betekent dat de UDF alleen wordt herberekend als de waarde van een van de cellen waarnaar het verwijst, verandert. Maar als de indeling van de cellen, de naam van het werkblad of de naam van het bestand verandert, zullen er geen wijzigingen plaatsvinden in de UDF.

    Laten we overschakelen van woorden naar voorbeelden. Je moet bijvoorbeeld de naam van je werkmap in een cel noteren. Daarvoor maak je een aangepaste functie:

    Functie Werkboeknaam() Als String Werkboeknaam = DitWerkboek.Naam Einde Functie

    Stel nu het volgende geval voor. U schreef aangepaste formule =WorkbookName() in de cel en kreeg daar de bestandsnaam. Na een tijdje besloot je het bestand te hernoemen en sloeg het op met een andere naam. Maar je kijkt naar de waarde in de cel en ziet dat die niet veranderd is. Er is nog steeds een oude bestandsnaam die niet meer klopt.

    Aangezien er geen argumenten zijn in deze functie, wordt de functie niet opnieuw berekend (zelfs als u de naam van de werkmap wijzigt, deze sluit en vervolgens opnieuw opent).

    Opmerking. Om alle functies in uw bestand opnieuw te berekenen, kunt u de sneltoets Ctrl + Alt + F9 gebruiken.

    Is er een eenvoudiger manier? Om de formule elke keer dat het werkblad verandert opnieuw te laten berekenen, heb je een extra regel code nodig. Plak het volgende stukje code aan het begin van je functie:

    Application.Volatile

    Dus, je code zal er zo uitzien:

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

    Nu is uw UDF vluchtig, dus wordt hij automatisch herberekend als een cel in het werkblad opnieuw is berekend of als er een wijziging is opgetreden in de werkmap. Zodra u de naam van het bestand wijzigt, ziet u die update onmiddellijk.

    Opmerking: houd er rekening mee dat te veel vluchtige functies uw Excel kunnen vertragen. Er zijn immers te veel aangepaste functies die complexe berekeningen uitvoeren en voortdurend grote gegevensbereiken bewerken.

    Daarom raad ik aan volatiliteit alleen te gebruiken waar het echt nodig is.

    Waarom aangepaste functies niet beschikbaar zijn

    Wanneer u de eerste letters van de naam van een aangepaste functie invoert, verschijnt deze in de vervolgkeuzelijst naast de invoercel, net als standaard Excel-functies.

    Dit gebeurt echter niet altijd. Welke fouten kunnen deze situatie veroorzaken?

    Heb je Excel 2003-2007, dan verschijnt de UDF nooit in de keuzelijst. Daar zie je alleen standaardfuncties.

    Maar zelfs als u een nieuwere versie van Excel gebruikt, is er nog een andere fout die u per ongeluk kunt maken.

    De aangepaste functie moet namelijk in een standaard VBA-module met de naam Modules staan. Wanneer u een nieuwe module toevoegt om de functiecode te schrijven, wordt automatisch een map Modules gemaakt waarin alle modules worden geschreven.

    Maar soms gebeurt het dat een nieuwe module niet wordt aangemaakt. In het volgende screenshot kunt u zien dat de aangepaste functiecode in de module "Microsoft Excel Objects" staat, samen met ThisWorkbook.

    Het punt is dat u een aangepaste functie niet in het codegebied van een werkblad of werkmap kunt plaatsen. In dat geval zal de functie niet werken. Bovendien zal ze niet verschijnen in de keuzelijst met functies. Daarom moet de code altijd in de map Modules .

    Excel aangepaste functie helptekst wordt niet weergegeven

    Een ander probleem is de hint die u ziet wanneer u een aangepaste functie plakt. Als u een standaardfunctie gebruikt, ziet u altijd een tooltip voor de functie en voor de argumenten. Maar hoe zit het met UDF's?

    Als u veel aangepaste functies hebt, zal het uiterst moeilijk voor u zijn om te onthouden welke berekeningen elk van hen doet. Het zal nog moeilijker zijn om te onthouden welke argumenten u moet gebruiken. Ik denk dat het een goed idee is om een beschrijving van uw aangepaste functies te hebben als geheugensteun.

    Hiervoor stel ik voor de Application.MacroOptions Met deze methode kunt u de beschrijving van niet alleen de functie, maar ook van elk van de argumenten ervan weergeven in het venster van de Functieassistent. U ziet dit venster wanneer u op de knop Fx in de formulebalk klikt.

    Laten we eens kijken hoe je zo'n hint toevoegt aan je UDF's. In het vorige artikel hebben we gekeken naar de functie GetMaxBetween. Die vindt het maximumgetal in het opgegeven bereik en neemt drie argumenten: een bereik van numerieke waarden, en een maximum- en minimumwaarde om naar te zoeken.

    Nu voegen we een beschrijving toe voor deze aangepaste functie. Om dit te doen, maak en draai de Application.MacroOptions commando. Voor de GetMaxBetween functie, kunt u het volgende commando uitvoeren:

    Sub RegisterUDF () Dim strFuncName As String 'naam van de functie die je wilt registreren Dim strDescr As String ' beschrijving van de functie zelf Dim strArgs () As String 'beschrijving van de argumenten van de functie ' Registreer GetMaxBetween functie ReDim strArgs (1 To 3) 'Aantal argumenten in je functie strFuncName = "GetMaxBetween" strDescr = "Maximum aantal in het opgegeven bereik" 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

    of

    Sub RegisterUDF () Application.MacroOptions Macro: = "GetMaxBetween" , _ Beschrijving: = "Maximumaantal in het opgegeven bereik" , _ Categorie: = "Mijn aangepaste functies" , _ ArgumentDescriptions: = Array (_ "Bereik van numerieke waarden" , _ "Onderste intervalgrens" , _ "Bovenste intervalgrens" ) End Sub

    Variabel str FuncName is de naam van de functie. strDescr - functiebeschrijving. De strArgs variabelen bevatten hints voor elk argument.

    U vraagt zich misschien af wat het vierde argument van Application.MacroOptions is. Dit optionele argument heet Categorie en geeft de klasse van Excel-functies aan die onze aangepaste GetMaxBetween () U kunt de functie een naam geven naar een van de bestaande categorieën: Math & Trig, Statistisch, Logisch, enz. U kunt een naam opgeven voor de nieuwe categorie waarin u de functies die u maakt zult plaatsen. Als u het argument Categorie niet gebruikt, wordt de aangepaste functie automatisch in de categorie "Door gebruiker gedefinieerd" geplaatst.

    Plak de functiecode in het modulevenster:

    Klik dan op de knop "Uitvoeren". Het commando zal alle instellingen voor het gebruik van de Fx knop met uw GetMaxBetween() functie.

    Als u probeert een functie in te voegen in een cel met behulp van de Functie invoegen tool, zult u zien dat er uw GetMaxBetween functie staat in de categorie "Mijn aangepaste functies":

    U kunt de functienaam gewoon in de cel typen en u ziet uw aangepaste functie in de keuzelijst met functies waaruit u kunt kiezen.

    Bel dan de Functie Wizard met de Fx knop.

    Tip. U kunt ook de toetsencombinatie CRTL + A gebruiken om de Functie Wizard te openen.

    In de Functie Wizard venster zie je een beschrijving van je functie, en een hint voor het eerste argument. Als je je cursor op het tweede of derde argument plaatst, zie je daar ook hints voor.

    Als u de tekst van deze hints wilt veranderen, wijzigt u de waarden van de strDescr en strArgs variabelen in de RegisterUDF () code. Voer dan de RegisterUDF () commando opnieuw.

    Als u alle gemaakte instellingen ongedaan wilt maken en de functiebeschrijving wilt wissen, voert u deze code uit:

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

    Er is nog een manier om een hint te krijgen wanneer u een aangepaste functie invoert. Voer de naam van de functie in en druk dan op Ctrl + Shift + A :

    =GetMaxBetween( + Ctrl + Shift + A

    U ziet een lijst met alle argumenten van de functie:

    Helaas zie je hier niet de beschrijving van de functie en de argumenten. Maar de namen van de argumenten zijn vrij informatief, dus die kunnen ook nuttig zijn. Toch is het beter dan niets :)

    Het kost wat meer werk om intellisense te maken voor UDF's die werken als standaard Excel-functies. Helaas biedt Microsoft geen mogelijkheden. De enige beschikbare oplossing is momenteel een Excel-DNA IntelliSense-extensie. Meer informatie vindt u op de website van de ontwikkelaar.

    Hopelijk helpen deze richtlijnen u bij het oplossen van problemen wanneer uw aangepaste functie niet werkt of niet werkt zoals u zou willen. Als uw UDF echter nog steeds niet werkt, beschrijf dan uw probleem nauwkeurig in de sectie Commentaar. We zullen proberen het uit te zoeken en de oplossing voor u te vinden ;)

    Michael Brown is een toegewijde technologieliefhebber met een passie voor het vereenvoudigen van complexe processen met behulp van softwaretools. Met meer dan tien jaar ervaring in de technische industrie heeft hij zijn vaardigheden in Microsoft Excel en Outlook, evenals Google Spreadsheets en Documenten aangescherpt. Michael's blog is gewijd aan het delen van zijn kennis en expertise met anderen, met eenvoudig te volgen tips en tutorials voor het verbeteren van de productiviteit en efficiëntie. Of je nu een doorgewinterde professional of een beginner bent, Michaels blog biedt waardevolle inzichten en praktisch advies om het meeste uit deze essentiële softwaretools te halen.