TOP

VBA-Lecția 7.1. Condiții (Condiții)

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.


Dacă... Atunci... Altfel

Deci, cea mai importantă funcție care stabilește condiția este IF și acum vom vedea cum funcționează:

  1. If [TERMENUL AICI] Then '=> DACĂ condiția este adevărată atunci  
  2.    'Instrucțiuni dacă „adevărat”  
  3. Else '=> ALTELOR  
  4.    'Instrucțiuni dacă „mint”  
  5. 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.

  1. Sub variables()  
  2.    'Declararea variabilelor  
  3.    Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  4.          
  5.    'Atribuirea de valori variabilelor  
  6.    row_number = Range("F5") + 1  
  7.      
  8.    last_name  = Cells(row_number, 1)  
  9.    first_name = Cells(row_number, 2)  
  10.    age        = Cells(row_number, 3)  
  11.      
  12.    'Căsuță de dialog  
  13.    MsgBox last_name & " " & first_name & ", " & age & "ani"  
  14. 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:

  1. Sub variables()  
  2.   'Dacă valoarea din paranteze (celula F5) este numerică (Deci CONDIȚIA IF ESTE ADEVĂRATĂ), atunci  
  3.   'executați instrucțiunile care urmează ATUNCI  
  4.    If IsNumeric(Range("F5")) Then  
  5.      
  6.        'Declararea variabilelor  
  7.        Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  8.          
  9.        'Atribuirea de valori variabilelor  
  10.        row_number = Range("F5") + 1  
  11.          
  12.        last_name  = Cells(row_number, 1)  
  13.        first_name = Cells(row_number, 2)  
  14.        age        = Cells(row_number, 3)  
  15.          
  16.        'Căsuță de dialog  
  17.        MsgBox last_name & " " & first_name & ", " & age & "ani"  
  18.     End If  
  19. End Sub  

De asemenea, trebuie să scriem instrucțiuni dacă condiția pe care am stabilit-o nu este îndeplinită:

  1. Sub variables()  
  2.     If IsNumeric(Range("F5")) Then 'Dacă condiția este îndeplinită  
  3.      
  4.        'Declararea variabilelor  
  5.        Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  6.          
  7.        'Atribuirea de valori variabilelor  
  8.        row_number = Range("F5") + 1  
  9.          
  10.        last_name  = Cells(row_number, 1)  
  11.        first_name = Cells(row_number, 2)  
  12.        age        = Cells(row_number, 3)  
  13.          
  14.        'Căsuță de dialog  
  15.        MsgBox last_name & " " & first_name & ", " & age & "ani"  
  16.          
  17.     Else 'Dacă condiția nu este îndeplinită  
  18.      
  19.        'Caseta de dialog: avertisment  
  20.        MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!"  
  21.          
  22.        'Ștergeți conținutul celulei F5  
  23.        Range("F5").ClearContents  
  24.     End If  
  25. 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
NOTNOT [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:

  1. Sub variables()  
  2.     If IsNumeric(Range("F5")) Then 'Dacă o valoare numerică  
  3.       
  4.         Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  5.           
  6.         row_number = Range("F5") + 1  
  7.   
  8.         If row_number >= 2 And row_number <= 17 Then 'Dacă numărul corect  
  9.           
  10.             last_name  = Cells(row_number, 1)  
  11.             first_name = Cells(row_number, 2)  
  12.             age        = Cells(row_number, 3)  
  13.               
  14.             MsgBox last_name & " " & first_name & ", " & age & "ani"  
  15.               
  16.         Else 'Dacă numărul nu este corect  
  17.             MsgBox "Număr introdus" & Range("F5") & "nu este corect!"  
  18.             Range("F5").ClearContents  
  19.         End If  
  20.          
  21.     Else 'Dacă nu este o valoare numerică  
  22.         MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!"  
  23.         Range("F5").ClearContents  
  24.     End If  
  25. 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:

  1. Sub variables()  
  2.     If IsNumeric(Range("F5")) Then 'DACĂ NUMĂR  
  3.       
  4.         Dim last_name As String, first_name As String, age As Integer, row_number As Integer  
  5.         Dim nb_rows As Integer  
  6.          
  7.         row_number = Range("F5") + 1  
  8.         nb_rows    = WorksheetFunction.CountA(Range("A:A")) 'Funcția de numărare a numărului de linii  
  9.          
  10.         If row_number >= 2 And row_number <= nb_rows Then 'DACĂ NUMĂR VALABLE  
  11.           
  12.             last_name  = Cells(row_number, 1)  
  13.             first_name = Cells(row_number, 2)  
  14.             age        = Cells(row_number, 3)  
  15.               
  16.             MsgBox last_name & " " & first_name & ", " & age & "ani"  
  17.               
  18.         Else 'DACĂ NUMĂRUL ESTE INCORECT  
  19.             MsgBox "Număr introdus" & Range("F5") & "nu este corect!"  
  20.             Range("F5").ClearContents  
  21.         End If  
  22.   
  23.     Else 'DACĂ NU NUMĂR  
  24.         MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!"  
  25.         Range("F5").ClearContents  
  26.     End If  
  27. End Sub  

ElseIf

ElseIf face posibilă adăugarea unor condiții suplimentare după comanda IF:

  1. If [CONDIȚIA 1] Then '=> DACĂ condiția 1 este adevărată atunci  
  2.    'Instructiuni 1  
  3. ElseIf [CONDIȚIA 2] Then '=> DACĂ condiția 1 este falsă, dar condiția 2 este adevărată, atunci  
  4.    'Instructiuni 2  
  5. Else '=> ALTELOR  
  6.    'Instructiuni 3  
  7. 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:

  1. Sub scores_comment()  
  2.     'Variabile  
  3.     Dim note As Integer, score_comment As String  
  4.       
  5.     note = Range("A1")  
  6.      
  7.     'Comentarii pe baza punctajului primit  
  8.     If note = 6 Then  
  9.         score_comment = "Scor grozav!"  
  10.     ElseIf note = 5 Then  
  11.         score_comment = "Buna observatie"  
  12.     ElseIf note = 4 Then  
  13.         score_comment = "Scor satisfăcător"  
  14.     ElseIf note = 3 Then  
  15.         score_comment = "Scor nesatisfăcător"  
  16.     ElseIf note = 2 Then  
  17.         score_comment = "Scor prost"  
  18.     ElseIf note = 1 Then  
  19.         score_comment = "Scor teribil"  
  20.     Else  
  21.         score_comment = "Scor zero"  
  22.     End If  
  23.      
  24.     'Comentariu în celula B1  
  25.     Range("B1") = score_comment  
  26. End Sub  

Select Caz

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:

  1. Sub scores_comment()  
  2.     'Variabile  
  3.     Dim note As Integer, score_comment As String  
  4.       
  5.     note = Range("A1")  
  6.      
  7.     'Comentarii pe baza punctajului primit  
  8.     Select Case note    '=> scorul testului (puncte)  
  9.         Case Is = 6         '=> dacă valoarea = 6  
  10.            score_comment = "Scor grozav!"  
  11.         Case Is = 5         '=> dacă valoarea = 5  
  12.            score_comment = "Buna observatie"  
  13.         Case Is = 4         '=> dacă valoarea = 4  
  14.            score_comment = "Scor satisfăcător"  
  15.         Case Is = 3         '=> dacă valoarea = 3  
  16.            score_comment = "Scor nesatisfăcător"  
  17.         Case Is = 2         '=> dacă valoarea = 2  
  18.            score_comment = "Scor prost"  
  19.         Case Is = 1         '=> dacă valoarea = 1  
  20.            score_comment = "Scor teribil"  
  21.         Case Else           '=> dacă valoarea nu este egală cu oricare dintre cele de mai sus  
  22.            score_comment = "Scor zero"  
  23.     End Select  
  24.      
  25.     'Comentariu în celula B1  
  26.     Range("B1") = score_comment  
  27. End Sub  

Este de remarcat faptul că am putea folosi și alți operatori de comparație:

  1. Case Is >= 6         'dacă valoarea >= 6  

Exemple cu semnificații diferite:

  1. Case Is = 6, 7       'dacă valoarea = 6 sau 7  
  2. Case Is <> 6, 7      'dacă valoarea nu este egală cu 6 sau 7  
  1. Case 6 To 10         'dacă valoarea = orice număr de la 6 la 10