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

Kan de macro korter?

Status
Niet open voor verdere reacties.

ExcelAmateur

Terugkerende gebruiker
Lid geworden
25 aug 2010
Berichten
3.333
Hallo macro experts,

Hierbij een test file omdat ik niet de echte file kan plaatsen i.v.b. met privé gegevens.
De waarden staan op de zelfde kolomen zoals in de goede file.

DE macro werkt volgens mij goed maar het kan misschien wel beter.

Mijn vraag is:
Kan de macro korter of simpeler?

Alvast bedankt om er naar te kijken.
 

Bijlagen

Je kan vooral inkorten omdat je nu 3x dezelfde cellen test en ook dezelfde voorwaarden test op die cellen. Als je de cellen en de test in variabelen stopt word de macro een stuk korter. omdat je simpelweg de variablen herhaald ipv steeds de test opnieuw uit te voeren.
ik heb nu hele korte variabelen gemaakt met 1 letter en een volgnummer, als je code langer is met meer variabelen kan het voor de leesbaarheid of begrijpbaarheid beter zijn om langere variabelen te gebruiken ipv "w0" LaatsteW

Code:
Sub Controle()

Dim w0, w1, w2 As Long 'w0=laatste w1= een na laatste w2 = twee nalaaste waarde
Dim wt0, wt1, wt2 As Boolean ' waarde test met uitkomst true or false

w0 = Blad1.Cells(Rows.Count, 2).End(xlUp)
w1 = Blad1.Cells(Rows.Count, 2).End(xlUp).Offset(-1)
w2 = Blad1.Cells(Rows.Count, 2).End(xlUp).Offset(-2)

wt0 = w0 < 3.6 And w0 > 2.5
wt1 = w1 < 3.51 And w1 > 2.5
wt2 = w2 < 3.51 And w2 > 2.5

    If wt1 And wt0 Then Range("D12").Value = Date - 7: Range("E12").Value = "W2": Exit Sub
    If wt2 And wt1 And wt0 Or wt0 = False Then Range("D12").Value = Date: Range("E12").Value = "W1"
 
End Sub

andere gebruikte "trucjes" om code te verkorten
- ik heb bij w0 Blad1. gebruikt om naar blad1 te verwijzen ipv sheets("blad1"), niet alleen omdat het korter is maar ook omdat het foutbestendiger is, als jij aan het einde van je macro besluit de naam van de scheet te "blad1" te veranderen dan loopt je macro vast als je blad1. gebruikt dan heb je geen last van naamswijzigingen van tabbladen/werkbladen

- omdat de uit te voeren instructies bij de If then regels kort zijn heb ik ze niet onder elkaar maar achter elkaar gezet, gescheiden door dubbele punt, als een if then instructie maar 1 regel beslaat hoef je geen end if te gebruiken.
Deze wijze van noteren in alleen nuttig bij korte if then instructies als ze langer worden kun je ze wel weer beter over meerdere regels verdelen voor de leesbaarheid

nog een opmerking, het viel me op dat bij de 3e test "Als de laatste waarde groter dan 3,5 is of kleiner dan 2,5 is " dat deze onlogisch is je werkt in alle andere testen ook met 3,51, ofwel een 2e decimaal door die laatste test valt er een gat in de testen van de laatste waarde tussen 3,51 en 3,60 die vallen dan buiten de testen, het lijkt mij dat de laatste regel altijd moet worden getest en er geen waarden overgeslagen moeten worden. om dat op te vangen heb ik in de 2e if wt0=false gebruikt ipv een nieuwe test te maken op basis van w0 <3,5 or w0 > 2,5

zo de macro code is een stuk korter en de uitleg een stuk langer :D
 

Bijlagen

roeljongman,

Hartelijk bedankt voor het aanpassen en de uitleg van de macro.

De gegevens zoekt hij in een tabel.
De waarde moet tussen de 2,5 en 3,5 liggen.
Die 3,51 zou ik dus kunnen vervangen door 3,6 als ik het goedbegrijpt.

De tabel werkt voor 2 weken en ligt de 3e week ook binnen de norm,
dan moet er weer bij week 1 begonnen worden.

Ik ga het bestandje testen en dan in de orginele file plaatsen.

Nogmaals hartelijk dank voor uw inbreng. :thumb::thumb:
 
roeljongman,

Ik heb hem getest maar hij doet niet wat ik wil.

Als je de 3 onderste waarden zet op 2,7 - 2,9 - 3,4 zou hij de datum als 15-7-12 en W1 moeten plaatsen.
Als je de 3 onderste waarden zet op 2,7 - 2,9 - 3,7 zou hij de datum als 8-7-12 en W2 moeten plaatsen.
Als je de 3 onderste waarden zet op 2,7 - 3,6 - 3,8 zou hij de datum als 15-7-12 en W1 moeten plaatsen.

De waarde 2,7 als onderste

Wo geeft een getal met ,
W1 geeft een getal met ,
W2 geeft een getal zonder de ,

Vandaar dat ik 4 x IF en Exit sub heb gebruikt.

Misschien is het een kleinigheid voor u om dit aan te passen?
 
Als ik de macro zo plaatst werkt hij volgens mij goed.
Zo kan ik ook een beetje volgen wat er staat.
Code:
Sub Controle2()
'identieke macro alleen de if tests nu anders / leesbaarder neergezet

Dim w0, w1, w2 As Double 'w0=laatste w1= een na laatste w2 = twee nalaaste waarde
Dim wt0, wt1, wt2 As Boolean ' waarde test met uitkomst true or false

w0 = Blad1.Cells(Rows.Count, 2).End(xlUp)
w1 = Blad1.Cells(Rows.Count, 2).End(xlUp).Offset(-1)
w2 = Blad1.Cells(Rows.Count, 2).End(xlUp).Offset(-2)

wt0 = w0 < 3.6 And w0 > 2.5
wt1 = w1 < 3.51 And w1 > 2.5
wt2 = w2 < 3.51 And w2 > 2.5

    If wt2 And wt1 And wt0 Then
        Range("D12").Value = Date
        Range("E12").Value = "W1"
        Exit Sub
    End If
    
    If wt1 And wt0 Then
        Range("D12").Value = Date - 7
        Range("E12").Value = "W2"
        Exit Sub
    End If
    
    If wt0 Then
        Range("D12").Value = Date
        Range("E12").Value = "W1"
        Exit Sub
    End If   
    
End Sub
 
Als ik de macro zo plaatst werkt hij volgens mij goed.
Zo kan ik ook een beetje volgen wat er staat.

Dat laatste is ook belangrijk, dat je snapt wat er staat..
het zou kunnen dat mijn code net 1 stap tekort was omdat ik alle herhaling er uit wilde hebben. en bij macro's van deze lengte is een beetje herhaling niet zo erg. als je code langer word of een bepaalde test vaker word uitgevoerd is het wel voordelig voor de snelheid van uitvoeren om herhaling te vermijden

belangrijkste "leerpunt" van deze macrocode inkorting was het gebruik van de variabelen, die maken in dit geval de code én korter én leesbaarder. het andere trucje met die : meerdere instructies scheiden is wennen in gebruik maar als je veel testen doen wel weer
 
roeljongman,

Bedankt voor de uitleg.
Ga nu ook proberen om de kortere macro aan te passen.

Ik zal de vraag als opgelost zetten. :thumb: :thumb:
 
Roel,

Als je dit gebruikt:
Code:
Dim wt0, wt1, wt2 As Boolean
wordt alleen 'wt2' gedeclareerd als Boolean.
wt0 en wt1 zijn een variant.
Je moet 'As Boolean' telkens herhalen.
 
bedankt harry, moet zeggen dat ik dat nog op het lijstje had staan om te checken.

ik zie het steeds vaker in code voorbeelden maar vroeg me al af of het wel zo werkt, geld dit alleen voor boolean of ook voor "as string" enz..

grappige is natuurlijk doordat vba er een variant variabele van maakt accepteert ie alles wat je invoert, maar dan kun je de declaratie net zo goed weglaten.
 
Dat geldt voor elke variabele.
'w2' wordt ook alleen maar gedeclareerd als 'Double' en 'w0' en 'w1' dus niet.
Deze variabelen worden automatisch een variant.

Volgens @snb is het niet nodig te declareren door de techniek van tegenwoordig (snelheid en geheugen in de pc’s), en verwijderd dus 'Option Explicit'.
Ik heb daar een paar interessante discussies van waargenomen, en het blijft iedereen bezighouden.
 
Laatst bewerkt:
logisch ook dat het ook voor andere variabelen geld, en die opmerkingen over dat het met huidige snelheid en geheugen niet meer uitmaakt die ken ik ook, handig om te weten, maar ja toch vind ik het wel nuttig dat om te snappen wat er gebeurd.

option explicit en declareren van variabelen gebruik ik dan soms toch nog graag om schrijffouten snel te detecteren in de code en soms alleen tijdens het schrijven van de code. en ik word in langere code altijd gek van die 1 letter of nietszeggende variablenen als ik meer als x,y,z en i als variabelen tegenkom haak ik snel af, tenzij ik de logica snap. Maar ik gebruik liever wat meer benoemende variabelen als cRow of cCol om totaal aantal rijen of kolommen te tellen ipv alleen r of c

en met het declareren kun je dan ook wat uitleg toevoegen bovenaan de code zodat je bij het doorlopen al weet wat bepaalde variabelen doen.
 
Ervan afgezien dat je condities niet wederzijds uitsluitend zijn, kun je code verkorten met:

Code:
Sub Controle2()
  with  Blad1.Cells(Rows.Count, 2).End(xlUp)
    Range("D12").Value = Date - iif(.value<.6 and .value>2.5 and .offset(-1).value<3.51 and .offset(-1).value >2.5  And .offset(-2).value<3.51 and .offset(-2).value>2.5,0,7) 
    Range("E12").Value = "W" & iif(.value<.6 and .value>2.5 and .offset(-1).value<3.51 and .offset(-1).value >2.5  And .offset(-2).value<3.51 and .offset(-2).value>2.5,2,2) 
  end with
end sub

Zonder variabelen kun je ook een eind komen....
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan