Dynamický rozsah VBA

Tento článok ukáže, ako vytvoriť dynamický rozsah v programe Excel VBA.

Deklarovanie konkrétneho rozsahu buniek ako premennej v programe Excel VBA nás obmedzuje na prácu iba s týmito konkrétnymi bunkami. Vyhlásením dynamických rozsahov v programe Excel získavame oveľa väčšiu flexibilitu nad našim kódom a funkciami, ktoré môže vykonávať.

Referenčné rozsahy a bunky

Keď odkazujeme na objekt Rozsah alebo Bunka v programe Excel, zvyčajne na ne odkazujeme pomocou hardcodingu v požadovanom riadku a stĺpci.

Rozsah majetku

Pomocou vlastnosti Range v príkladoch nižšie uvedených riadkov kódu môžeme vykonávať akcie v tomto rozsahu, napríklad zmenu farby buniek alebo zvýraznenie buniek tučným písmom.

12 Rozsah ("A1: A5"). Font.Color = vbRedRozsah ("A1: A5"). Písmo.Bold = True

Vlastnosť buniek

Podobne môžeme vlastnosť buniek použiť na odkazovanie na rozsah buniek priamym odkazom na riadok a stĺpec vo vlastnosti buniek. Riadok musí byť vždy číslo, ale stĺpec môže byť číslo alebo písmeno uzavreté v úvodzovkách.

Na adresu bunky A1 je možné napríklad odkazovať takto:

1 Bunky (1,1)

Alebo

1 Bunky (1, „A“)

Ak chcete použiť vlastnosť buniek na odkaz na rozsah buniek, musíme označiť začiatok rozsahu a koniec rozsahu.

Napríklad na referenčný rozsah A1: A6 by sme mohli použiť túto syntax nižšie:

1 Rozsah (bunky (1,1), bunky (1,6)

Potom môžeme vlastnosť Bunky použiť na vykonávanie akcií v rozsahu podľa nižšie uvedených príkladov riadkov kódu:

12 Rozsah (bunky (2, 2), bunky (6, 2)). Font.Color = vbRedRozsah (bunky (2, 2), bunky (6, 2)). Písmo. Tučné = pravda

Dynamické rozsahy s premennými

Keďže sa veľkosť našich údajov v Exceli mení (t.j. používame viac riadkov a stĺpcov ako rozsahy, ktoré sme zakódovali), bolo by užitočné, keby sa zmenili aj rozsahy, na ktoré odkazujeme v našom kóde. Pomocou objektu Range uvedeného vyššie môžeme vytvoriť premenné na uloženie maximálneho počtu riadkov a stĺpcov oblasti pracovného hárka programu Excel, ktorú používame, a pomocou týchto premenných dynamicky upravovať objekt Range, keď je kód spustený.

Napríklad

1234 Dim lRow as integerDim lCol ako celé číslolRow = Rozsah ("A1048576"). Koniec (xlUp). RiadoklCol = Rozsah ("XFD1"). Koniec (xlToLeft). Stĺpec

Posledný riadok v stĺpci

Keďže v pracovnom hárku je 1048576 riadkov, premenná lRow prejde do spodnej časti listu a potom pomocou špeciálnej kombinácie klávesa Koniec a klávesu so šípkou hore prejde na posledný riadok použitý v pracovnom hárku - tým získame číslo riadku, ktorý potrebujeme v našom rozsahu.

Posledný stĺpček v rade

Podobne sa lCol presunie do stĺpca XFD, ktorý je posledným stĺpcom v hárku, a potom pomocou špeciálnej kombinácie klávesov klávesu Koniec a klávesu so šípkou doľava prejde na posledný stĺpec použitý v pracovnom hárku - tým získame číslo stĺpca, ktorý v našom rozsahu potrebujeme.

Preto, aby sme získali celý rozsah, ktorý sa používa v pracovnom hárku, môžeme spustiť nasledujúci kód:

1234567891011 Sub GetRange ()Dim lRow As IntegerDim lCol ako celé čísloDim rng As RangelRow = Rozsah ("A1048576"). Koniec (xlUp). Riadok'pomocou lRow pomôžte nájsť posledný stĺpec v rozsahulCol = Range ("XFD" & lRow) .End (xlToLeft) .ColumnNastaviť rng = rozsah (bunky (1, 1), bunky (lRow, lCol))'msgbox, aby nám ukázal rozsahMsgBox „Rozsah je“ & rng.AddressKoniec pod

SpecialCells - LastCell

Na získanie posledného riadka a stĺpca použitého v pracovnom hárku môžeme použiť aj metódu SpecialCells objektu Range.

123456789101112 Sub UseSpecialCells ()Dim lRow As IntegerDim lCol ako celé čísloDim rng As RangeDim rngBegin As RangeNastaviť rngBegin = rozsah ("A1")lRow = rngBegin.SpecialCells (xlCellTypeLastCell) .RowlCol = rngBegin.SpecialCells (xlCellTypeLastCell) .ColumnNastaviť rng = rozsah (bunky (1, 1), bunky (lRow, lCol))'msgbox, aby nám ukázal rozsahMsgBox „Rozsah je“ & rng.AddressKoniec pod

UsedRange

Metóda Použitý rozsah zahŕňa všetky bunky, ktoré obsahujú hodnoty v aktuálnom pracovnom hárku.

123456 Sub UsedRangeExample ()Dim rng As RangeNastaviť rng = ActiveSheet.UsedRange'msgbox, aby nám ukázal rozsahMsgBox „Rozsah je“ & rng.AddressKoniec pod

CurrentRegion

Aktuálna oblasť sa líši od UsedRange v tom, že sa pozerá na bunky obklopujúce bunku, ktorú sme deklarovali ako počiatočný rozsah (tj. Premenná rngBegin v nižšie uvedenom príklade), a potom sa pozerá na všetky bunky, ktoré sú 'pripojené' alebo priradené do tej vyhlásenej cely. Ak sa v riadku alebo stĺpci zobrazí prázdna bunka, CurrentRegion prestane hľadať ďalšie bunky.

12345678 Podprúdový región ()Dim rng As RangeDim rngBegin As RangeNastaviť rngBegin = rozsah ("A1")Nastaviť rng = rngBegin.CurrentRegion'msgbox, aby nám ukázal rozsahMsgBox „Rozsah je“ & rng.AddressKoniec pod

Ak použijeme túto metódu, musíme sa uistiť, že všetky bunky v požadovanom rozsahu sú prepojené bez prázdnych riadkov alebo stĺpcov.

Pomenovaný rozsah

V našom kóde môžeme tiež odkazovať na pomenované rozsahy. Pomenované rozsahy môžu byť dynamické, pretože keď sa údaje aktualizujú alebo vkladajú, názov rozsahu sa môže zmeniť tak, aby zahŕňal nové údaje.

V tomto prípade sa názov písma „január“ zmení na tučné písmo.

12345 Sub rangeNameExample ()Dim rng as RangeNastaviť rng = rozsah („január“)rng.Font.Bold = = PravdaKoniec pod

Ako vidíte na obrázku nižšie, ak je do názvu rozsahu pridaný riadok, názov rozsahu sa automaticky aktualizuje, aby zahrnoval daný riadok.

Ak by sme potom znova spustili ukážkový kód, rozsah ovplyvnený kódom by bol C5: C9, zatiaľ čo v prvom prípade by to bol C5: C8.

Tabuľky

V našom kóde môžeme odkazovať na tabuľky (kliknutím získate ďalšie informácie o vytváraní a manipulácii s tabuľkami vo VBA). Keď sa údaje tabuľky v programe Excel aktualizujú alebo menia, kód, ktorý odkazuje na tabuľku, bude potom odkazovať na aktualizované údaje tabuľky. Toto je obzvlášť užitočné pri odkazovaní na kontingenčné tabuľky, ktoré sú pripojené k externému zdroju údajov.

Pomocou tejto tabuľky v našom kóde môžeme na stĺpce tabuľky odkazovať podľa nadpisov v každom stĺpci a v stĺpci vykonávať akcie podľa ich názvu. Keďže riadky v tabuľke sa podľa údajov zväčšujú alebo zmenšujú, rozsah tabuľky sa podľa toho upraví a náš kód bude stále fungovať pre celý stĺpec v tabuľke.

Napríklad:

123 Sub DeleteTableColumn ()ActiveWorkbook.Worksheets ("Sheet1"). ListObjects ("Table1"). ListColumns ("Supplier"). OdstrániťKoniec pod
wave wave wave wave wave