Automatyzacja z VBA w Excelu – od zera do bohatera

Czy Excel może sam myśleć? Może.
Czy może klasyfikować dane bez klikania? O tak.
A czy da się go nauczyć, by reagował na to, co wpisujemy? Da się!
I właśnie dziś – pokażę Ci, jak to osiągnąłem w kilka kroków.

Co chciałem osiągnąć?

Mam prostą tabelę:

Chciałem, żeby Excel sam wypełniał kolumnę „Wartość” na podstawie:

  • ceny produktu,
  • typu produktu,
  • oraz braków danych.

I żeby to wszystko działo się automatycznie (jak poniżej)

Krok 1: Makro klasyfikujące dane

Sub KlasyfikujProdukty()Dim ws As Worksheet
Dim i As Long
Dim ostatniWiersz As Long
Dim cena As Variant
Dim typ As String

Set ws = ThisWorkbook.Sheets("Arkusz1") ' Zmień nazwę jeśli inna

ostatniWiersz = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

For i = 2 To ostatniWiersz
    cena = ws.Cells(i, 2).Value
    typ = ws.Cells(i, 3).Value

    If IsEmpty(cena) Or cena = "" Then
        ws.Cells(i, 4).Value = "brak danych"
    ElseIf LCase(typ) = "zakazany" Then
        ws.Cells(i, 4).Value = "nie wprowadzać"
    ElseIf IsNumeric(cena) Then
        If cena > 5000 Then
            ws.Cells(i, 4).Value = "premium"
        ElseIf cena < 1000 Then
            ws.Cells(i, 4).Value = "budżet"
        Else
            ws.Cells(i, 4).Value = "standard"
        End If
    Else
        ws.Cells(i, 4).Value = "błąd danych"
    End If
Next i

MsgBox "Klasyfikacja zakończona", vbInformation
End Sub

Wyjaśnienie:

  • ws.Cells(i, 2).Value = cena (kolumna B),
  • ws.Cells(i, 3).Value = typ (kolumna C),
  • Excel przechodzi przez każdy wiersz od góry i wpisuje klasyfikację w kolumnie D.

Krok 2: Automatyczne uruchamianie po wpisie

Nie chciałem klikać „uruchom makro” – więc dodałem prosty „wykrywacz zmian” w VBA w Arkusz1 gdzie znajdowały się dane (nie w module)

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("A2:A1000")) Is Nothing Then
Application.EnableEvents = False
Call KlasyfikujProdukty
Application.EnableEvents = True
End If
End Sub

Krok 3: Formularz użytkownika

Stworzyłem formularz, który pozwala dodawać dane jak w prawdziwej aplikacji.

1. Utwórz UserForm:

Wstaw UserForm
Dodaj:

  • 2 pola tekstowe (dla produktu i ceny),
  • 2 przyciski: Zapisz i Anuluj.

2. Kod przycisku „Zapisz”:

Private Sub btnZapisz_Click()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Arkusz1")

Dim ostatniWiersz As Long
ostatniWiersz = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1

ws.Cells(ostatniWiersz, 1).Value = txtProdukt.Value
ws.Cells(ostatniWiersz, 2).Value = txtCena.Value
ws.Cells(ostatniWiersz, 3).Value = "Komputer" ' lub inny typ domyślny

Unload Me
Call KlasyfikujProdukty
End Sub

Efekt końcowy?

  • Nie klikam makr,
  • nie martwię się o błędy,
  • wpisuję dane i gotowe,
  • mogę dać formularz komuś, kto nawet nie zna Excela.

To jest właśnie automatyzacja, która oszczędza czas i frustrację.