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ă:

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
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:

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

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

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:

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