• 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.

Macro uitvoeren als een berekende waarde in een cel wijzigt

Status
Niet open voor verdere reacties.

Ruudh59

Gebruiker
Lid geworden
30 nov 2013
Berichten
56
Ik gebruik de volgende code:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("<range>")) Is Nothing Then
Call <macro>
End If
End Sub

Dit werkt als ik in een veld in de range handmatig de waarde wijzig.

Het werkt niet als een waarde in een veld in de range wijzigt t.g.v. een functie in dat veld.

Hoe krijg ik dat toch voor elkaar?
 
Door te controleren of een waarde wijzigt in een cel waar die functie gebruik van maakt.
 
Als ik ergens een waarde wijzig wil niet meteen betekenen dat het resultaat van een functie wijzigt.
 
Wel als het gaat om een waarde in een cel waar die functie gebruik van maakt.
Een functie die wijzigt triggert geen change event.
 
Laatst bewerkt:
Dat is niet waar. Een functie kan afhankelijk zijn van verschillende andere velden.
Als je de waarde van één van de velden wijzigt hoeft dat nog niet te betekenen dat de uitkomst van de functie wijzigt.
B.v. als de som van 2 velden groter moet zijn dan een bepaalde waarde.

Maar ik kan blijkbaar een macro niet laten triggeren op de uitkomst van een functie?
 
B.v. als de som van 2 velden groter moet zijn dan een bepaalde waarde.
Dan wijzigt 1 van die 2 cellen, of beide, toch?
Dan kan je dezelfde controle in de macro doen als wat de functie doet.
Dat laatste klopt.
 
Laatst bewerkt:
Maar ik kan blijkbaar een macro niet laten triggeren op de uitkomst van een functie?

Je kunt op basis van de Return value in jouw funktie wel een macro starten (of je het moet willen is een tweede)
 
Edmoor; precies, dan moet ik de functie opnieuw doen in de macro. Dat kan, maar ik had de uitkomst van de functie al ergens op het blad, dus het was makkelijk geweest om daarop te triggeren.

E v R; Wat bedoel je precies met "Je kunt op basis van de Return value in jouw funktie wel een macro starten"? Hetzelfde wat Edmoor bedoeld?

Ik begrijp uit jullie beide antwoorden, dan niet kan wat ik wilde doen. Dat zag ik natuurlijk gebeuren, maar misschien deed ik iets verkeerd.

Stel dat ik de waarden niet handmatig invoer, maar binnen krijg op basis van een query...
De query kan ik met een bepaalde regelmaat laten uitvoeren, b.v. elke 5 minuten.
Maar er is verder geen handmatige actie.
Hoe trigger ik vervolgens een macro?
 
Plaats eens een voorbeeldbestandje met de functie waarvan je wilt dat er (conditioneel) een macro gestart wordt.
 
Eric,

Het gaat eigenlijk om heel generieke functies.
Ik heb 2 situaties waarbij ik het starten van een macro wil triggeren.

In de eerste situatie gaat het n.a.v. handmatig ingevoerde gegevens, dus daar kan ik de voorgestelde oplossing van Edmoor gebruiken.

De andere situatie is n.a.v. een query, zoals ik ook al in mijn vorige reactie aangaf.
Ik wil het bestandje met de query niet delen want het betreft wat privacygevoelige info.

Je kan je misschien voorstellen dat ik b.v. een lijstje heb met 15 waarden die om de zoveel tijd d.m.v. een query wordt ingelezen.

Ik had bedacht om het lijstje als 'range' te gebruiken in onderstaande code, maar een wijziging in het lijstje triggerde niet de start van de macro.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("<range>")) Is Nothing Then
Call <macro>
End If
End Sub

Daarna heb ik een totaal-veld als range gebruikt, die som van de 15 waarden geeft, maar dat wilde dus ook niet werken als trigger.
De reden daarvoor is nu duidelijk, maar blijkbaar werkt het ook niet bij een wijziging van een veld n.a.v. een query.

De vraag kan nu toegespitst worden op: hoe kan ik een macro starten zonder handmatige tussenkomst, waarbij een query op de achtergrond draait?
 
Jammer dat je er geen voorbeeldbestandje bij doet, nu blijft de kans dat je langs elkaar blijft praten.

Jouw query "vult" een tabel in jouw bestand?
Hoe heet de sheet waarop deze tabel staat en is dit de enige tabel op deze sheet?
Wat is de naam van de module waarin de macro staat?
Hoe heet deze macro?
 
We praten idd op een ongelooflijke manier langs elkaar heen.
Wat doet het er b.v. toe hoe mijn macro heet?
Ik zal wel proberen een voorbeeld te fabriceren met andere data.
 
Als het een Event macro is doet de naam ervan er wel degelijk toe.
 
Wat doet het er b.v. toe hoe mijn macro heet?

Omdat ik dan een werkende code in jouw bestand kan/kon plaatsen of dat je evt gebruik had kunnen maken van Workbook_SheetTableUpdate indien jouw query gekoppeld is aan het Datamodel
maar nu moet er dus geraden worden, aannames worden gedaan en zijn we ondertussen bij post #14

Gebaseerd op mijn aanname dus:

zet in een klassenmodule : en noem deze Klasse Qclass

Code:
Private WithEvents QT As Excel.QueryTable
Public Property Set myQT(MyQuery As Excel.QueryTable)
    Set QT = MyQuery
End Property

Private Sub QT_AfterRefresh(ByVal Success As Boolean)
    Debug.Print "AfterRefresh"
    If Success Then tst 'hier de naam van jouw macro ipv tst als deze in een module staat
End Sub

Private Sub QT_BeforeRefresh(Cancel As Boolean)
    Debug.Print "BeforeRefresh"
End Sub

zet in een module:

Code:
Public FollowQT As Qclass
Sub PutOn()
    Set FollowQT = New Qclass
    Set FollowQT.myQT = Worksheets("tst").ListObjects(1).QueryTable 'pas de naam tst aan naar de naam van jouw sheet
End Sub

draai PutOn (of koppel deze aan Workbook_Open() ) en de macro draait steeds wanneer de query gefreshed wordt
 
Laatst bewerkt:
Eric,
Bedankt. Het werkt.
Moet bekennen dat ik geen idee heb hoe het werkt.
 
er bestaat toch zoiets als een calculate event
Code:
Private Sub Worksheet_Calculate()

End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan