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
-
- Else
-
- End If
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()
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "ani"
- End Sub
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()
-
-
- If IsNumeric(Range("F5")) Then
-
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- last_name = Cells(row_number, 1)
- first_name = Cells(row_number, 2)
- age = Cells(row_number, 3)
-
-
- MsgBox last_name & " " & first_name & ", " & age & "ani"
- End If
- End Sub
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
-
-
- Dim last_name As String, first_name As String, age As Integer, row_number As Integer
-
-
- row_number = Range("F5") + 1
-
- 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
-
-
- MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!"
-
-
- Range("F5").ClearContents
- End If
- End Sub
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
-
- 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
-
- 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
- MsgBox "Număr introdus" & Range("F5") & "nu este corect!"
- Range("F5").ClearContents
- End If
-
- Else
- MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!"
- Range("F5").ClearContents
- End If
- End Sub
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
-
- 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"))
-
- If row_number >= 2 And row_number <= nb_rows Then
-
- 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
- MsgBox "Număr introdus" & Range("F5") & "nu este corect!"
- Range("F5").ClearContents
- End If
-
- Else
- MsgBox "Valoare introdusă" & Range("F5") & "nu este adevărat!"
- Range("F5").ClearContents
- End If
- End Sub
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
-
- ElseIf [CONDIȚIA 2] Then
-
- Else
-
- End 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()
-
- Dim note As Integer, score_comment As String
-
- note = Range("A1")
-
-
- 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
-
-
- Range("B1") = score_comment
- End Sub
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()
-
- Dim note As Integer, score_comment As String
-
- note = Range("A1")
-
-
- Select Case note
- Case Is = 6
- score_comment = "Scor grozav!"
- Case Is = 5
- score_comment = "Buna observatie"
- Case Is = 4
- score_comment = "Scor satisfăcător"
- Case Is = 3
- score_comment = "Scor nesatisfăcător"
- Case Is = 2
- score_comment = "Scor prost"
- Case Is = 1
- score_comment = "Scor teribil"
- Case Else
- score_comment = "Scor zero"
- End Select
-
-
- Range("B1") = score_comment
- End Sub
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
- Case Is <> 6, 7
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