Matricele în VBA - macro-uri și programul VBA - Excel - Articole Directory - perfectă Excel
De ce matrice
Matricele simplifica foarte mult procesul de programare. Fără ei este aproape imposibil de a scrie un program universal. De exemplu, imaginați-vă că manipulează informații despre apartament casa. Declară variabile K1 - pentru primul apartament, K2 - a doua și așa mai departe. K1 = 54 ar însemna că prima suprafață plană de 54 mp K2 = 72, etc. Acum, imaginați-vă că avem nevoie pentru a calcula suprafața totală a tuturor apartamentelor din casă. Evident, acest lucru este ceva de genul Total_S = K1 + K2 +. + Kn. Într-o casă avem 36 de apartamente, iar în celălalt 144. Imaginați-vă procesul delirante acestei programare? În primul caz, mi-ar trebui să utilizeze 36 de variabile separate pentru a calcula suprafața totală, a doua casa are 144. Foarte repede ajuns la ideea că ai nevoie de o variabilă care este format din celule numerotate. Apoi are sens toate ciclurile operatorilor care fac parte din orice limbaj de programare. Dar mai târziu în acest sens.
Ce este o matrice
Array - variabilă, constând dintr-un număr de elemente similare. În matrice, la fel ca orice altă variabilă, are un nume. Și accesul la un element specific al matricei se face prin specificarea în paranteze după numele indicelui său. De exemplu, A (5) înseamnă că se referă la un element cu o matrice index 5 având nume A.
tipuri de matrice
Arrays în VBA, și multe alte limbaje de programare sunt împărțite în 2 clase:
tablouri dinamice. Aceste tablouri pot fi „re-declara“ în ciclul de viață al procesului. Asta este, putem controla numărul de elemente ale intervalelor dinamice acoperă, în funcție de nevoile noastre. Este foarte convenabil, deoarece, în cele mai multe cazuri, programatorul nu poate ști în avans, cu orice cantitate de date se va confrunta. Dacă intenționați să scrie mai mult sau mai puțin programe universale, atunci acest tip de matrice este cu siguranță în valoare de explorare.
După cum putem vedea, sunt anunțate matrice 2-dimensionale arrTemp și arrTest. matrice dimensionale în programarea este, de asemenea, adesea menționată ca vectori. Elementele tip de prima matrice este un lung. a doua matrice - String. In acest tip de sintaxă în paranteze indică indicele maxim (limita superioară) a elementului de matrice. Cum rămâne cu indexul minim (limita inferioară) a șirului? În mod implicit, indicele minim este zero. În acest caz, comportamentul implicit al limbajului VBA interpret poate fi modificat cu ajutorul operatorului opțiunea de bază. Opțiunea de bază 1 cauzează VBA să ia în considerare limita inferioară a unei matrice - una, nu este zero.
Astfel, în mod implicit arrTemp matrice are 11 elemente - de la 0 la 10. Cu toate acestea, în cazul în care la începutul modulului în care este declarată matrice, se introduce operatorul Opțiunea Baza 1. arrTemp matrice va avea 10 elemente - de la 1 la 10.
În plus față de cele de mai sus, puteți utiliza următoarea sintaxă, care nu depinde de bază opțiune:
astfel încât să specificați în mod explicit limitele și inferioare și superioare. După cum puteți vedea, limita inferioară nu este în mod necesar trebuie să înceapă cu 0 sau 1. Mai mult decât atât, indicii granițelor pot lua pe valori negative, principalul lucru care a fost mai mică decât în partea de sus de jos.
În plus față de matrice unidimensionale, puteți declara și matrice cu dimensiune mai mare decât unul.
arrMulti - matrice bidimensională, și arrData3 - tri-dimensională. Prima conține 11 * 31 = 341 de element, al doilea - 2 * 3 * 10 = 60 elemente. Teoretic este permis să declare o matrice de până la 60 de dimensiuni.
matrice dinamice sunt declarate astfel:
ReDim [Păstrare] varname (subscript) [Ca Type]
După această declarație, puteți folosi elementele de matrice arrOpen 0-lea la al 5-lea. Tot ceea ce am spus despre opțiunea de bază de operator și limită inferioară este valabil și pentru matrice dinamice. Să presupunem că ați salvat informații în elementele 0-5 și aveți o nouă piesă de informații coapte pentru elementele 6-11. Pentru a plasa în matrice de elemente noi și să nu-și piardă vechi, trebuie să faceți următoarele:
că este, suntem în creștere limita superioară de matrice și de a folosi cuvântul cheie Păstrare. că, în timpul acestei operațiuni, nu pierde conținutul curent arrOpen. deoarece în caz contrar (fără cuvântul Păstrare) matrice va fi extins, iar memoria este umplută cu zerouri. Este posibil, de asemenea, nu declară o declarație Dim matrice. și de a face acest lucru prima dată prin ReDim și aceleași elemente punctul de tei. Dar, dacă sunteți în primul ReDim (sau Dim) indică un anumit tip de elemente, în următoarele afirmații ReDim acest tip nu poate fi înlocuită - o eroare la compilare a proiectului.
schimbarea matrice
Este timpul pentru noi să trebuie să învețe să utilizeze matrice noastre - care este, pentru a scrie informații în elementele lor, și a citit-o de acolo. Este destul de simplu:
Ca și în înregistrarea variabilă convențională a informațiilor în elementul de matrice are loc prin intermediul operatorului de atribuire (=), dar elementul indicator al indicelui matrice.
matrice de lectură
Determinarea limitelor de matrice
Rutinele de multe ori trebuie să se ocupe de fișiere care sunt transferate la tine, ca un parametru (cum se face acest lucru de mai jos), astfel încât în acest caz, este problema extrem de determinare a limitelor inferioare și superioare ale indicelui matrice. Pentru a face acest lucru, într-un limbaj există 2 funcții: LBound și UBound. Primul returnează limita indicele inferior, al doilea - cel superior.
LBound (array [, dimensiune])
UBound (array [, dimensiune])
Pentru rețea unidimensională de parametri dimensiuni pot fi omise. Pentru matrice multidimensionale, este necesar să se specifice. Apropo, acest lucru înseamnă că, dacă nu sunteți sigur cum să aibă o serie de afaceri, dar trebuie să-l învețe prima dimensiune, cel mai bine este de a utiliza o variantă UBound (arrTemp, 1). în schimb UBound (arrTemp). ca ultimă opțiune va eșua în cazul în care matrice va fi multidimensionale.
Dacă ați făcut o greșeală cu indexul corect al matrice, există un cod de eroare de run-time 9. Aceeași eroare apare dacă funcția LBound / UBound specifica o matrice de dimensiune inexistentă (de exemplu, 3 pentru matrice bidimensională).
Parcurge matrice
De fapt, matrice sunt necesare pentru a stoca același tip de informații în ei și prin ei în bucla. De regulă, algoritmul face ceva util cu un element de matrice, și ciclul se repetă acești pași pentru toate elementele standard ale șirului.
Operatorul cel mai convenabil de a bucla prin elementele de matrice - cu siguranță pentru. În continuare.
există, de asemenea, o modalitate de a nu trebuie să vă faceți griji cu privire la determinarea limitelor inferioare și superioare, în cazul în care algoritmul nu necesită cunoașterea noastră a indicelui matrice curent:
Desigur, puteți sorta prin matrice, și în alte tipuri de cicluri Do. Buclă. dar într-adevăr, sensul și comoditatea, acest lucru nu este mult. Cel putin nu am intalnit pare la situații în care să itera peste matrice pentru bucla nu se apropie.
Pase Arrays în subprograme
Matricele sunt cele mai convenabile pentru a transmite rutina ca un parametru de tip Variant.
Rețineți că matrice de funcții GetResult sunt trecute ca parametru. Cu faptul că, în primul caz este o serie de elemente de tip lung. iar în al doilea - String. Datorită faptului că în cadrul unei funcții utilizează variabile de tip Variant. prima funcție ne întoarcem suma elementelor de matrice arrIntegers. și în al doilea plus rezultat (concatenare) arrStrings rânduri matrice. În plus, opțiunea parArray nu este descris ca o matrice (parArray Ca variantă), dar suntem în funcții GetResult se comportă cu el ca și cu o matrice (pentru fiecare element din parArray)! Acest lucru este posibil deoarece variabilele de tip Variant capabil să determine ce sunt date și continuă să se comporte în conformitate cu ceea ce le conțin. În cazul în care variabila este atribuit parArray matrice (prin intermediul unui apel de funcție - liniile 17 și 18), se va comporta ca o matrice.
O matrice de tip matrice elemente
Noi demonstra modul în care se păstrează ca și alte matrice de elemente de matrice.
Rezultat de imprimare de depanare:
funcţia Array
Această caracteristică este utilă pentru crearea unei matrice de referință. Se returnează o variabilă de tip Variant. care cuprinde un unul dimensional matrice elemente de tip Variant.
Array (arglist)
Apelarea unei funcții fără parametri va duce să se întoarcă o serie de lungime zero. În același timp, va exista un efect interesant LBound 0 se va întoarce la tine, și UBound întoarce -1, adică, limita superioară este mai mică decât limita inferioară.
funcţia Split,
Split, returnează o matrice unidimensională care conține subșirurilor de expresii șir având în vedere separatorul
Split (expresie [, delimitator [, limita [, compara]]])
Expresia - O expresie șir care conține subșirurile și delimitatori. Obligatoriu.
delimitator - text delimitator. Opțional. Dacă omis, se presupune că separatorul este un spațiu gol.
limită - numărul subsirului care urmează să fie returnate. -1 sau absența acesteia înseamnă că este necesar să se întoarcă toate subșiruri.
compara - o constantă care specifică tipul de comparație pentru delimitatori. 1 - compararea textuală (fără registre contabile) 0 - compararea binară (majuscule și minuscule).
Rezultatul arată astfel:
Dacă ca delimitator specificați un șir gol, apoi de ieșire va primi o matrice care constă dintr-un singur element. Apropo, divizat returnează întotdeauna o matrice cu zero, legat mai mici, fără nici o dependență de disponibilitatea opțiunii de bază 1.
Nuanțele de lucru cu matrice dinamice
matrice neinitializate
Într-o gamă dinamică, există o stare intermediară în cazul în care acesta a fost deja anunțată, dar încă nu conține niciun element.
Aceasta este, matrice dinamică variabilă au o stare în care nu putem folosi funcțiile auxiliare LBound / UBound pentru a determina starea (matrice). Acest lucru este în special necesar să se ia în considerare atunci când scrie rutine care lucrează cu matrice. Înainte de a lucra (pentru a atinge) matrice, trebuie să vă asigurați că acesta este inițializat, în caz contrar programul va decola cu eroare de 9.
În acest scop, propun să utilizeze o funcție similară cu cea descrisă mai jos IsNotEmptyArray:
Extinderea matrice
Ca regulă generală, trebuie să se extindă o matrice dinamică într-o buclă. Există 2 strategii posibile: extinderea elementului 1, de îndată ce este necesar (apel-o extensie flexibilă) și extinderea în avans, atunci când crește limita superioară de salturi, spun o dată la 100 de articole. Prin livrarea atât, pentru mine, am ajuns la concluzia că extinderea avansului și a devenit tot mai mic și mai repede, deoarece extinderea operațiunii, în general, costisitoare și, mai puțin frecvent invocat, cu atât mai bine.
Jos a ieșit chiar mai mult metoda compactă
matrice de evacuare
Nu Ștergeți declarație. care eliberează complet memoria din matrice dinamică. Fiind numit pentru o matrice statică ea se resetează, iar dacă este un șir de caractere, elementul este atribuit un șir gol.
Noțiuni de bază o matrice bazată pe o gamă Excel
Cel mai eficient mod de a obține viteza conținutului gamei Excel pentru manipularea în VBA - este să-l copiați în matrice de elemente Variant. Acesta este după cum urmează:
Chiar dacă treci într-o matrice de rând sau coloană, matrice rezultată va avea întotdeauna două dimensiuni. Măsurarea 1 este responsabilă pentru liniile, de măsurare 2 - pentru coloane. Aceasta este, celula C5 va arrTemp elementul (5,3). Limita inferioară a unor astfel de matrice va începe întotdeauna cu unitatea.