Loop gennem formular- og kontrolelementer - Excel 2007 og nyere

I et regneark kan man opbygge formularer eller hvad man nu skal kalde det, ved at indsætte forskellige felter i et regneark. Disse elementer kan indsættes som formularelementer eller ActiveX kontrolelementer. Begge dele indsættes via knappen Indsæt, der findes i gruppen Kontrolelementer, på fanen Udvikler. Værktøjskassen indeholder to grupper med næsten de samme værktøjer, nemlig Kontrolelementer for formular og ActiveX objekter. Hvad forskellen er, hvad disse elementer kan bruges til, og hvilken type, der bør bruges hvornår, kan måske få sin egen artikel engang, men her lidt om en særlig udfordring ved de to typer.

Hvis man har et regneark med kontrolelementer i, har man af og til brug for at kunne tilgå disse elementer via kode, fx for at tildele dem en værdi. Skal man "loope" gennem flere ens kontrolelementer, kan man også gøre det, men her er det vigtigt at være opmærksom på, at de to forskellige typer af kontrolelementer, skal håndteres forskelligt.

Formularkontrolelementerne har en type, som skal bruges i koden (en afkrydsningsboks har fx typen Checkbox). Desuden har de også et navn. Skal man gennemløbe alle afkrydsningsfelter, bør man navngive dem, så navnene "ligner" hinanden, fx Afkryds1, Afkryds2 og så videre. Er der flere forskellige grupper, kan man give alle felter i samme gruppe, lignende navne, fx Parti1, Parti2, Parti3, Region1, Region2, Region3 osv.

Denne kode gennemløber samtlige afkrydsningsfelter i regnearket og sætter et flueben i dem:

Sub test()
    For Each Afk In ActiveSheet.CheckBoxes
        Afk.Value = True
    Next mychkbox
End Sub

Skal man kan gennemløbe en enkelte af grupperne, fx gruppen, hvis navne begynder med Parti, kan man bruge nedenstående kode, der fjerner flueben fra alle afkrydsningsfelter i gruppen Afkryds.

Sub test()
    For Each Afk In ActiveSheet.CheckBoxes
        If Left(Afk.Name, 5) = "Parti" Then
           Afk.Value = False
        End If
    Next mychkbox
End Sub


Har man i stedet brugt ActiveX kontrolelementer, har disse ingen type. Alle elementerne, hvad enten det er radioknapper, afkrydsningsfelter osv, er "bare" OLE-objekter.  Her kan man derfor ikke angive typen, men må nøjes med navnet, som derfor bliver endnu vigtigere, da navnet også bør fortælle om typen. ActiveX afkrydsningsfelter kan gennemløbes med denne kode. (Felternavnene starter med "Afkryds"). Koden gennemløber alle kontrolelementer, der starter med dettte navn, og forsøger at sætte et flueben.

Sub Test()
    Dim Afk As OLEObject
    For Each control In Sheets(1).OLEObjects
        If UCase(control.Name) Like "Afkryds*" Then
            Sheets(1).OLEObjects(control.Name).Object.Value = True
        End If
    Next

End Sub
 

Har man ikke IF-testen med, gennemløbes samtlige kontrolelementer i Ark1, og den forsøger at tildele en SAND værdi, til elementet. Da ikke alle elementer kan have en sådan SAND værdi, vil koden fejle, hvis ikke alle kontrolelementer, hvis navn begynder med "Afkryds" faktisk er afkrydsningsfelter eller andre kontrolelementer, som fx Radioknapper, der kan tage værdien SAND.

- Retur til makroer -
- Retur til Excel -