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

Twee VBA's samenvoegen

  • Onderwerp starter Onderwerp starter HJ25
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

HJ25

Gebruiker
Lid geworden
30 jan 2013
Berichten
304
Hallo,

ik heb onderstaande twee VBA codes via het forum gekregen, maar nu wil ik deze allebei op hetzelfde werkblad gebruiken. Helaas krijg ik hierbij problemen. Heeft iemand hier een oplossing voor? Ik krijg namelijk steeds de melding dat "Worksheet_Change" twee keer voorkomt en dit mag blijkbaar niet en wanneer ik "Private Sub Worksheet_Change (ByVal Target As Range)" bij de tweede weglaat dan werkt hij niet meer :(

VBA code 1:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$69" Then
Range("F69") = ""
End If
If Target.Address = "$D$71" Then
Range("F71") = ""
End If
If Target.Address = "$D$73" Then
Range("F73") = ""
End If
If Target.Address = "$D$75" Then
Range("F75") = ""
End If
End Sub


VBA code 2:
Private Sub Worksheet_Change(ByVal doel As Range)
If doel.Address = "$F$34" Then
If doel < doel.Offset(, -1) Then
MsgBox "Begintijd mag niet groter zijn dan de eindtijd!", vbCritical, "Fout"
doel = doel.Offset(, -1)
End If
End If
If doel.Address = "$G$34" Then
If doel > doel.Offset(, 1) Then
MsgBox "Eindtijd mag niet groter zijn dan de begintijd!", vbCritical, "Fout"
doel = doel.Offset(, 1)
End If
End If
End Sub


Iemand die mij hierbij kan en wil helpen? Alvast bedankt!!
 
Als je ze aan elkaar wilt plakken kan je de 'Private Sub etc...' weghalen, maar moet je in de onderste code 'doel' wijzigen naar 'Target'

Of zo:
Code:
Private Sub Worksheet_Change(ByVal doel As Range)
    If doel.Address = "$D$63" Or doel.Address = "$D$71" Or doel.Address = "$D$73" Or doel.Address = "$D$75" Then
        doel.Offset(, 2) = ""
    End If
    If doel.Address = "$F$34" And doel < doel.Offset(, -1) Then
        MsgBox "Begintijd mag niet groter zijn dan de eindtijd!", vbCritical, "Fout"
        doel = doel.Offset(, -1)
    End If
    If doel.Address = "$E$34" And doel > doel.Offset(, 1) Then
        MsgBox "Eindtijd mag niet kleiner zijn dan de begintijd!", vbCritical, "Fout"
        doel = doel.Offset(, 1)
    End If
End Sub

By the way in de 2e code staat dat de 'eindtijd mag niet groter zijn dan begintijd'. Denk dat je bedoelt 'kleiner' ;)
 
Laatst bewerkt:
Ah top! Nog een vraagje, hoe zit dat nou precies bij "Then doel.Offset(, 2)"? Hoe moet ik daar de juiste cel aangeven? Is het getal voor de komma de kolom en het getal na de komma de rij of andersom? (Of wordt daarmee aangegeven dat de 2e cel daarnaast leeggemaakt moet worden?)

Haha ja het moet "kleiner" zijn inderdaad! Goed opgelet! Bedankt!
 
.Offset(regels, kolommen) is vergelijkbaar met de Excel functie 'verschuiven' en de cijfers geven aan hoeveel regels of kolommen.

Dus hoe zit het bij 'Then doel.Offset(,2)' = vanaf de gespecificeerde cel (doel) 2 kolommen naar rechts en dan je handeling
 
Laatst bewerkt:
Aha top! Ik snap het! Het werkt alleen nog niet... Ik heb jouw code geprobeerd, maar hij reageert nergens op dus heb ik de andere code aangepast en gemaakt zoals hieronder maar hier reageert hij ook niet op...

Ik kan toch gewoon het VBA scherm openen en dan dubbel klikken op het juiste blad in het linker deel van het scherm en daar de code in plakken?

(Mijn voorkeur gaat uit naar de kortere code, maar daar reageert hij dus ook niet op...)

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$80" Then
Range("F80") = ""
End If
If Target.Address = "$D$82" Then
Range("F82") = ""
End If
If Target.Address = "$D$84" Then
Range("F84") = ""
End If
If Target.Address = "$D$86" Then
Range("F86") = ""
End If

If Target.Address = "$F$34" Then
If Target < Target.Offset(, 1) Then
MsgBox "Begintijd mag niet groter zijn dan de eindtijd!", vbCritical, "Fout"
Target = Target.Offset(, 1)
End If
End If
If Target.Address = "$G$34" Then
If Target > Target.Offset(, -1) Then
MsgBox "Eindtijd mag niet groter zijn dan de begintijd!", vbCritical, "Fout"
Target = Target.Offset(, -1)
End If
End If
End Sub
 
Laatst bewerkt:
Uh ik heb het bestand opgeslagen en opnieuw geopend en nu werkt alles wel opeens! Bedankt spaarie!
 
Nog één dingetje: het gaat om onderstaande code.
Is het heel ingewikkeld om er een uitzondering in te zetten dat wanneer G34 nog leeg is dat F34 dan wel groter mag zijn dan G34? Want als ik onderstaande code gebruik kan ik de begintijd pas invullen wanneer de eindtijd ingevuld is. Als het heel ingewikkeld is dan hoeft het niet maar zou wel mooi zijn natuurlijk...

Code:
If doel.Address = "$F$34" And doel < doel.Offset(, -1) Then
        MsgBox "Begintijd mag niet groter zijn dan de eindtijd!", vbCritical, "Fout"
        doel = doel.Offset(, -1)
    End If
    If doel.Address = "$G$34" And doel > doel.Offset(, 1) Then
        MsgBox "Eindtijd mag niet kleiner zijn dan de begintijd!", vbCritical, "Fout"
        doel = doel.Offset(, 1)
    End If
 
Laatst bewerkt:
Ja dat wist ik al :D maar met een beetje zweten is niks mis ;)
Code:
    If doel.Address = "$G$34" And doel = "" Or doel.Offset(, -1) = "" Then
        Exit Sub
    Else
        If doel.Address = "$G$34" And doel < doel.Offset(, -1) Then
            MsgBox "Begintijd mag niet kleiner zijn dan de eindtijd!", vbCritical, "Fout"
            doel.Select
            doel = ""
        End If
    End If
    If doel.Address = "$F$34" And doel = "" Or doel.Offset(, 1) = "" Then
        Exit Sub
    Else
        If doel.Address = "$F$34" And doel < doel.Offset(, 1) Then
            MsgBox "Begintijd mag niet kleiner zijn dan de eindtijd!", vbCritical, "Fout"
            doel.Select
            doel = ""
        End If
    End If
 
Bedankt spaarie! Super!
Hahahaha nee dat is zeker niet erg nee. Moet dat altijd gedaan worden voordat het werkt?
 
HJ25,

Gelieve voor de leesbaarheid de code die je post tussen code-tags plaatsen aub.
 
Ow okee!
Tja sorry ik had verwacht dat het samenvoegen wel wat makkelijker zou zijn :P

Ik krijg nu alleen nog geen melding wanneer de begintijd groter is dan eindtijd...
Daarnaast krijg ik vaak de foutmelding:

"Fout 13 tijdens uitvoering:

Typen komen niet met elkaar overeen"


Zit er dan ergens een fout in de VBA code?
Hij maakt de achtergrond van de volgende zin geel:

Code:
If doel.Address = "$G$34" And doel = "" Or doel.Offset(, -1) = "" Then
 
Laatst bewerkt:
Moeten we niet realistisch blijven? Wanneer zal het voorkomen dat als iemand zijn begintijd heeft ingevuld en vervolgens een correcte eindtijd om vervolgens zijn begintijd weer aan te passen...
Lijkt mij eigenlijk nooit en zal dus volstaan met deze code:
Code:
Private Sub Worksheet_Change(ByVal doel As Range)
    If doel.Address = "$D$63" Or doel.Address = "$D$71" Or doel.Address = "$D$73" Or doel.Address = "$D$75" Then
        doel.Offset(, 2) = ""
    End If
    If doel.Address = "$G$34" And doel = "" Or doel.Offset(, -1) = "" Then
        Exit Sub
    Else
        If doel.Address = "$G$34" And doel < doel.Offset(, -1) Then
            MsgBox "Eindtijd mag niet kleiner zijn dan de begintijd!", vbCritical, "Fout"
            Application.Goto ActiveSheet.Range("G34")
            doel = ""
        End If
    End If
End Sub
 
Ja oke laten we er vanuit gaan dat dat dan niet voor zal komen...
Kan ik wanneer ik deze code wil uitbreiden voor meerdere cellen gewoon alles (op de eerste en laatste regel na) kopiëren?
 
Ja dat is wel mogelijk.
Maar blijf wel logisch nadenken over aangeven van doelcellen. Ik zou niet hele lappen met tekst gaan planten, maar een een oplossing zoeken hiervoor...

Jij weet wat je opmaak moet worden dus kan je alleen advies geven. Kijk voor logische verbanden die je eventueel kan oplossen met een For Each of geef ipv aparte cellen een heel bereik aan...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan