Tento kurz vysvetľuje pole VBA, rôzne typy polí, varianty polí a metódy polí pomocou príkladov programovania:
Bežná premenná VBA je držiteľom miesta, ktorý uchováva hodnotu jedného údaja. Má vzťah 1 k 1, t. j. 1 premenná pre 1 hodnotu.
Teraz si predstavte, že ukladáte viacero hodnôt rovnakého typu. Namiesto vytvárania viacerých premenných môžete vytvoriť len jednu premennú a do nej ukladať všetky hodnoty rovnakého typu. Táto premenná sa nazýva ARRAY.
V tomto učebnom texte sa dozviete, čo je to pole VBA, jednorozmerné a dvojrozmerné polia spolu s rôznymi typmi polí, ako sú pevné a dynamické. Pochopíme tiež rôzne metódy polí, ktoré sa používajú vo VBA.
Pole VBA
Polia sú špeciálnym druhom premenných, ktoré môžu uchovávať viacero hodnôt rovnakého dátového typu.
Napríklad, ak máte mená 100 zamestnancov, potom namiesto vytvorenia 100 premenných dátového typu string môžete vytvoriť len jednu premennú typu array string a priradiť 100 hodnôt do tej istej premennej array.
Jednorozmerné pole
Pole, ktoré má všetky prvky v jednom riadku alebo v jednom stĺpci, sa nazýva jednorozmerné pole. Uvedenie mien všetkých žiakov triedy v jednom stĺpci je príkladom jednorozmerného poľa. Je deklarované podľa nasledujúceho obrázka.
Dim arrayname(lowerbound To UpperBound) As DataType
Existuje viacero spôsobov deklarácie poľa. Nižšie je uvedených niekoľko príkladov.
Príklad:
#1) Dim MyArrayExample(0 až 3) As Integer
Vytvorí pole s umiestnením 0,1,2,3, ktoré bude prijímať hodnoty Integer.
#2) Dim MyArray2(3) As String
Predvolené hodnoty od 0 do 3 a vytvorí pole s umiestnením 0,1,2,3, ktoré bude prijímať hodnoty String.
#3) Dim MyArray2(13 až 15) As Double
Vytvorí pole začínajúce od 13, t. j. 13, 14 a 15, a akceptuje hodnoty Double. Spodnú hranicu sme uviedli ako 13, takže pole začne prideľovať hodnoty od miesta 13 a nie od 0.
Vytvorme si jednoduchý kód a pochopme všetky 3 spôsoby deklarácie poľa.
Poznámka: Napísanie kódu VB Otvorte program Microsoft Excel (podporované verzie sú Excel 2007, 2010, 2013, 2016, 2019). Prejdite na Karta Vývojár -> Visual Basic (Prípadne použite klávesovú skratku Alt+F11). V editore VB kliknite na Vložiť -> Modul a vložte nasledujúci kód.
Uvažujte o nasledujúcom postupe, ktorý ukazuje rôzne typy vyhlásení.
Private Sub arrayExample1() Dim firstQuarter(0 To 2) As String 'vytvorí pole s indexom 0,1,2 firstQuarter(0) = "Jan" firstQuarter(1) = "Feb" firstQuarter(2) = "Mar" MsgBox "First Quarter in calendar " & " & firstQuarter(0) & " & firstQuarter(1) & " & firstQuarter(2) End Sub Private Sub arrayExample2() Dim secondQuarter(2) As String 'vytvorí pole s indexom 0,1,2secondQuarter(0) = "April" secondQuarter(1) = "May" secondQuarter(2) = "June" MsgBox "Second Quarter in calendar " & " " & secondQuarter(0) & " " & secondQuarter(1) & " " & secondQuarter(2) End Sub Private Sub arrayExample3() Dim thirdQuarter(13 To 15) As String 'vytvorí pole s indexom 13,14,15 thirdQuarter(13) = "July" thirdQuarter(14) = "Aug" thirdQuarter(15) = "Sep"MsgBox "Tretí štvrťrok v kalendári " & " & tretí štvrťrok(13) & " & tretí štvrťrok(14) & " & tretí štvrťrok(15) End Sub
Stlačte kláves F5 alebo stlačte tlačidlo Spustiť na paneli nástrojov, aby sa kód spustil.
Bežná premenná a premenná v poli
Teraz už vieme, ako funguje jednorozmerné pole. Poďme si teda na chvíľu uvedomiť, prečo sú polia v programovacích jazykoch také dôležité.
Predpokladajme, že potrebujete zadať plat 5 zamestnancov. Aby ste to dosiahli pomocou bežnej premennej, musíte vytvoriť 5 premenných.
Public Sub RegularVariable() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") ' Deklarovať premennú pre každého študenta Dim Emp1 As String Dim Emp2 As String Dim Emp3 As String Dim Emp4 As String Dim Emp5 As String ' Čítať známky študentov z bunky Emp1 = shet.Range("A" & 2).Value Emp2 = shet.Range("A" & 3).Value Emp3 = shet.Range("A" & 4).Value Emp4 = shet.Range("A" &5).Value Emp5 = shet.Range("A" & 6).Value ' Vytlačiť značky študentov Debug.Print "Emp Name" Debug.Print Emp1 Debug.Print Emp2 Debug.Print Emp3 Debug.Print Emp4 Debug.Print Emp5 End Sub
Teraz vytvorme rovnaký kód pomocou premennej Array.
Option Explicit Public Sub ArrayVarible() Dim shet As Worksheet Set shet = ThisWorkbook.Worksheets("Sheet1") Dim Employee(1 To 6) As String Dim i As Integer For i = 1 To 6 Employee(i) = shet.Range("A" & i).Value Debug.Print Employee(i) Next i End Sub
Tu sme použili len jednu premennú array, ktorá bude uchovávať všetky mená zamestnancov. Predpokladajme, že potrebujete pridať ďalších 100 mien zamestnancov, potom stačí zmeniť veľkosť array a nemusíte vytvárať novú premennú.
Tým sa zníži počet riadkov v kóde, ktorý bude zrozumiteľný a čitateľný.
Dvojrozmerné pole
Dvojrozmerné pole má 2 indexy - prvý index bude predstavovať riadky a 2. index bude predstavovať stĺpec. Má viacero riadkov a stĺpcov a zvyčajne sa reprezentuje vo formáte tabuľky.
Deklarácia poľa 2 dim je nasledovná:
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Uvažujme príklad uloženia známok 2 študentov získaných z 3 predmetov. Vytvoríme teda dvojrozmerné pole, ktoré má 2 riadky a 3 stĺpce.
Pole začneme vytvárať od riadku 1 po riadok 2 a od stĺpca 1 po stĺpec 3.
Sub Twodim() Dim totalMarks(1 To 2, 1 To 3) As Integer totalMarks(1, 1) = 23 totalMarks(2, 1) = 34 totalMarks(1, 2) = 33 totalMarks(2, 2) = 55 totalMarks(1, 3) = 45 totalMarks(2, 3) = 44 Msgbox "Total Marks in Row 2 and column 2 is " &totalMarks(2,2) Msgbox "Total Marks in Row 1 and column 3 is " &totalMarks(1,3) End Sub
Stlačte kláves F5 alebo stlačte tlačidlo Spustiť na paneli s nástrojmi, aby sa kód spustil.
Riadok 2 a stĺpec 2
Riadok 1 a stĺpec 3
Pevné polia
Pevné polia nazývané aj statické polia majú pevne stanovenú dolnú a hornú hranicu a túto veľkosť nie je možné počas behu meniť. Veľkosť poľa sa uvádza počas deklarácie v zátvorkách. Všetky uvedené príklady sú pevnými poľami, pretože sme ich veľkosť uviedli počas deklarácie.
Pevné polia sa zvyčajne používajú vtedy, keď ste si istí veľkosťou poľa. Napríklad, počet dní v týždni, môžete vytvoriť pole s dolnou hranicou 0 a hornou hranicou 6 a mať istotu, že nikdy nezmeníte jeho veľkosť.
Dynamické polia
Dynamické polia nám umožňujú meniť veľkosť poľa počas behu. Sú užitočné vtedy, keď si nie ste istí veľkosťou poľa. Predpokladajme, že pri prijímaní na vysokú školu si nemusíte byť istí, koľko študentov bude skutočne prijatých, takže nemôžete určiť veľkosť v čase návrhu alebo deklarácie.
Deklarácia dynamického poľa je podobná statickému poľu s prázdnymi zátvorkami.
Dim Employee() As String
REDIM
Keď chceme zmeniť veľkosť, musíme použiť REDIM , musíme si uvedomiť, že dolnú hranicu nemôžeme zmeniť, môžeme zmeniť len hornú hranicu poľa.
Sub dynamicArray() Dim dynArray() As String Dim curdate As Date curdate = Now ReDim dynArray(2) ' Redim pomôže zmeniť veľkosť poľa počas behu dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Students Enrolled after " & curdate & " are " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) End Sub
Teraz už vieme, že môžeme meniť veľkosť poľa počas behu, preto môžeme použiť príkaz ReDim vždy, keď potrebujeme zväčšiť ubound poľa. Skúsme ešte raz zväčšiť veľkosť poľa a pridať nové meno študenta.
Sub RedimExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Študenti zapísaní do " & curdate & " sú " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim dynArray(3) ' Redim znovu inicializuje pole a zničí staré hodnotydynArray(3) = "John" MsgBox "Študenti zapísaní do " & curdate & " sú " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Mohli ste si všimnúť, že výsledok nezobrazuje mená študentov pridaných predtým, ale dáva nulovú hodnotu. Je to preto, že príkaz Redim vytvorí nové pole s novou veľkosťou a zničí staré hodnoty.
ReDim Preserve
Príkaz Represerve nám pomáha prekonať obmedzenie ReDim tým, že zachováva staré hodnoty a tým zväčšuje veľkosť poľa.
Prepíšeme vyššie uvedený kód pomocou funkcie ReDim Preserve.
Sub preserveExample() Dim dynArray() As String Dim curdate As Date curdate = Now Dim size As Integer ReDim dynArray(2) dynArray(0) = "John" dynArray(1) = "Tom" dynArray(2) = "Tonny" MsgBox "Študenti zapísaní do " & curdate & " sú " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) ReDim preserve dynArray(3) ' Redim preserve zachová staré hodnotydynArray(3) = "John" MsgBox "Študenti zapísaní do " & curdate & " sú " & dynArray(0) & ", " & dynArray(1) & ", " & dynArray(2) & " , " & dynArray(3) End Sub
Keďže sme použili kľúčové slovo preserve, predtým zadané hodnoty sa nestratia a nová hodnota sa úspešne pridá.
Pole variantov
Doteraz sme videli pole prijímajúce rovnaký typ hodnôt. Teraz deklarujme pole ako variant a uložme rôzne typy údajov ako String, Date, Long, Integer do jedného poľa.
Príklad:
Sub arrayVariant() Dim arrayData(3) As Variant arrayData(0) = "Vikram Vikrant" arrayData(1) = 411234567890# arrayData(2) = 38 arrayData(3) = "06-09-1972" MsgBox "Podrobnosti o osobe " & arrayData(0) & " je " & " telefónne číslo " & arrayData(1) & " ,Id " & arrayData(2) & " ,DOB " & arrayData(3) End Sub
Metódy polí VBA
Vo VBA existuje niekoľko metód, ktoré nám pomôžu vykonávať rôzne funkcie, ako je uvedené nižšie.
Sl. č. | Názov | Syntax | Popis |
---|---|---|---|
1 | Pole | Array(zoznam argumentov) | Prevedie bežný variant premennú do poľa. |
2 | Vymazať | Vymazať názov poľa | Slúži na reintializáciu poľa pevnej veľkosti a uvoľní pamäť pre pole Dynamic. |
3 | IsArray | IsArray (názov premennej) | Určuje, či je premenná pole. |
4 | Väzba L | LBound( ArrayName, [Dimension] ) | Vracia najnižší index poľa. |
5 | Ubound | UBound( ArrayName, [Dimension] ) | Vracia najvyšší index poľa. |
6 | Split | Split(výraz, [ oddeľovač, [ limit, [ porovnať ]]]) | Rozdelí reťazec na viacero podreťazcov a vráti pole založené na nule. |
7 | Pripojte sa k | Join(sourcearray, [ delimiter ]) | Spojí viacero podreťazcov v poli a vráti reťazcovú hodnotu. |
8 | Filter | Filter(sourcearray, match, [ include, [ compare ]]) | Filter nám umožní vyhľadávať zadaná zhoda z poľa. |
Poďme si každý z nich podrobne rozobrať na príklade.
#1) Pole
Deklarujme bežnú variantnú premennú a použime ju ako pole. Keď chceme zmeniť bežnú variantnú premennú na pole, musíme použiť ARRAY ako je uvedené v nasledujúcom príklade.
Funkcie poľa prijímajú argument, ktorý obsahuje hodnoty oddelené čiarkami. Tieto hodnoty sú priradené ako prvok poľa.
Sub variantArray() Dim varData As Variant varData = Array("Mon Bel", "+61 112334123", 567, "06-09-1972") MsgBox "Podrobnosti o osobe " & varData(0) & " je " & " Telefónne číslo " & varData(1) & " ,Id " & varData(2) & " ,DOB " & varData(3) End Sub
Premennú v poli musíte identifikovať pomocou indexu, preto sa v uvedenom príklade hodnoty načítajú ako varData(0) varData(2) varData(3).
#2) Vymazať
Táto funkcia vymaže všetky hodnoty zadané pre pole pevnej veľkosti a uvoľní miesto v pamäti pre dynamické pole.
Syntax: Erase arrayname
Vymazanie má rôzne správanie pre rôzne typy údajov, ako je uvedené nižšie.
- Pre pevnú číselnú hodnotu: Všetky hodnoty sa vynulujú.
- Pre pevný reťazcový dátový typ: Všetky hodnoty sa vynulujú.
- Pre dynamické pole: Uvoľní pamäť používanú poľom.
Príklad:
Sub eraseExample() Dim NumArray(3) As Integer Dim decArray(2) As Double Dim strArray(2) As String NumArray(0) = 12345 decArray(1) = 34.5 strArray(1) = "Erase Function" Dim DynaArray() ReDim DynaArray(3) MsgBox " Hodnoty pred vymazaním " & (NumArray(0)) & "," & (decArray(1)) & " , " & (strArray(1)) Erase NumArray Erase decArray Erase strArray Erase DynaArray ' Uvoľnenie pamäte ' VšetkoMsgBox " Hodnoty po vymazaní " & NumArray(0) & "," & decArray(1) & " , " & strArray(1) End Sub
Výsledok pred použitím funkcie Vymazať
Výsledok po použití funkcie Vymazať
#3) IsArray
Táto funkcia slúži na určenie, či zadaná vstupná premenná je pole alebo nie. Vráti true, ak je zadaná premenná true, inak vráti false.
Syntax : IsArray (názov premennej)
Príklad:
Sub isArrayTest() Dim arr1, arr2 As Variant arr1 = Array("Jan", "Feb", "Mar") arr2 = "12345" MsgBox ("Is arr1 an Array : " & IsArray(arr1)) MsgBox ("Is arr2 an Array : " & IsArray(arr2)) End
Výsledok z prvého okna Msgbox
Výsledok z druhého msgboxu
#4) Lbound
Vracia najnižší dolný index poľa zadaného ako argument funkcie Lbound.
Syntax: LBound( ArrayName, [Dimension] )
ArrayName je názov poľa.
Dimension je nepovinná celočíselná hodnota, ak má pole viacero dimenzií, potom môžete určiť, ku ktorej dimenzii chcete určiť Lbound.
Príklad:
Sub lboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Deklarovať premenné poľa. Dim Arraywithoutlbound(10) Result1 = LBound(ArrayValue, 1) ' Vracia 1. Result2 = LBound(ArrayValue, 3) ' Vracia 10. Result3 = LBound(Arraywithoutlbound) MsgBox "Najnižší dolný index v prvom poli " & Result1 & " najnižší dolný index v treťom poli " & Result2 & " Najnižšísubscript in Arraywithoutlbound " & Result3 End Sub
#5) Ubound
Vracia horný dolný index poľa zadaného ako argument vo funkcii Ubound.
Syntax: UBound( ArrayName, [Dimension] )
ArrayName je názov poľa.
Dimension je nepovinná celočíselná hodnota, ak má pole viacero dimenzií, môžete určiť, podľa ktorej dimenzie chcete určiť Ubound.
Príklad:
Sub UboundTest() Dim Result1, Result2, Result3 Dim ArrayValue(1 To 10, 5 To 15, 10 To 20) ' Deklarovať premenné poľa. Dim ArraywithoutUbound(10) Result1 = UBound(ArrayValue, 1) Result2 = UBound(ArrayValue, 3) Result3 = UBound(ArraywithoutUbound) MsgBox "Najnižší dolný index v prvom poli " & Result1 & " najnižší dolný index v treťom poli " & Result2 & " najnižší dolný index vArraywithoutlbound " & Result3 End Sub
#6) Rozdeliť
Vráti pole s počtom podreťazcov odvodených od zadaného celého reťazca.
Syntax: Split(výraz, [ oddeľovač, [ limit, [ porovnať ]]])
- Vyjadrenie: Toto je celý reťazec, ktorý sa použije na vytvorenie podreťazcov.
- Oddeľovač: Pomocou zadaného oddeľovača sa vygenerujú podreťazce. Ak tento nie je uvedený, za oddeľovač sa považuje medzera.
- Limit: Počet podreťazcov, ktoré sa majú vrátiť.
- Porovnajte: Po vytvorení podreťazca môžete na testovanie výsledku použiť rôzne možnosti porovnania.
Príklad: V nasledujúcom príklade používame oddeľovač ako - a limit ako 3.
Preto funkcia split rozdelí celý reťazec na podreťazce na základe oddeľovača. Ale uviedli sme aj limit 3, takže podreťazce sa nebudú vytvárať po limite 3. Teda posledný oddeľovač - bude preskočený.
Sub splitExample() Dim MyString As String Dim Result() As String Dim DisplayText As String MyString = "Toto je príklad pre-VBA-Split-Function" Result = Split(MyString, "-",3) MsgBox Result(0) & vbNewLine & Result(1) & vbNewLine & Result(2) & vbNewLine & Result(3) End Sub
#7) Pripojte sa
Toto je len opačný postup ako split, Join vytvorí jeden reťazec spojením niekoľkých podreťazcov.
Syntax: Join(sourcearray, [ delimiter ])
Zdrojové pole: Jednorozmerné pole reťazcov, ktoré chcete spojiť do jedného.
Oddeľovač: Zadaný oddeľovač sa pridá za každý reťazec pri spájaní.
Príklad:
Sub joinExample() Dim Result As String Dim dirarray(0 To 2) As String dirarray(0) = "D:" dirarray(1) = "SoftwareTestingHelp" dirarray(2) = "Arrays" Result = Join(dirarray, "\") MsgBox "Date after joining " & Result End Sub
Všetky 3 hodnoty sú spojené a \ je umiestnené medzi jednotlivými slovami, ako sme spomenuli \ ako oddeľovač.
#8) Filter
Filter nám umožní vyhľadať zadanú zhodu z poľa. Na základe kritérií filtra sa vráti podmnožina reťazcového poľa.
Syntax: Filter(sourcearray, match, [ include, [ compare ]])
Príklad:
Sub filterExample() Dim Mystring As Variant Mystring = Array("Testovanie softvéru", "Pomoc pri testovaní", "Pomoc pri testovaní softvéru") filterString = Filter(Mystring, "help") MsgBox "Nájdené " & UBound(Mystring) - LBound(Mystring) + 1 & " slová zodpovedajúce kritériám " End Sub
Tento príklad vyhľadá slovo "help" vo všetkých reťazcoch poľa pomocou funkcie filter.
Často kladené otázky
Q #1) Ako získať dĺžku poľa vo VBA?
Odpoveď: Na získanie dĺžky poľa použijeme funkciu Ubound. Táto funkcia nám poskytne horný index zadaného poľa.
Q #2) Ako deklarovať pole vo VBA?
Odpoveď: Jednorozmerné pole je deklarované podľa nasledujúceho obrázka.
Dim arrayname(lowerbound To UpperBound) As DataType
Príklad: Dim Myarray(0 až 2) As Integer
Dvojrozmerné pole je deklarované podľa nasledujúceho obrázka.
Dim ArrayName(FirstIndex To LastIndex, FirstIndex To LastIndex) As DataType.
Príklad: Dim marks(1 až 3, 0 až 2) As Integer
Q #3) Ako previesť rozsah na pole?
Odpoveď: Na prevod rozsahu na pole môžeme použiť funkciu Transpose. Tento kód vytvorí Mys[10]
Sub Example() Dim Mys As Variant Mys = Application.Transpose(Range("A1:A10")) End Sub
Q #4) Čo je variant poľa vo VBA?
Odpoveď: Variantné pole akceptuje všetky typy údajov pre svoj index, t. j. v jednom poli môžete ukladať rôzne typy hodnôt.
Príklad:
Dim arrayData(3) As Variant
arrayData(0) = "Vikas Vipal"
arrayData(1) = 411234567890#
Na príkladoch sme prebrali spôsoby zmeny veľkosti poľa počas behu a tiež zachovanie hodnôt pomocou redim preserve. Na záver sme sa naučili metódy poľa, ktoré nám pomôžu pri vykonávaní viacerých operácií.