Condițiile sunt foarte utile în programare deoarece ne permit să realizăm acțiuni în funcție de criterii stabilite (se folosește același principiu ca și în funcția IF Excel).
Instrucțiunea VBA If...Then...Else execută un set de instrucțiuni în funcție de dacă condiția specificată este adevărată sau nu. Dacă condiția (testul logic) este îndeplinită, se execută un set de acțiuni. Cu toate acestea, dacă condiția este falsă, se efectuează un set alternativ de acțiuni.
Cu toate acestea, pentru lizibilitate, puteți utiliza instrucțiunea Select Case în loc de mai multe niveluri de instrucțiuni imbricate If...Then...Else.
Deci, cea mai importantă funcție care stabilește condiția este IF și acum vom vedea cum funcționează:
If [TERMENUL AICI] Then '=> DACĂ condiția este adevărată atunci 'Instrucțiuni dacă „adevărat” Else '=> ALTELOR 'Instrucțiuni dacă „mint” End If
Să fim practici și să revenim la exemplul pe care l-am folosit în lecția variabilă. Scopul acestei proceduri a fost de a afișa o casetă de dialog care să afișeze valoarea din șirul specificat în celula F5:
Dacă tastați o literă în celula F5, aceasta va provoca o eroare. Vrem să prevenim acest lucru.
Sub variables() 'Declararea variabilelor Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Atribuirea de valori variabilelor row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Căsuță de dialog MsgBox last_name & " " & first_name & ", " & age & "ani" End Sub
Să adăugăm o condiție care va verifica dacă valoarea introdusă în celula F5 este un număr înainte ca codul să fie executat.
Vom folosi funcția IsNumeric pentru a testa condiția:
Sub variables() 'Dacă valoarea din paranteze (celula F5) este numerică (Deci CONDIȚIA IF ESTE ADEVĂRATĂ), atunci 'executați instrucțiunile care urmează ATUNCI If IsNumeric(Range("F5")) Then 'Declararea variabilelor Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Atribuirea de valori variabilelor row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Căsuță de dialog MsgBox last_name & " " & first_name & ", " & age & "ani" End If End Sub
De asemenea, trebuie să scriem instrucțiuni dacă condiția pe care am stabilit-o nu este îndeplinită:
Sub variables() If IsNumeric(Range("F5")) Then 'Dacă condiția este îndeplinită 'Declararea variabilelor Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Atribuirea de valori variabilelor row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Căsuță de dialog MsgBox last_name & " " & first_name & ", " & age & "ani" Else 'Dacă condiția nu este îndeplinită 'Caseta de dialog: avertisment MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!" 'Ștergeți conținutul celulei F5 Range("F5").ClearContents End If End Sub
Acum o valoare non-numerică nu va cauza probleme.
Lucrând cu matricea noastră care conține 16 rânduri de date, următorul nostru pas va fi să verificăm dacă variabila row_number este: „mai mare sau egală cu 2” și „mai mică sau egală cu 17”.
Dar mai întâi, să ne uităm la operatorii de comparație:
= | exact |
<> | nu chiar |
< | mai puțin decât |
<= | mai mic sau egal cu |
> | mai mult decât |
>= | mai mare sau egal cu |
și acești operatori utili:
AND | [condiție1] AND [condiție2] Trebuie îndeplinite două condiții |
OR | [condiție1] OR [condiție2] Că trebuie îndeplinită cel puțin una din cele 2 condiții |
NOT | NOT [condiție1] Condiția nu trebuie îndeplinită |
Acum să adăugăm una dintre condițiile AND de mai sus între operatorii de comparație:
Sub variables() If IsNumeric(Range("F5")) Then 'Dacă o valoare numerică Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range("F5") + 1 If row_number >= 2 And row_number <= 17 Then 'Dacă numărul corect last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "ani" Else 'Dacă numărul nu este corect MsgBox "Număr introdus" & Range("F5") & "nu este corect!" Range("F5").ClearContents End If Else 'Dacă nu este o valoare numerică MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!" Range("F5").ClearContents End If End Sub
Dacă vrem să facem macro-ul mai practic, putem înlocui 17 cu o variabilă care să dețină numărul de linii. Acest lucru ne-ar permite să adăugăm și să eliminăm rânduri din matrice fără a fi nevoie să modificăm această limită de fiecare dată.
Pentru a face acest lucru, trebuie să creăm o variabilă nb_rows și să adăugăm această funcție.
În acest caz, vom folosi funcția WorksheetFunction.CountA, care este analogă cu funcția COUNTA din Excel în sine.
Dorim ca această funcție să numere numărul de celule negoale din prima coloană și să scrie valoarea rezultată în variabila nb_rows:
Sub variables() If IsNumeric(Range("F5")) Then 'DACĂ NUMĂR Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range("F5") + 1 nb_rows = WorksheetFunction.CountA(Range("A:A")) 'Funcția de numărare a numărului de linii If row_number >= 2 And row_number <= nb_rows Then 'DACĂ NUMĂR VALABLE last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "ani" Else 'DACĂ NUMĂRUL ESTE INCORECT MsgBox "Număr introdus" & Range("F5") & "nu este corect!" Range("F5").ClearContents End If Else 'DACĂ NU NUMĂR MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!" Range("F5").ClearContents End If End Sub
ElseIf face posibilă adăugarea unor condiții suplimentare după comanda IF:
If [CONDIȚIA 1] Then '=> DACĂ condiția 1 este adevărată atunci 'Instructiuni 1 ElseIf [CONDIȚIA 2] Then '=> DACĂ condiția 1 este falsă, dar condiția 2 este adevărată, atunci 'Instructiuni 2 Else '=> ALTELOR 'Instructiuni 3 End If
Dacă CONDIȚIA 1 este adevărată, instrucțiunea 1 se va executa și va ieși din instrucțiunea IF (care începe cu IF și se termină cu IF If). Dacă CONDIȚIA 2 returnează false, atunci instrucțiunea 2 va fi executată, iar dacă returnează false, atunci instrucțiunea 3 (sub Else) va fi executată.
Iată un exemplu cu clasele de la 1 la 6 în celula A1 și un comentariu la acele note în celula B1:
Sub scores_comment() 'Variabile Dim note As Integer, score_comment As String note = Range("A1") 'Comentarii pe baza punctajului primit If note = 6 Then score_comment = "Scor grozav!" ElseIf note = 5 Then score_comment = "Buna observatie" ElseIf note = 4 Then score_comment = "Scor satisfăcător" ElseIf note = 3 Then score_comment = "Scor nesatisfăcător" ElseIf note = 2 Then score_comment = "Scor prost" ElseIf note = 1 Then score_comment = "Scor teribil" Else score_comment = "Scor zero" End If 'Comentariu în celula B1 Range("B1") = score_comment End Sub
Există o alternativă la utilizarea If cu multe instrucțiuni ElseIf, și anume comanda Select Case, care este mai potrivită pentru acest tip de situație.
Luați în considerare un exemplu de macrocomandă cu operatorul Select Case:
Sub scores_comment() 'Variabile Dim note As Integer, score_comment As String note = Range("A1") 'Comentarii pe baza punctajului primit Select Case note '=> scorul testului (puncte) Case Is = 6 '=> dacă valoarea = 6 score_comment = "Scor grozav!" Case Is = 5 '=> dacă valoarea = 5 score_comment = "Buna observatie" Case Is = 4 '=> dacă valoarea = 4 score_comment = "Scor satisfăcător" Case Is = 3 '=> dacă valoarea = 3 score_comment = "Scor nesatisfăcător" Case Is = 2 '=> dacă valoarea = 2 score_comment = "Scor prost" Case Is = 1 '=> dacă valoarea = 1 score_comment = "Scor teribil" Case Else '=> dacă valoarea nu este egală cu oricare dintre cele de mai sus score_comment = "Scor zero" End Select 'Comentariu în celula B1 Range("B1") = score_comment End Sub
Este de remarcat faptul că am putea folosi și alți operatori de comparație:
Case Is >= 6 'dacă valoarea >= 6
Exemple cu semnificații diferite:
Case Is = 6, 7 'dacă valoarea = 6 sau 7 Case Is <> 6, 7 'dacă valoarea nu este egală cu 6 sau 7
Case 6 To 10 'dacă valoarea = orice număr de la 6 la 10