Meniu
Automatizare Excel: VBA Macro Recorder, bucle FOR, evenimente Worksheet, LAMBDA Name Manager, OnTime

Automatizarea în Excel: VBA macro-uri, LAMBDA și Power Automate pas cu pas

Automatizarea în Excel elimină sarcinile repetitive și reduce erorile umane. Există trei niveluri de automatizare, fiecare potrivit pentru scenarii diferite: macro-urile înregistrate (fără cod), VBA personalizat (cu cod) și Power Automate (fără Excel deschis). Iată cum funcționează fiecare.

1. Înregistrarea macro-urilor — automatizare fără cod

Macro Recorder înregistrează exact acțiunile tale ca instrucțiuni VBA. Oricând rulezi macro-ul, execută aceleași acțiuni instantaneu.

// Activare Developer Tab (dacă nu e vizibil):
// File → Options → Customize Ribbon → Developer ✓

// Pași înregistrare macro:
// 1. Developer → Record Macro → dai un nume (fără spații): FormatareTabel
// 2. Shortcut Key: Ctrl+Shift+F (opțional)
// 3. Store macro in: This Workbook
// 4. Execuți acțiunile dorite (formatare, sortare, filtrare etc.)
// 5. Developer → Stop Recording

// Exemplu cod generat automat pentru Bold + Culoare antet:
Sub FormatareTabel()
    Range("A1:F1").Select
    With Selection
        .Font.Bold = True
        .Interior.Color = RGB(46, 106, 79)  ' verde #2D6A4F
        .Font.Color = RGB(255, 255, 255)
    End With
    Range("A1").Select
End Sub

Îmbunătățiri esențiale ale codului înregistrat

' CODUL ÎNREGISTRAT (cu Select — lent și fragil):
Range("A1:F1").Select
Selection.Font.Bold = True

' CODUL OPTIMIZAT (fără Select — de 3-5x mai rapid):
Range("A1:F1").Font.Bold = True

' REFERINȚĂ DINAMICĂ în loc de A1:F1 hardcodat:
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Range(ws.Cells(1,1), ws.Cells(1, ws.UsedRange.Columns.Count)).Font.Bold = True

' VARIABILA pentru ultimul rând (nu hardcoda numărul):
Dim UltimulRand As Long
UltimulRand = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

2. VBA — structuri de control esențiale

' Buclă FOR — procesare rânduri:
Sub ProceseazaRanduri()
    Dim i As Long
    Dim UltimulRand As Long
    UltimulRand = Cells(Rows.Count, "A").End(xlUp).Row

    For i = 2 To UltimulRand  ' Începe de la 2 (skip header)
        If Cells(i, "C").Value > 10000 Then
            Cells(i, "D").Value = "VIP"
            Cells(i, "D").Interior.Color = RGB(255, 215, 0)
        ElseIf Cells(i, "C").Value > 5000 Then
            Cells(i, "D").Value = "Standard"
        Else
            Cells(i, "D").Value = "Basic"
        End If
    Next i
End Sub

' Buclă FOR EACH — procesare foi de calcul:
Sub RedenumesteFoile()
    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        If Left(ws.Name, 4) = "Luna" Then
            ws.Tab.Color = RGB(0, 112, 192)
        End If
    Next ws
End Sub

' DO WHILE — procesare până la condiție:
Sub GasesteUltimulRandNecomplet()
    Dim i As Long
    i = 2
    Do While Cells(i, "A").Value <> ""
        i = i + 1
    Loop
    MsgBox "Primul rând gol: " & i
End Sub

3. Evenimente Worksheet — automatizare la acțiuni utilizator

' Codul se plasează în modulul foii (clic dreapta pe tab foaie → View Code)

' Eveniment la modificare celulă:
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Dacă se modifică coloana C (Status):
    If Target.Column = 3 And Target.Row > 1 Then
        If Target.Value = "Finalizat" Then
            Target.Offset(0, 1).Value = Now()  ' Timestamp finalizare
            Target.EntireRow.Interior.Color = RGB(198, 239, 206)  ' Verde deschis
        End If
    End If
End Sub

' Eveniment la selectare celulă (validare interactivă):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 5 Then
        Application.StatusBar = "Introduceți suma în RON, format: 1234.56"
    Else
        Application.StatusBar = False
    End If
End Sub

' Eveniment la deschidere workbook (în modul ThisWorkbook):
Private Sub Workbook_Open()
    ' Refresh automat date
    ActiveWorkbook.RefreshAll
    ' Navigare la foaia principală
    Sheets("Dashboard").Activate
    ' Actualizare data raport
    Sheets("Config").Range("B1").Value = Now()
End Sub

4. Funcții LAMBDA — automatizare calcule reutilizabile

LAMBDA (Excel 365) permite crearea funcțiilor personalizate direct în formule, fără VBA. Odată definite în Name Manager, se pot folosi în orice celulă.

// Definire funcție LAMBDA în Name Manager (Formulas → Name Manager → New):
// Name: CalcTVA
// Refers to:
=LAMBDA(valoare, cota_tva, valoare * (1 + cota_tva / 100))

// Utilizare:
=CalcTVA(B2, 19)     // Preț cu TVA 19%
=CalcTVA(B2, 9)      // Preț cu TVA 9% (alimente)

// Funcție recursivă LAMBDA — factorial:
// Name: Factorial
=LAMBDA(n, IF(n<=1, 1, n * Factorial(n-1)))
=Factorial(5)  // Returnează 120

// LAMBDA cu LET pentru calcule intermediare:
=LET(
    venit_brut,   B2,
    cas,          venit_brut * 0.25,
    cass,         venit_brut * 0.10,
    baza_impozit, venit_brut - cas - cass - 300,
    impozit,      baza_impozit * 0.10,
    venit_brut - cas - cass - impozit
)

// Funcție personalizată pentru formatare cod fiscal:
// Name: FormatCIF
=LAMBDA(cif,
    LET(
        cifStr, TEXT(cif, "0"),
        IF(LEN(cifStr) < 10,
           REPT("0", 10-LEN(cifStr)) & cifStr,
           cifStr)
    )
)

5. Programarea macro-urilor cu Application.OnTime

' Rulare automată la o oră fixă (fișierul trebuie deschis):
Sub ProgrameazaRefresh()
    ' Rulează ActualizeazaDate zilnic la 08:00
    Application.OnTime TimeValue("08:00:00"), "ActualizeazaDate"
End Sub

' Rulare la fiecare 30 de minute:
Dim TimpUrmatoareRulare As Date

Sub RefreshPeriodic()
    Call ActualizeazaDate
    TimpUrmatoareRulare = Now + TimeValue("00:30:00")
    Application.OnTime TimpUrmatoareRulare, "RefreshPeriodic"
End Sub

Sub OpresteProgramarea()
    On Error Resume Next
    Application.OnTime TimpUrmatoareRulare, "RefreshPeriodic", , False
End Sub

' Activare la deschidere workbook:
Private Sub Workbook_Open()
    Call ProgrameazaRefresh
End Sub

6. Debugging și gestionarea erorilor VBA

' Gestionare erori cu On Error:
Sub ImportDateCuErori()
    On Error GoTo GestionareEroare

    Dim ws As Worksheet
    Set ws = Sheets("Date_Import")

    ' Cod care poate genera erori:
    ws.QueryTables(1).Refresh BackgroundQuery:=False

    MsgBox "Import finalizat cu succes!", vbInformation
    Exit Sub

GestionareEroare:
    MsgBox "Eroare " & Err.Number & ": " & Err.Description & _
           vbNewLine & "Verifică sursa de date și reconectează.", vbCritical
    Resume Next
End Sub

' Debug.Print — înregistrare în Immediate Window (Ctrl+G):
Debug.Print "Rând " & i & " | Valoare: " & Cells(i,"C").Value

' Breakpoint temporar pentru investigare:
' Clic în marginea stângă a codului → punct roșu → F5 pentru rulare pas cu pas

Cursuri practice de automatizare Excel (VBA, Power Query, LAMBDA) sunt disponibile la Excel Group MD, cu exerciții pe cazuri reale din business-ul tău.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *