Bereiken in VBA-Excel

 

Werkboeken:

 

Eén methode om een bestand te activeren.

 

    Workbooks("Map1.xls").Activate  ‘ Let er op dat bij een reeds opgeslagen

                                                                             ‘ bestand ook de extentie moet vermeld worden

 

 

Werkbladen:

 

Drie methoden om een werkblad te selecteren:  Eén via de naam, één via het indexnummer (Het hoeveelste blad in de werkmap), en één via de CodeName van het werkblad.  De CodeName is de linkernaam van het werkblad wat je ziet in het venster ‘projectverkenner’.  Bij het aanmaken van een nieuw werkblad zijn de Name en de CodeName identiek.  Je kan echter de naam van het werkblad wijzigen, terwijl de codenaam niet zal gewijzigd worden.  Tuurlijk kan je de CodeName ook veranderen, maar dat moet wel via de VBA-editor.

 

    Worksheets("Blad1").Select

    Worksheets(1).Select

    Blad1.Select

 

Eveneens drie methoden om een verzameling van werkbladen te selecteren:

 

    Worksheets(Array("Blad1", "Blad2")).Select

    Worksheets(Array(1, 2)).Select

    Worksheets(Array(Blad1.Name, Blad2.Name)).Select

 

En drie methoden waar een berekening in de selectie is toegepast.  Het eerste voorbeeld selecteert het laatste blad.  Daarvoor wordt het aantal werkbladen geteld.  Het tweede voorbeeld selecteert het werkblad na Blad1.  Let er op dat bij berekeningen altijd gewerkt wordt met het indexnummer van de werkbladen!!!   Excel is tenslotte niet voor niets een rekenprogramma.

 

    Worksheets(Worksheets.Count).Select

    Worksheets(Worksheets("Blad1").Index + 1).Select

    Worksheets(Blad1.Index + 1).Select

 

En tenslotte: een verzameling werkbladen selecteren, via een lus:

 

    Dim i As Integer

    For i = 1 To 5

        Sheets(i).Select (False)

    Next

 

Door het argument False achter Select te zetten verliest Excel de overige geselecteerde bladeren niet.  Dit is enkel toepasselijk bij werkbladen.  Op die manier is het mogelijk een aantal bladeren te selecteren zonder onmiddellijk de naam of het indexnummer te noemen.

 

Cellen:

 

We beginnen bij de makkelijkste manier, waarbij via het sleutelwoord ‘Range’ verwezen wordt naar een duidelijk afleesbaar celbereik.  De methode ‘Range’ wordt eveneens door de macrorecorder gebruikt, en heeft als grote voordeel dat het auto-aanvullen in VBA ondersteund wordt.

 

    Range("A1").Select

    Range("A1,E5").Select

    Range("A1:E5").Select

    Range("A1:E5, G1:J5").Select

 

Tweede groep is een snelle manier om de code te schrijven.  Hierbij wordt gebruik gemaakt van rechthoekige haakjes.  Ook deze manier is duidelijk leesbaar.  Helaas kan men bij het schrijven van de code geen gebruik meer maken van auto-aanvullen.

 

    [A1].Select

    [A1:E5].Select

    [A1,E5].Select

    [A1:E5,G1:J5].Select

 

Een derde groep maakt gebruik van het index-nummer van de cellen.  Iets onduidelijker dan beide voorgaande methodes, maar enorm veel praktischer zo er berekeningen moeten gebeuren met de cellen.  Ik verdenk er Excel sterk van dat dit eigenlijk zijn natuurlijke manier is van werken, waarbij intern beide voorgaande manieren eerst omgezet worden naar deze notatie.

Je moet een Excel-blad eigenlijk zien als een verzameling van 16777216 celletjes.  Niet één minder, niet één meer.  Elk celletje heeft zijn eigen uniek nummer, wat oploopt van links naar rechts, en van onder naar boven.  Op die manier is het mogelijk één cel te selecteren aan de hand van één nummer.

In de meeste gevallen is het echter praktischer te werken met het rij-index-nummer, en het kolom-index-nummer.  Hier is wel enige oplettendheid geboden.  Immers, de volgorde is net omgekeerd als in de twee voorgaande notaties.  B.v.: Range(“A2”) is hetzelfde als Cells(2, 1).

Een handige methode om hier een gebied te selecteren dat groter is dan één cel, is het gebruik van de methode: Resize.  Deze methode vergroot het gebied met x aantal rijen, en x aantal kolommen.

 

    Cells(1).Select

    Cells(1, 1).Select

    Range(Cells(1), Cells(775)).Select

    Range(Cells(1, 1), Cells(5, 5)).Select

    Cells(1, 1).Resize(2, 5).Select

 

Een vierde groep vertrekt vanuit een willekeurig punt, en gaat dan zoveel plaatsen naar links, naar rechts, naar onder, of naar boven.

Ook hier dient opgemerkt te worden dat het eerste getal verwijst naar de verschuiving in rijen, en het tweede getal de verschuiving in kolommen. 

 

    Range("A1").Offset(4, 4).Select

    [A1].Offset(4, 4).Select

    Cells(1).Offset(4, 4).Select

 

In plaats van Offset kan men eveneens de korte notatie gebruiken.  Hierbij wordt het woord Offset weggelaten, en… hier even opletten: men begint de telling bij 1, terwijl dit in het voorgaande voorbeeld begon bij 0.

Volgende voorbeelden verwijzen telkens naar cel “B2”

 

    Range("A1")(2, 2).Select

    Cells(1, 1)(2, 2).Select

 

Volgend voorbeeld werkt niet!!!

 

    [A1](2, 2).Select

                 

 

Volgende voorbeelden selecteren een bereik, afhankelijk van de reeds gevulde cellen in een werkblad.  Let hier vooral op de sleutelwoorden:

CurrentRegion = Een aaneengesloten gebied, begrensd door de eerste lege kolom, en de eerste lege rij.

Rows = Rijen.  Ook deze hebben een indexnummer, die oploopt van boven naar beneden.

Columns = Kolommen.  Hebben eveneens een indexnummer dat oploopt van links naar rechts.

Count = Telt het aantal rijen/Kolommen/Cellen … afhankelijk van het argument dat er aan voorafgaat.  Dit geeft dus een geheel getal als resultaat.  Count is vaak zeer handig om te verwerken in berekeningen met bereiken.

 

    [A1].CurrentRegion.Select

    [A1].CurrentRegion.Rows(1).Select

    [A1].CurrentRegion.Columns(1).Select

 

    [A1].CurrentRegion _

    .Columns([A1].CurrentRegion.Columns.Count).Select

 

    [A1].CurrentRegion _

    .Columns([A1].CurrentRegion.Columns.Count + 1).Select

 

    [A1].CurrentRegion _

    .Rows([A1].CurrentRegion.Rows.Count).Select

 

     [A1].CurrentRegion _

    .Rows([A1].CurrentRegion.Rows.Count + 1).Select

 

    Cells([A1].CurrentRegion.Rows.Count + 1, 1).Select

 

Het volgende voorbeeld selecteert het gebruikte gebied in het actieve werkblad.  Dit hoeft niet noodzakelijk de eerste rij of kolom te zijn.  Wel moet het geen aaneengesloten gebied zijn, zoals in CurrentRegion.

 

    ActiveSheet.UsedRange.Select

 

Vorige voorbeelden werkten steeds vanuit een bereik van een gans werkblad.  Dezelfde methodes kunnen echter ook werken vanuit een beperkt bereik.  Zo is Range(“A1”) niet steeds cel A1 die je op je werkblad vind.  Een voorbeeld maakt dit duidelijk:  Indien je Range(“C3:D4”) hebt geselecteerd, dan is Selection.Range(“A1”) gelijk aan cel C3 in je werkblad… of de linkerbovencel uit je bereik.

Neem even de test:

Vul het bereik (“C3:D4”) met de waarden: “Linkerbovenhoek; Rechterbovenhoek; Linkeronderhoek en Rechteronderhoek”

Selecteer daarna het bereik: (“C3:D4”) en voer volgende macro’s uit:

 

    MsgBox "Range... " & Selection.Range("A1").Value

                  Dit geeft “Rechterbovenhoek” als resultaat (Of de cel rechtsboven van uw bereik.  Dit is hier cel C3)

 

    MsgBox "Cells... " & Selection.Cells(1, 1).Value

                  Dit geeft eveneens “Rechterbovenhoek” als resultaat.

 

DIT werkt echter niet:

    MsgBox "[ ]... " & Selection.[A1].Value

 

Rijen en kolommen.

 

Mogelijk moet je echter niet werken met hele werkbladen; cellen of celbereiken, maar wens je te werken met de ganse rij of kolom.

Volgende codes selecteren de ganse eerste rij:

 

    Range("1:1").Select

    Rows(1).Select

    Range("A1").EntireRow.Select  ‘ Vooral deze methode is zeer handig

    Cells(1, 1).EntireRow.Select

    [A1].EntireRow.Select

 

En volgende codes werken dus voor de kolommen (Telkens de A kolom in het voorbeeld)

 

    Range("A:A").Select

    Columns(1).Select

    Range("A1").EntireColumn.Select 

    Cells(1, 1).EntireColumn.Select

    [A1].EntireColumn.Select

 

                 

Een groep geïsoleerde bereiken.

 

Nog iets handig om te weten is de methode Areas.

Je kan werken met een aaneengesloten bereik, en daar allerlei bewerkingen op uitvoeren.

 

    Dim myRange As Range

    Set myRange = Range("A1:D4")

    MsgBox myRange.Cells.Count

 

Deze macro geeft het resultaat ‘16’… het aantal cellen binnen de  Range(“A1:D4”).

Het is echter niet noodzakelijk dat een Range ook een aaneengesloten gebied inhoud.  Het volgende is ook mogelijk:

 

    Dim myRange As Range

    Set myRange = Range("A1:D4, F1:I4")

    MsgBox myRange.Cells.Count

 

Deze macro geeft het resultaat ‘32’… het aantal cellen binnen de Range(“A1:D4, F1:I4”).  Maar deze Range heeft meer eigenschappen dan enkel het aantal cellen.  Deze Range heeft namelijk 2 geïsoleerde gebieden.  Hoe zou je dit kunnen tellen?

Volgende macro telt het aantal gebieden (Elk geïsoleerd gebied noemt men een Area).

 

    Dim myRange As Range

    Set myRange = Range("A1:D4, F1:I4")

    MsgBox myRange.Areas.Count

 

Deze macro geeft dus het resultaat 2.  Iets waar we ook rekening mee moeten houden, is dat beide bereiken elkaar mogen overlappen, en toch afzonderlijk behandeld worden.

 

    Dim myRange As Range

    Set myRange = Range("A1:D4, C2:F5")

    MsgBox myRange.Cells.Count

 

Deze macro bevat eveneens 2 Areas, ook al zijn ze niet echt gescheiden.  We hebben hier de overlappende cellen C2; C3; C4; D2; D3 en D4.  Deze cellen worden gewoon dubbel geteld, zodat we hier ook een resultaat van 32 krijgen.  (Het aantal cellen in het eerste gebied + het aantal cellen in het tweede gebied).

 

De Areas waarover hier sprake is, krijgen ook een index-nummer (zoals vrijwel alles in Excel).  Als test kan je volgende macro uitvoeren:

 

    Dim myRange As Range

    Set myRange = Range("A1:D4, F2:I5")

    MsgBox myRange.Areas(2).Address

 

Deze macro geeft adres: ‘$F$2:$I$5’ terug.  Dit is het tweede bereik binnen de Range.  De dollartekens zijn er bij gezet, vermits Excel dit als absoluut beschouwd.

Het is dus mogelijk om deze Areas ook afzonderlijk te benaderen, en één Area een behandeling te geven die je niet toepast op de andere.

 

    Dim myRange As Range

    Set myRange = Range("A1:D4, F2:I5")

    myRange.Areas(2).Select

 

Deze macro selecteert het gebied ‘F2:I5’.

 

Snijpunten tussen 2 (of meerdere) bereiken.

 

Om gezamenlijke cellen tussen 2 bereiken te bewerken kan je dan weer gebruik maken van de methode intersect.  Volgende macro selecteert de Range(“C3:D4”).

 

    Intersect(Range("A1:D4"), Range("C3:F6")).Select

 

Bereiken samenvoegen.

 

Met de functie Union is het mogelijk om 2 of meerdere bereiken samen te voegen tot 1 bereik.

Volgende code selecteert 2 kolommen zonder de functie Union.

 

    Range("A:A, C:C").Select

 

Om nu hetzelfde te bereiken via Rows of Columns, kan je de functie Union gebruiken.

 

    Union(Columns(1), Columns(3)).Select

 

Zo is het mogelijk deze functie te gebruiken in samenwerking met de vorige: ‘Intersect’.

Volgende code kleurt de cellen rood die deel uitmaken van (of de 3de rij; of de 5de rij) én de B kolom.

 

    Intersect(Union(Rows(3), Rows(5)), Columns(2)).Interior.ColorIndex = 3

 

Een praktijkvoorbeeld.

 

Als slot geef ik een voorbeeld waaruit blijkt dat het van belang is te kunnen werken met bereiken.  Dit voorbeeld selecteert het gebied te beginnen bij cel A1, en begrensd door de eerste lege rij, en de eerste lege kolom (Mogelijk een database dus).  Daarvan telt hij het aantal rijen, om tenslotte de cel te selecteren in kolom A, en één rij onder het gebruikte gebied.

In die cel wordt een formule geplaast, die de som maakt van alle bovenliggende cellen in kolom A.  Hiervoor wordt gebruik gemaakt van het adres van alle gebruikte cellen in kolom A.

 

    Cells([A1].CurrentRegion.Rows.Count + 1, 1).Formula = _

    "=SUM(" & [A1].CurrentRegion.Columns(1).Address & ")"