Sub Worksheet_Change werkt niet goed

Status
Niet open voor verdere reacties.

koenn

Gebruiker
Lid geworden
4 mrt 2009
Berichten
25
met behulp van het worksheet_change event wil ik macro's openen die in een module staan. Met onderstaande code roept hij alleen de bovenste macro aan.
Ook als de K27, O27 en S27 cellen niet worden gewijzigd blijft hij de macro uitvoeren.
Als ik de onderste aanroeping boven aan zet, doet hij hetzelfde met de andere macro.
wat doe ik verkeerd?

Code:
Sub Worksheet_Change(ByVal Target As Range)
'macros aansturen als invoerwaarde range gewijzigd worden

If Not Range("K27,O27,S27") Is Nothing Then
Call verlichtingperm2_macro
End If
'als verlichting totaal vermogen gewijzigd word macro verlichting per m2 aanroepen om vermogen per m2 in te vullen

If Not Range("K26,O26,S26") Is Nothing Then
Call verlichtingtotaal_macro
End If
'als verlichting vermogen per m2 gewijzigd word macro verlichting totaal aanroepen om totaal vermogen in te vullen

End
End Sub
 
ik heb de code gewijzigd door intersect toe te passen. Nu doet de code het goed voor de cellen K27 en K26. Maar niet voor de andere cellen.
ter verduidelijking:
in cel K26 staat vermogen in W/m2
in cel K27 staat totaal vermogen in W
het is de bedoeling dat als je de ene wijzigd hij automatisch de andere berekend.
met de code hier BOVEN deed hij het maar een richting op voor alle 3 de cellen (K,O,S)
met de code hier ONDER doet hij het voor de K cellen 2 richtingen op, maar voor andere doet hij het niet. Als ik bij de S of O cellen bijvoorbeeld het totaal vermogen wil wijzigen, rekent hij bij het verlaten van de cel het totaal vermogen weer uit aan de hand van het vermogen per m2. :confused:
Code:
Sub Worksheet_Change(ByVal Target As Range)
'macros aansturen als invoerwaarde range gewijzigd worden

If Not Intersect(Target, Range("K27,O27,S27")) Is Nothing Then
Call verlichtingperm2_macro
End If
'als verlichting totaal vermogen gewijzigd word macro verlichting per m2 aanroepen om vermogen per m2 in te vullen

If Not Intersect(Target, Range("K26,O26,S26")) Is Nothing Then
Call verlichtingtotaal_macro
End If
'als verlichting vermogen per m2 gewijzigd word macro verlichting totaal aanroepen om totaal vermogen in te vullen

End
End Sub
 
Volgens mij is dit meer een denk- dan een programmeerprobleem.

Als je wil dat voor verschillende cellen verschillende macro's worden uitgevoerd zul je dat aan moeten geven.
Suggestie: gebruik van call is overbodig

Code:
Sub Worksheet_Change(ByVal Target As Range)
  Select Case target.address
  Case "K$27"
    verlichtingperm2_macro
  Case "$O$27"
     ---------
  Case "$S$27"
    ---------
  Case "K$26","$O$26","$S$26"
    verlichtingtotaal_macro
  End select
End Sub
 
Laatst bewerkt:
SNB, als ik bovenstaand code gebruik geeft hij de volgende foutmelding:
compileerfout: ongeldige of niet-gekwalificeerde verwijzing.
hierbij verwijst hij naar het .Target.Address wat achter Select Case staat.
 
Haal de punt voor target weg (zie gewijzigde suggestie)
 
als ik de punt weg laat geeft hij de volgende fout melding:
fout 438 tijdens uitvoering: deze eigenschap of methode wordt niet ondersteund door dit object.
hij verwijst hierbij naar de regel: Select Case Target.Adress
 
Code:
Select Case Target.Adress

Dubbel D in address
 
bedankt voor de reacties
Nu geeft hij geen foutmeldingen meer, maar hij werkt ook niet.
mijn code
Code:
Sub Worksheet_Change(ByVal Target As Range)
'macros aansturen als invoerwaarde range gewijzigd worden
 Select Case Target.Address
  Case "K$27", "$O$27", "$S$27"
    verlichtingperm2_macro
  Case "K$26", "$O$26", "$S$26"
    verlichtingtotaal_macro
  End Select
deze macro's in module 1:
Code:
Sub verlichtingperm2_macro()
'invullen verlichtings vermogen per m2
Sheets("Iinstallatietechnisch").Range("K26").Value = Sheets("Iinstallatietechnisch").Range("AI23")
Sheets("Iinstallatietechnisch").Range("O26").Value = Sheets("Iinstallatietechnisch").Range("AJ23")
Sheets("Iinstallatietechnisch").Range("S26").Value = Sheets("Iinstallatietechnisch").Range("AK23")
End
End Sub
Sub verlichtingtotaal_macro()
'invullen totaal verlichtings vermogen
Sheets("Iinstallatietechnisch").Range("K27").Value = Sheets("Iinstallatietechnisch").Range("AI24")
Sheets("Iinstallatietechnisch").Range("O27").Value = Sheets("Iinstallatietechnisch").Range("AJ24")
Sheets("Iinstallatietechnisch").Range("S27").Value = Sheets("Iinstallatietechnisch").Range("AK24")
End
End Sub

ideeen?

update: met de aansturing zoals in mijn eerste post van dit onderwerp, werkt hij wel voor de cellen K26 en K27 maar niet voor de cellen S en O. Als ik in de macro's verlichtingperm2 en verlichtingtotaal ipv de regel met de K cellen een andere bovenaan zet bijv:de regels met O26en O27, doet hij het wel voor O en niet meer voor K en S.
aangezien deze regels gewoon onder elkaar in de macro staan zou hij ze toch alle 3 uit moeten voeren als de macro wordt aangestuurd?
 
Laatst bewerkt:
Volgens mij is dit meer een denk- dan een programmeerprobleem

Start de macro stap voor stap (in VBEditor F8) en kijk hoe vaak de verschillende macro's worden uitgevoerd (iets vaker dan je lief is).
 
hij blijft hem continu doorlopen als ik via hem stapvoor stap aanstuur via F8.
maar normaal doet hij dit toch alleen bij wijziging in een van de cellen...
hij voert van de macro's verlichtingtotaal en verlichtingperm2 steeds alleen maar de bovenste regel uit en verlaat daarna de macro weer.
hoe krijg ik het voor elkaar dat hij alle 3 de regels doorloopt?
 
Door eerst in gewoon Nederlands te formuleren wat je wil.
Hoe precieser je dat doet, hoe eenvoudiger het is om daarna te programmeren.
 
dacht dat dat vrij duidelijk was... maar goed. wat ik wil is het volgende:

celK26: invulmogelijkheid vermogen per vierkante meter [W/m2]
celK27: invulmogelijkheid totaal vermogen [kW]

dit ook zo voor cellen O26,27 en S26,27.

als de bijvoorbeeld cel K26 wordt gewijzigd moet de waarde K27 gehaald worden uit celAI24. En andersom, als cel K27 gewijzigd wordt, moet waarde K26 gehaald worden uit AI23.

idem voor O26,27 en S 26,27

comprende?
 
Capito.
Alleen jij nog niet.
Schrijf dit dan maar eens per cel uit: voor iedere gewijzigde cel een aparte macro.
Dan kunnen we later wel zien of er iets in de code samengevoegd kan worden.

Capisce ?
 
ik als vba leek snap het idd nog niet, heb nu voor elke apparte cel een apparte verwijzing en een apparte macro gemaakt, maar hij doet het nog niet. Heb even een gedeelte van het bestand in de bijlage gezet. De macro gaat over de sheet Iinstallatietechnisch.
 

Bijlagen

Als je slim bent maak je een onderscheid tussen cellen die door de gebruiker gewijzigd kunnen worden en die door het programma gewijzigd worden.
de gebeurtenis worksheet_change wordt dan alleen maar uitgevoerd als de gebruiker iest heeft gewijzigd. In jouw bestand worden door iedere wijziging (zowel van de gebruikers als door jouw macro's) steeds opnieuw dezelfde macro's uitgevoerd met onvoorspelbare effekten.

Suggestie: splits K26 en L26; ook K27 en L27.
Bestem K26 en K27 voor de gebruikersinvoer en gebruik L26 en L27 voor de resulaten van de berekening.
Laat de worksheet_change gebeurtenis alleen maar lopen als er iets gewijzigd wordt in K26 of K27.
Analoog geldt dit voor O26/O27 en S26/S27.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan