Iteratie integreren in lange programmacode

Status
Niet open voor verdere reacties.

Delphine01

Gebruiker
Lid geworden
4 mei 2016
Berichten
10
Beste,

Ik zoek een manier om een repetitieve code in een loop te zetten. Alleen weet ik niet hoe ik dit kan doen. De variabele die elke keer zou moeten wijzigen is immers in de ene lijn een object, in de andere lijn tekst (string). Ook wordt diezelfde variabele gebruikt in de formule voor voorwaardelijke opmaak, die met diezelfde code ingesteld wordt.
Het gaat bv. om de variabele "V_G_01_Oefenfiches". In de volgende blok wordt dit "V_G_02_Oefenfiches", enz.
In deze code wordt ook vergeleken met de waarde van een cel "G 1", "G 2", enz. Heel gelijkaardig, maar zonder die nul ertussen.
Hierdoor moet ik telkens grote blokken dezelfde code zetten, en telkens 6 keren "V_G_01" aanpassen, en 1 keer "G 1". Ik kan me voorstellen dat dit heel omslachtig is, en dat dit toch in een loop zou moeten kunnen???

De code is misschien te lang om hier neer te pennen, vandaar een voorbeeldbestand in bijlage, met de code in module5...

Bekijk bijlage iteratie voor aanmaken namen en voorwaardelijke opmaak.xlsm

Groetjes
Delphine
 
Verwijder alles uit module5 en plak dit er dan in. Ik ben benieuwd ;)
Code:
Option Explicit
Dim EvaluatieBC As Worksheet
Dim strRange As String
Dim arrayBCVerkoop, bereikOefenfichesVerkoop
Dim cel As Object

'WINKELBEDIENDE - Tabblad "Evaluatie BC"
'NAMEN DEFINIEREN (BEREIK: werkblad --- NIET WERKMAP ALS BEREIK want geeft problemen bij importeren en verwijderen van tabbladen)
'VOORWAARDELIJKE OPMAAK INSTELLEN EN TOEPASSEN
'GEGEVENSVALIDATIE
'OPMERKINGEN PER BASISCOMPETENTIE TOEVOEGEN

Sub AlleNamenVerwijderen()
 Dim nm As Name
    For Each nm In ActiveWorkbook.Names
        nm.Delete
    Next
End Sub

Sub OpmaakEvaluatieBCWinkelbediende()
    
    Set EvaluatieBC = ActiveWorkbook.Sheets("Evaluatie BC")
    EvaluatieBC.Activate
    Cells.Select
    Selection.FormatConditions.Delete
    Set arrayBCVerkoop = Sheets("Evaluatie BC").[AM15].CurrentRegion    '------------------- cel van 1ste BC bepalen ---------------------------------------------------
    Set bereikOefenfichesVerkoop = Sheets("Evaluatie BC").[J32:AJ55]    '------------------- juiste range van Oefenfiches bepalen --------------------------------------

    Call VerkoopOefenFiche("G 1")
    Call VerkoopOefenFiche("G 2")
    Call VerkoopOefenFiche("G 3")
    Call VerkoopOefenFiche("G 4")
    Call VerkoopOefenFiche("G 5")
    Call VerkoopOefenFiche("G 6")
    Call VerkoopOefenFiche("G 7")
    Call VerkoopOefenFiche("G 8")
    Call VerkoopOefenFiche("G 9")
    Call VerkoopOefenFiche("G 10")
    Call VerkoopOefenFiche("G 11")
    Call VerkoopOefenFiche("G 12")
    Call VerkoopOefenFiche("G 13")
    Call VerkoopOefenFiche("G 14")
    Call VerkoopOefenFiche("G 15")
    Call VerkoopOefenFiche("G 16")
    Call VerkoopOefenFiche("G 17")
    Call VerkoopOefenFiche("G 18")
    Call VerkoopOefenFiche("G 19")
    Call VerkoopOefenFiche("G 20")
    Call VerkoopOefenFiche("G 21")
    
    Call VerkoopOefenFiche("S 1")
    Call VerkoopOefenFiche("S 2")
    Call VerkoopOefenFiche("S 3")
    Call VerkoopOefenFiche("S 4")
    Call VerkoopOefenFiche("S 5")
    Call VerkoopOefenFiche("S 6")
    Call VerkoopOefenFiche("S 7")
    Call VerkoopOefenFiche("S 8")
    Call VerkoopOefenFiche("S 9")
    Call VerkoopOefenFiche("S 10")
    
    'Venster "Namen beheren" tonen
    Application.Dialogs(xlDialogNameManager).Show

End Sub

Sub VerkoopOefenFiche(Waarde As String)
    Dim V_S_Oefenfiches As Range
    
    strRange = ""
    For Each cel In bereikOefenfichesVerkoop
        If cel.Value = Waarde Then
            If strRange = "" Then
                strRange = cel.Offset(, 1).AddressLocal(0, 0, xlA1)
            Else
                strRange = strRange & "," & cel.Offset(, 1).AddressLocal(0, 0, xlA1)
            End If
        End If
    Next cel
    
    If strRange <> "" Then
        Set V_S_Oefenfiches = EvaluatieBC.Range(strRange)
        V_S_Oefenfiches.Name = "'" & EvaluatieBC.Name & "'" & "!" & _
        "V_S_Oefenfiches"
        V_S_Oefenfiches.Select
        Selection.FormatConditions.Delete
        Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
            "=ALS(AANTALARG(V_S_Oefenfiches)>=1;WAAR;ONWAAR)"
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1).Interior
            .PatternColorIndex = xlAutomatic
            .ThemeColor = xlThemeColorAccent3
            .TintAndShade = 0.599963377788629
        End With
        Selection.FormatConditions(1).StopIfTrue = False
    End If
End Sub

Uiteraard doe je dat in een kopie van je originele document.
Werkt het dan nog niet precies zoals je zou willen, dan heb je in ieder geval een idee hoe je dergelijke repeterende zaken kan aanpakken.
 
Laatst bewerkt:
Je maakt er wel een onleesbare code van. Wat wil je eigenlijk met het geheel bereiken? Over het hoe en waarom zal je wel geen antwoord geven totdat je weer ergens tegenaan loopt. (Zie ook jouw andere draadje.)

Als aanvulling op het idee van edmoor

Code:
Sub OpmaakEvaluatieBCWinkelbediende()
Dim j
With Sheets("Evaluatie BC")
    Set EvaluatieBC = ActiveSheet
    Set arrayBCVerkoop = .[AM15].CurrentRegion
    Set bereikOefenfichesVerkoop = .[J32:AJ55]

    .UsedRange.FormatConditions.Delete
    arrayBCVerkoop = .[AM15].CurrentRegion
    For j = 2 To UBound(arrayBCVerkoop)
        VerkoopOefenFiche (arrayBCVerkoop(j, 1))
    Next j
End With
End Sub
 
Laatst bewerkt:
ergonomisch werken:

- gebruik geen samengevoegde cellen
- gebruik geen 'select of 'activate' in VBA

economisch werken:

- gebruik geen benoemde gebieden in VBA: benoemde gebieden zijn een hulpmiddel voor de gebruiker die geen VBA kent/gebruikt.
 
Lukt me niet echt. Te hoog gegrepen voor mij.
Ik heb wel noties van VBA, maar ik zie de grote lijnen van het objectgeorienteerd programmeren te weinig. Een goede bijscholing zou beter zijn zeker... Sorry als ik jullie tot last ben.

Ik ben bezig met een soort evaluatiesysteem uit te bouwen voor een school, waarbij 1 Excel doc per leerling gebruikt wordt. De achterliggende bedoeling van de VBA is eigenlijk om zoveel mogelijk opmaak via VBA te kunnen instellen zodat gemakkelijk gelijkaardige documenten kunnen aangemaakt en aangepast worden. Die VBA code is dus niet voor de gebruiker, maar puur voor mij, om alle Excel documenten te kunnen beheren (aanmaken, aanpassen, ...), om te vermijden dat ik per document veel aanpassingen in opmaak e.d. manueel moet gaan doen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan