• 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 starten na wijzigen van een cel

Status
Niet open voor verdere reacties.

GrandCase

Gebruiker
Lid geworden
11 aug 2014
Berichten
49
Ik wil een macro starten als in cel C9 een n (van Nee) wordt ingevoerd. De volgende cellen krijgen dan een X.
Dat lukt perfect met de volgende code:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C9")) Is Nothing Then Exit Sub
If Target <> "n" Then Exit Sub
Range("C10:C12") = "X"
End Sub

Maar ik wil meer:
- De X moet ook in C10:C12 worden geplaatst als in C9 N wordt ingevuld.
- In de cellen C17:C18 moet ook een X komen als in C16 een n wordt geplaatst.
- De kans is groot dat ik op een ander werkblad hetzelfde ga doen, voor misschien wel meer cellen.

Met de vermelde code lukt me dat niet.
Is het een idee om bij wijzigen van één van de cellen C9 en C16 (en eventueel dus meerdere) een macro te starten die de X-en plaatst?

In de bijlage een simpel voorbeeld van wat ik heb.
Iemand die me kan helpen om dit uit te breiden?

Bekijk bijlage macro starten na wijzigen cel.xlsm
 
Hallo,

Zoiets?
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union(Range("C9"), Range("C16"))) Is Nothing Then
 Application.EnableEvents = False
   If LCase(Target) = "n" Then Target.Offset(1).Resize(3) = "X"
 Application.EnableEvents = True
End If
End Sub

Graag ook gebruik maken van codetags.
 
Laatst bewerkt:
Hallo Harry,

Dat is absoluut een zinvolle bijdrage. Dank daarvoor!
Maar ik ben er nog niet helemaal.

In je oplossing wordt namelijk zowel onder C9 als C16 drie keer een X geplaatst, terwijl dat onder C16 slechts twee keer moet.
Is dat ook een hobbel die te nemen is?
Groet,

Kees
 
Geen probleem Kees.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
 If Not Intersect(Target, Union(Range("C9"), Range("C16"))) Is Nothing Then
  Application.EnableEvents = False
   If LCase(Target) = "n" Then Target.Offset(1).Resize(IIf(Target.Row = 9, 3, 2)) = "X"
  Application.EnableEvents = True
 End If
End If
End Sub
 
Geweldig Harry, werkt prachtig.
Ik heb geprobeerd dit nog wat uit te breiden, maar loop dan meteen weer vast :confused:

Wil je me aub nog een keer helpen?
Stel dat ik dit wil uitbreiden met een 'geneste' functie. Als volgt:

Als C25 = n dan C26:C30 = X. Plus, als C26 = n, dan C27:C30 = X.

Kan dat?
 
Test het maar eens weer Kees.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
 If Not Intersect(Target, Union(Range("C9"), Range("C16"), Range("C25"))) Is Nothing Then
  Application.EnableEvents = False
   If LCase(Target) = "n" Then
      If Target.Row = 25 And Target.Offset(1) = LCase("n") Then
         Target.Offset(2).Resize(3) = "X"
       Else
         Target.Offset(1).Resize(IIf(Target.Row = 9, 3, IIf(Target.Row = 16, 2, 4))) = "X"
      End If
    End If
  Application.EnableEvents = True
 End If
End If
End Sub
 
Je bent een tovenaar Harry. :thumb:
Ik vraag me af of het me gaat lukken deze code later te gebruiken voor andere tabbladen. Hoop ooit zo ver te komen.

Maar één dingetje werkt nog niet.
Als C25 = n, dan krijgen C26:C30 een X. Maar kunnen C27:C30 ook een X krijgen als C25 = y en C26 is n?
 
De "n" of de "y" gelden alleen voor c25, anders had ik het wel een meervoudig 'case' gebruikt.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
 If Not Intersect(Target, Union(Range("C9"), Range("C16"), Range("C25"))) Is Nothing Then
  Application.EnableEvents = False
  Select Case LCase(Target)
      Case "n"
       If Target.Row = 25 And LCase(Target.Offset(1)) = "n" Then
        Target.Offset(2).Resize(3) = "X"
      Else
         Target.Offset(1).Resize(IIf(Target.Row = 9, 3, IIf(Target.Row = 16, 2, 4))) = "X"
       End If
       Case "y"
         If Target.Row = 25 And LCase(Target.Offset(1)) = "n" Then
            Target.Offset(2).Resize(3) = "X"
          Else
            Target.Offset(1).Resize(4) = "X"
         End If
      End Select
    
  Application.EnableEvents = True
 End If
End If
End Sub
 
Laatst bewerkt:
Sorry dat ik er weer op terugkom, maar dit werkt mooi, maar niet perfect.

Als ik in C25 een hoofdletter (Y) invoer werkt het niet en als er eenmaal iets anders is ingevuld wordt dat niet (net als bij de andere cellen) overschreven met een X wanneer alsnog een N wordt ingevoerd.
 
Zo beter?
Code aangepast in vorig schrijven.
 
Bijna helemaal goed.
Alleen krijgen C26:C29 nu altijd een X ongeacht of er in C25 een y of een n wordt ingevuld. En een n in C 26 heeft geen gevolgen.

Misschien heb ik het niet goed beschreven?
Voor de zekerheid:

Als C25 = y (of Y) hoeft er niets te gebeuren
Als C25 = n (of N) krijgen C26:C30 een X
Als C26 = n (of N) krijgen C27:C30 een X
 
Een nieuwe omschrijving schept hernieuwde code.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
 If Not Intersect(Target, Union(Range("C9"), Range("C16"), Range("C25"))) Is Nothing Then
  Application.EnableEvents = False
   If LCase(Target) = "n" Then
      If Target.Row = 25 And LCase(Target.Offset(1)) = "n" Then
         Target.Offset(2).Resize(3) = "X"
       Else
         Target.Offset(1).Resize(IIf(Target.Row = 9, 3, IIf(Target.Row = 16, 2, 4))) = "X"
      End If
    End If
  Application.EnableEvents = True
 End If
End If
End Sub
 
Maar nog niet helemaal perfect:

Als ik in C26 een N invul krijgen C27:C30 nog geen X
En als in C26 iets is ingevuld en (later) wordt in C25 een n (of N) ingevuld moet de invoer in C26 worden overschreven met een X.
 
Eén van je eerdere berichten brengt erg verwarring met wat er nu weer moet gebeuren.

Als C25 = n, dan krijgen C26:C30 een X. Maar kunnen C27:C30 ook een X krijgen als C25 = y en C26 is n?
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
 If Not Intersect(Target, Union(Range("C9"), Range("C16"), Range("C25:C26"))) Is Nothing Then
  Application.EnableEvents = False
   If LCase(Target) = "n" Then
      If Target.Row = 25 Or Target.Row = 26 Then
         Target.Offset(1).Resize(3) = "X"
       Else
         Target.Offset(1).Resize(IIf(Target.Row = 9, 3, IIf(Target.Row = 16, 2, 4))) = "X"
      End If
    End If
  Application.EnableEvents = True
 End If
End If
End Sub
 
Excuses als ik verwarring heb gesticht.
Het antwoord op de vraag:

Als C25 = n, dan krijgen C26:C30 een X. Maar kunnen C27:C30 ook een X krijgen als C25 = y en C26 is n?

is inderdaad ja.

Als C25 = n krijgen C26:C30 een X
Als C26 = n krijgen C27:C30 een X
 
Sorry, die zin had ik beter weg kunnen laten.

Zoals je ongetwijfeld hebt begrepen gaat het om beantwoorden van vragen met Yes of No.
Als C25 = Y dan moet ook C26 worden beantwoord. Als C25 = N dan zijn de vragen C26:C30 niet meer van toepassing (= X)

Als C26 = Y dan moeten de vragen C27:C30 ook worden beantwoord.
Als C26 = N dan zijn de vragen C27:C30 niet meer van toepassing (= X)
 
Omdat het zo mooi gaat.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
 If Not Intersect(Target, Union(Range("C9"), Range("C16"), Range("C25:C26"))) Is Nothing Then
  Application.EnableEvents = False
  Target.Offset(1).Resize(3).ClearContents
   If LCase(Target) = "n" Then
      If Target.Row = 25 Or Target.Row = 26 Then
         Target.Offset(1).Resize(3) = "X"
       Else
         Target.Offset(1).Resize(IIf(Target.Row = 9, 3, IIf(Target.Row = 16, 2, 4))) = "X"
      End If
    End If
  Application.EnableEvents = True
 End If
End If
End Sub
 
Het lukt me vaak aardig om een macro te schrijven, maar dit gaat me ver boven m'n pet.
Als ik er de tijd voor had zou ik heel graag een cursus volgen om hierin meer thuis te raken.

Respect voor je inzet en geduld Harry.

Binnenkort gaat er een nieuwe service van start: http://www.returntoowner.eu/nl/
Als je dat iets vindt moet je me even een mail sturen via het adres dat je daar vindt. Dan regel ik dat je het eerste jaar een gratis account krijgt.

Hoe dan ook: Super bedankt voor je hulp.
 
Kees,

Ik hoop dat je vraag is opgelost.
Dat is het enige waar het hier om draait.

Ik zal zo even kijken naar de link.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan