Sortarea unei matrici

După ce se încarcă informații în matrice dintr-o sursă externă, matricea trebuie sortată. Din păcate, VBA nu are o comandă încorporată pentru a sorta o matrice.

Sortarea este ușor de înțeles: se rearanjează lucrurile în ordinea dorită. De exemplu, elementele dintr-o matrice pot fi sortate în ordine alfabetică sau invers alfabetică, în ordine crescătoare sau descrescătoare.

Cu toate acestea, scrierea unui program de sortare este mult mai dificilă, deci nu se recomandă scrierea lui de către începători. Dar se pot copia exemple de pe Internet sau din exemplul următor.

Această secțiune arată o formă simplă de sortare, numită bubble sort. Sortarea constă din două bucle care compară două elemente din matrice; dacă cel de-al doilea element este mai sus în listă decât primul element, sortarea inversează pozițiile și comparațiile continuă până când întreaga listă este ordonată corect. Bubble sort este o metodă relativ ineficientă de sortare a obiectelor, dar este ușor de înțeles, iar procesoarele sunt rapide în aceste zile.

Acest exemplu vă introduce, de asemenea, un element major de programare: bucla. Buclele sunt un instrument important găsit în multe proceduri și proiecte. De fapt, o buclă repetă o anumită acțiune până când o condiție este îndeplinită. Este ca și cum ai spune: "Continuă să rearanjezi aceste cărți până când stiva este în ordine alfabetică".

1.   Option Explicit
2.   Option Base 1
3.        
4.   Sub Sortare_Matrice()
5.        
6.  'declarare matrice si alte variabile
7.       Dim strArray(12) As String
8.       Dim strTemp As String
9.       Dim strMsg As String
10.      Dim X As Integer, Y As Integer, i As Integer
11.    
12.  'atribuire valori text – string la matrice
13.   strArray(1) = "nihilism"
14.   strArray(2) = "defetism"
15.   strArray(3) = "speranta"
16.   strArray(4) = "melancolie"
17.   strArray(5) = "euforie"
18.   strArray(6) = "disperare"
19.   strArray(7) = "optimism"
20.   strArray(8) = "pesimism"
21.   strArray(9) = "bucurie"
22.   strArray(10) = "fericire"
23.   strArray(11) = "extaz"
24.   strArray(12) = "mania"
25.    
26.   strMsg = "Elementul curent din matrice:" & vbCr & vbCr
27.   For i = 1 To UBound(strArray)
28.   strMsg = strMsg & i & ":" & vbTab & strArray(i) & vbCr
29.   Next i
30.   MsgBox strMsg, vbOKOnly + vbInformation, "Sortare matrice: 1"
31.    
32.   For X = LBound(strArray) To (UBound(strArray) - 1)
33.   For Y = (X + 1) To UBound(strArray)
34.   If strArray(X) > strArray(Y) Then
35.   strTemp = strArray(X)
36.   strArray(X) = strArray(Y)
37.   strArray(Y) = strTemp
38.   strTemp = ""
39.   End If
40.   Next Y
41.   Next X
42.    
43.   strMsg = "Elemente în matricea sortata:" & vbCr & vbCr
44.   For i = 1 To UBound(strArray)
45.   strMsg = strMsg & i & ":" & vbTab & strArray(i) & vbCr
46.   Next i
47.   MsgBox strMsg, vbOKOnly + vbInformation, "Sortare matrice: 2"
48.    
49.   End Sub

Se recomandă citirea codului și a explicațiilor pentru a-l înțelege. În acest moment, este posibil să pară de neînțeles. Totuși, lucrurile vor deveni mai clare pe măsură ce se parcurge această carte. În plus, sortarea de tip bubble nu trebuie scrisă de la zero – se copie de mai sus și se poate modifica pentru a sorta orice altă matrice. Codul poate fi copiat de pe pagina: www.sybex.com/go/masteringvba2016.

Cum se pot localiza numerele liniilor în Editor

Exemplele cu coduri lungi, care se întind pe câteva rânduri sunt numerotate, astfel încât liniile pot fi ușor menționate în textul explicativ.

În Editor, linia curentă pe care se află cursorul este afișată în câmpul din extrema dreaptă a barei de instrumente Standard a Editorului, chiar lângă marcajul albastru Help.

Acest câmp afișează întotdeauna numărul curent al liniei (după Ln) și numărul de caractere (după Col), ca în această captură de ecran.

Iată descrierea comenzilor:

  • Linia 1 conține declarația Option Explicit pentru a forța declararea explicită a variabillelor, iar linia 2 conține declarația Option Base 1 pentru a face ca numerotarea să înceapă de la 1 în loc de 0. Aceste două instrucțiuni apar în zona General Declarations din cod, înaintea oricărei alte proceduri din fereastra Code. Linia 3 este un spațiu (spacer) - o linie goală inserată pentru a face codul mai ușor de citit. Acesta poate fi ștearsă sau pot fi adăugate mai multe linii, după dorință. VBA ignoră liniile goale.
  • Linia 4 începe procedura Sortare_Matrice. Linia 5 este goală - spacer.
  • Linia 6 este o linie de comentariu care descrie declararea matricii și a variabilelor. Linia 7 declară matricea strArray de tip string cu 12 elemente. Linia 8 declară variabila strTemp de tip String. Linia 9 declară variabila strMsg de tip String. Linia 10 declară variabilele X, Y și I, de tip Integer. Linia 11 este goală.
  • Linia 12 este o linie cu comentariu care explică următoarele 12 comenzi (liniile de la 13 până la 24) de atribuire valori – șiruri de caractere (string) la matrice. Linia 25 este goală.
  • Liniile de la 26 până la 30 construiesc o înșiruire a elementelor matricii și apoi le afișează într-o casetă de mesaje. Această secțiune de cod este inclusă pentru a ajuta utilizatorii să vadă cu ușurință ce se întâmplă dacă execută procedura de sortare. Linia 26 atribuie text introductiv și două caractere vbCr la variabila String strMsg. Linia 27 pornește o buclă For... Next care rulează de la i = 1 la i = UBound (strArray) - cu alte cuvinte, o dată pentru fiecare element din matrice. (Buclele ar putea fi, de asemenea, rulate de la i = 12, deoarece limita superioară a matricei este deja setată, dar folosirea limitei superioare UBound este mai flexibilă decât valorile hard-coding.) Linia 28 adaugă la strMsg valoarea variabilei contor i, două puncte, un spațiu de tip tab (vbTab), conținutul elementului din matrice la care se face referire în prezent (strArray (i)) și un caracter special pentru a trece pe rândul următor (vbCr). Linia 28 încheie bucla, iar linia 30 afișează o casetă de mesaj care conține textul construit în variabila strMsg. Linia 31 este goală.

Procedura Sortare_Matrice afișează utilizatorului un mesaj cu elementele nesortate.

Partea de sortare a procedurii se află între liniile de la 32 până la 41. Iată detalii:

  • Linia 32 începe un set de bucle imbricate: una în cealaltă. Este o buclă externă și una internă. Bucla externă For... Next loop se termină la linia 41 cu instrucțiunea Next X. Această buclă este executată de la X = LBound(strArray) (adică de la X = 1) până la X = (UBound(strArray) - 1) (adică X = 11, limita superioară a matricii minus 1).
  • Pe linia 33 începe bucla internă For … Next (imbricată), care rulează de la Y = (X + 1) to Y = UBound(strArray). Bucla se încheie pe linia 40.
  • Linia 34 compară strArray(X) cu strArray(Y). Dacă strArray(X) este mai mare decât strArray(Y)—adică, dacă strArray(X) ar trebui să fie aranjat după strArray(Y) în ordine alfabetică—linia 35 atribuie valoarea strArray(X) la strTemp, linia 36 atribuie valoarea strArray(Y) la strArray(X), iar linia 37 atribuie valoarea strTemp la strArray(Y), adică inversează valorile. Linia 38 golește variabila strTemp. Linia 39 încheie instrucțiunea If. Linia 40 încheie bucla internă, linia 41 încheie bucla externă, iar linia 42 este goală.
  • Liniile de la 43 până la 47 repetă liniile de la 26 până la 30, pentru a afișa o casetă mesaj a matricii sortate, pentru ca utilizatorul să poată vedea rezultatul sortării.
  • Linia 48 este goală, iar linia 49 încheie procedura.

După terminarea procedurii Sortare_Matrice, este afișat un mesaj cu elementele sortate alfabetic.