• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

constant uitvoeren van vba functie

Status
Niet open voor verdere reacties.

glda19

Gebruiker
Lid geworden
14 jan 2008
Berichten
919
Hi
Ik heb een eigen gemaakte functie en die word constant uit gevoerd als ik iets wijzig op het excel blad zou dit te maken hebben met automatisch herberekenen van het werkblad.
 
Een Function die in een cel gebruikt wordt, net als andere Excel functies, altijd uitgevoerd.
Als je dat niet wilt zal je een controle moeten inbouwen die bepaalt of de functie moet worden uitgevoerd of verlaten.
 
Laat je functie eens zien. Formules worden in Excel alleen berekend als:

- Cellen waarnaar ze verwijzen zijn veranderd
- Ze een Volatile functie bevatten zoals VERSCHUIVEN, CEL, INDIRECT, VANDAAG, NU
- de VBA functie de regel Application.Volatile bevat

Voor alles over hoe Excel rekent:
http://www.decisionmodels.com/calcsecrets.htm
 
Laatst bewerkt:
De gevraagde code word als volgt aan gesproken in een cel in een bepaald werkblad.

=ALS.FOUT(Z7-Vermindering_kredietdagen(Z3;W17;W28);"")
En staat in een apparte module
De code van de functie in de formule
Code:
Function Vermindering_kredietdagen(Werkregime As String, ziektedagen As Integer, onbetaalde_dagen As Integer)
'Werkregime = voltijds ,4/5,haltijds
' de functie fix rond af naar het heheel getal 99,2 of 99,8 wordt 99
'Verminderingen door Ziektedagen
'----------------------------------------------------------------------
'Bij Voltijd word er 1 kredietdag afgetrokken na 28 kalenderdagen ziekete
'Bij 4/5 word er 1 kredietdag afgetrokken na 33,5 kalenderdagen ziekete
'Bij halftijds word er 1 kredietdaag afgetrokken na 56 kalenderdagen ziekete
If Werkregime = "Voltijds" And ziektedagen > 1 Then
    Vermindering_Ziekte = Fix(ziektedagen / 28)

ElseIf Werkregime = "4/5" And ziektedagen > 1 Then
    Vermindering_Ziekte = Fix(ziektedagen / 33.5)

ElseIf Werkregime = "Halftijds" And ziektedagen > 1 Then
     Vermindering_Ziekte = Fix(ziektedagen / 56)
Else
    Vermindering_Ziekte = ziektedagen
End If
'Vermindering door ontbetaaldedagen
'---------------------------------------------------------------------
'Bij Voltijd word er 1/2 kredietdag afgetrokken na 14 kalenderdagen onbetaald
'Bij 4/5 word er 1,/2 kredietdag afgetrokken na 17 kalenderdagen onbetaald
'Bij halftijds word er 1/2  kredietdaag afgetrokken na 28 kalenderdagen onbetaald

If Werkregime = "Voltijds" And onbetaalde_dagen > 1 Then
    Vermindering_onbetaalde_dagen = Fix(onbetaalde_dagen / 14) / 2

ElseIf Werkregime = "4/5" And onbetaalde_dagen > 1 Then
     Vermindering_onbetaalde_dagen = Fix(onbetaalde_dagen / 17) / 2

ElseIf Werkregime = "Halftijds" And onbetaalde_dagen > 1 Then
    Vermindering_onbetaalde_dagen = Fix(onbetaalde_dagen / 28)
Else
    Vermindering_onbetaalde_dagen = onbetaalde_dagen
End If

Vermindering_kredietdagen = Vermindering_Ziekte + Vermindering_onbetaalde_dagen

End Function

En tijdens het testen van onderstaande code in debug mode word bovenstaande code ook uit gevoerd verwijs er totaal niet naar toe.
Dus versta ik niet waarom ze uit gevoerd word

En dit staat in de moddule MenuRibbon
Code:
Sub test()
'Range("c24:C53").Clear
Worksheets("Feestdagen Verlofcodes").Range("c24:C54").Clear
 '   Worksheets("Feestdagen Verlofcodes").Range("c24:C54").Select
End Sub
 
Laatst bewerkt:
Even een heel simpel werkbook gemaakt.
Misschien niet direkt een goede functie omdat er en msgbox instaat maar is louter als test.
de functie staat in de module 1
Op blad 2 vul je maar wille keurige waarde in de cellen a1 tot a3 want deze worden gewist met de de subwaardeverwijderenblad2 en staat in de module2
in het bestandje dat is bijgevoegd gebeurt het niet.

En is op de zelfde manier geschreven de functie in bovende staande post

Waaraan zou het kunnen liggen in mijn ander programma
 

Bijlagen

  • Map1.xlsm
    15,8 KB · Weergaven: 38
Laatst bewerkt:
Zodra je VBA code die je aan het debuggen bent een wijziging veroorzaakt die effect heeft op cellen die de bron zijn voor je UDF zal Excel een calculatie doen door de UDF aan te roepen en zal VBA ook je UDF doorlopen in debug mode. Je kunt alle calls naar je UDF in 1 keer "afronden" door dan op control+shift+F8 te drukken. Het verschil tussen jouw echte bestand en je voorbeeld is dus dat in je echte bestand de code cellen wijzigt waar een cel die gebruik maakt van de UDF naar verwijst, al dan niet direct.
 
Is mijn redenering correct.
Op werkblad1 staat de eerder vermelde functie en haal ik waarde op van werkblad2
Dus wijzig ik iets op werblad 2 dan wordt mijn udf uitgevoerd.
Dus ok bij het maken van een kopie van werkblad 1
 
hoe zou ik kunnen zorgen dat de functie niet word uitgevoerd bij het kopiëren.
 
Wat is erop tegen dat je udf wordt uitgevoerd?
Zo te zien kun je de berekening van de udf ook vrij eenvoudig met formules maken.
 
Moet het in één cel? Met een referentietabel en wat VERT.ZOEKEN-functies ben je volgens mij een heel eind. Dat maakt het ook iets duidelijker voor anderen hoe de berekening tot stand komt en als je nou ruzie hebt met je udf (waarom eigenlijk?) is dat misschien een goede optie.
 
Laatst bewerkt:
merkt het enkel bij het debugen anders geen last van die udf.
Maar met vertiaal zoeken word het veel te veel ballast.
Maar je kunt toch meerdere als na elkaar niet
Dacht zo als;als enz...
 
Wat je nog kan proberen (niet getest).
-Berekenen op handmatig ipv automatisch zetten op het tabblad Formules.
-Application.EnableEvents = False in het venster direct voordat je gaat debugGen. Vergeet niet om het achteraf weer aan te zetten. Application.EnableEvents = True
 
Jawel. Dat heet dan een geneste ALS-functie. Ik vind dat persoonlijk niet de elegantste oplossing met formules maar ik zou zeggen probeer het uit.
 
Als ik het zou nabouwen in Excel functies wordt het in ieder geval iets met VERT.ZOEKEN, omdat dat veel eenvoudiger te onderhouden is dan geneste ALS functies.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan