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

VBA code vereenvoudigen / verkleinen

Status
Niet open voor verdere reacties.

Ivanhoes

Gebruiker
Lid geworden
6 jun 2015
Berichten
67
Hoi mensen,

Ziet iemand kans onderstaande code in VBA te vereenvoudigen, c.q. te verkleinen?

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$O$28" And Cells(28, 1).Value = 1 Then
MsgBox Range("C28").Value & vbCrLf & Range("D28").Value & vbCrLf & Range("E28").Value & vbCrLf & Range("F28").Value, vbOKOnly, "ATW-OVERTREDING"
End If
End Sub

Deze code doet niets anders dan kijken of de waarde in cel A28 =1. Als dat waar is, en er wordt een wijziging aangebracht in cel O28, dan wordt een
messagebox getoond.

De tekst van de messagebox luidt als volgt:

Titel : ATW-OVERTREDING
Regel 1: De waarde uit cel C28
Regel 2: De waarde uit cel D28
Regel 3: De waarde uit cel E28
Regel 4: De waarde uit cel F28

De waarden in de kolommen A, C, D, E en F worden normaal gesproken berekend aan de hand van de gegevens in de kolommen O en P.
A, C, D, E en F zijn nu handmatig ingevuld, omdat ik deze berekeningen niet als bijlage kan meesturen.
De waarden in kolom A zijn altijd 1 of 0.
De waarden in de kolommen C, D, E en f kunnen verschillend zijn. Allemaal leeg, allemaal vol of een enkele vol en een andere leeg.
Alles is mogelijk.

Zie ook bijgevoegd bestand, waarin ik iets meer regels code heb opgenomen.

Ik heb slechts één regel code laten zien, maar de messagebox moet getoond worden bij elke wijziging in de rijen 26 t/m 62, indien kolom O
in die ene rij gewijzigd wordt en kolom A in die ene rij =1.

Dit topic lijkt op mijn eerdere topic, maar de vraag is nu alleen of iemand kans ziet de code te vereenvoudigen / verkleinen.

Alvast bedankt voor de hulp en met vriendelijke groet,

Ivanhoes.
 

Bijlagen

Doe hem eens zo:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rglMin As Long
    Dim rglMax As Long
    Dim Regel As Long
    
    rglMin = 26
    rglMax = 62
    
    If Target.Column = 15 And Target.Row >= rglMin And Target.Row <= rglMax Then
        Regel = Target.Row
        If Cells(Regel, 1).Value = 1 Then
            MsgBox Cells(Regel, 3) & vbCrLf & _
                   Cells(Regel, 4) & vbCrLf & _
                   Cells(Regel, 5) & vbCrLf & _
                   Cells(Regel, 6), vbOKOnly, _
            "ATW-OVERTREDING"
        End If
    End If
End Sub
 
Of zo:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("O26:O62")) Is Nothing Then Exit Sub
    If Cells(Target.Row, 1) = 1 Then MsgBox Join(Application.Index(Cells(Target.Row, 3).Resize(, 4), _
        1, [Column(A:D)]), vbCrLf), vbOKOnly, "ATW-OVERTREDING"
End Sub
 
Laatst bewerkt:
Hoi Timshel,

Hartelijk dank voor de reactie.

Even gauw getest en beide codes werken perfect op het eerste oog! Hier ben ik heel blij mee.
Ik weet wat de code uiteindelijk doet, maar natuurlijk heb ik nog de onvermijdelijke vraag:

Wat doet precies wat in beide codes, c.q. waar staat wat voor?

en meteen nog maar een vraag:

Weet je ook welke code de minste berekeningstijd of berekeningscapaciteit op zal leveren?

In ieder geval nogmaals bedankt voor de snelle en goede reactie!

Groetjes,

Ivanhoes.
 
Ik vraag met name een stukje uitleg over het volgende deel van de code:

Join(Application.Index(Cells(Target.Row, 3).Resize(, 4), _
1, [Column(A:D)])

- Waar staat Target.Row, 3 voor?
- Waar staat Resize(, 4) voor?
- Waar staat die 1 voor?
- En wat houdt [Column(A:D)] voor?

Als ik dit begrijp, dan kan ik de code helemaal aanpassen aan het oorspronkelijke bestand.

Alvast bedankt en wederom groetjes,

Ivanhoes.
 
Hoi VenA,

Alsnog weer bedankt voor je reactie. Ik ga de link zeker bestuderen.


Mbt tot jouw antwoord over mijn vraag:

Ik heb de vorige vraag keurig op opgelost gezet, omdat deze ook opgelost is.
Nu vroeg ik alleen nog om een verkleining, c.q. vereenvoudiging, van die ene code. Vandaar dat ik dacht
dat een nieuw topic gepast was, omdat het onderwerp dan toch weer anders is.

Ik dacht verder toch ook neergezet te hebben dat ik een nieuw topic had gestart.

Maar hoe dan ook, ik ben blij dat ik geholpen wordt!

Groetjes,

Ivanhoes.
 
Mijn code doet wezenlijk hetzelfde als die van Edmoor. Zijn code is weliswaar langer, maar makkelijker te volgen. Hoewel de basale code van Edmoor waarschijnlijk iets sneller is dan de Application.Index-methode, zal het snelheidsverschil niet merkbaar zijn.
Ik raad aan eerst de code van Edmoor te doorgronden.
 
Laatst bewerkt:
Oke mensen,

Bedankt voor de reacties. Ik kan inmiddels redelijk goed werken met Excel, maar niet met VBA.
Vandaar deze vragen. Ik heb weinig gelezen over VBA, vandaar ook dat ik bijna niets weet van de
manier waarop de codes tot stand horen te komen en wat die doen.
Dus bij deze: ik ga mij zeker verdiepen in VBA en daarbij de codes die door jullie zijn gegeven proberen te doorgronden.

@VenA: Wat ik bedoelde is dat je schreef dat je een uitleg had gevoegd als bijlage in het vorige topic. Die uitleg kan ik niet vinden.
De link die je net meestuurde is naar mijn eigen topic. Had ik even niet gezien, haha.

@Timshel: Bedankt voor je laatste bericht!

Met vriendelijke groet,

Ivanhoes.
 
Of gewoon met:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("O26:O62")) Is Nothing Then Exit Sub
    y = Target.Row
    If Cells(y, 1) = 1 Then MsgBox Join(Array(Cells(y, 3), Cells(y, 4), Cells(y, 5), Cells(y, 6)), vbLf), , "ATW-OVERTREDING"
End Sub

of

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("O26:O62")) Is Nothing Then Exit Sub
    If Cells(target.row, 1) = 1 Then MsgBox Join(Application.Index(Target.Offset(, -12).Resize(2, 4).Value, 1), vbCr), , "ATW-OVERTREDING"
End Sub
 
Laatst bewerkt:
Hoi Snb,

Ik had niet verwacht nog meer antwoorden te krijgen. Bedankt voor je reactie!
Zeker omdat ik de eerste code helemaal kan volgen, èn vrij simpel kan aanpassen aan het oorspronkelijke bestand.
Hij werkt zoals het zou moeten.

De 2e code vind ik moeilijker, maar inmiddels begrijp ik van al jullie codes wel het stukje: Index(Target.Offset(, -12).Resize(2, 4)

Hoe dan ook, ik vind het fantastisch!

Met vriendelijke groet,

Ivanhoes.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan