Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Ensimmäisen VBA-proseduurin kirjoittaminen | Introduction to VBA and the Excel Object Model
Excel VBA Liiketoiminnan Automaatioon

Ensimmäisen VBA-proseduurin kirjoittaminen

Pyyhkäise näyttääksesi valikon

Makrojen tallentaminen opettaa sanastoa; kun kirjoitat makron alusta asti itse, alat ajatella ohjelmoijan tavoin.

Sub-proseduurin rakenne

Jokainen uudelleenkäytettävä VBA-koodilohko, joka suorittaa toiminnon (eikä palauta arvoa, kuten Function), kirjoitetaan Sub-rakenteena:

Sub ProcedureName()
    ' instructions go here
End Sub

Kun kohdistin on missä tahansa Subin sisällä, paina F5 (tai napsauta vihreää Suorita-nuolta) suorittaaksesi sen. Kommentit — kaikki rivit, jotka alkavat heittomerkillä (') — VBA ohittaa kokonaan; käytä niitä runsaasti selittämään miksi koodi tekee jotakin, ei vain mitä se tekee, sillä mitä yleensä selviää koodista itsestään.

Muotoilutottumukset, jotka maksavat itsensä heti takaisin

  • Kirjoita Option Explicit jokaisen moduulin alkuun — se pakottaa sinut määrittelemään kaikki muuttujat, mikä auttaa havaitsemaan kirjoitusvirheet ennen kuin niistä tulee bugeja;
  • Sisennä koodi silmukoiden ja If-lohkojen sisällä yhdellä sarkaimella — VBE ei pakota tätä, mutta sisentämätön koodi muuttuu nopeasti vaikealukuiseksi;
  • Käytä kuvaavia nimiä (HighEarnerCount, ei x) — kiität itseäsi kolmen viikon päästä.

Esimerkkiharjoitus: Suurituloisten korostaminen

Kirjoitetaan käsin proseduuria, joka käy läpi jokaisen työntekijän taulukossa ja korostaa kaikki, joiden palkka ylittää $55,000 — tämä ei onnistuisi makron tallentimella, koska se vaatii päätöksen (If-lauseen) toistettuna jokaiselle riville (silmukka).

Option Explicit
 
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long
 
    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
 
    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i
 
    MsgBox "Done — high earners are highlighted."
End Sub
Rivikohtainen läpikäynti
expand arrow
  • Dim ws As Worksheet / Dim i As Long — nämä määrittelevät kaksi muuttujaa: ws viittaa Employees-taulukkoon ja i laskee rivejä;
  • Set ws = ThisWorkbook.Worksheets("Employees") — tämä on objektimallin tapa: nimeä taulukko suoraan sen sijaan, että luottaisit aktiiviseen taulukkoon;
  • ws.Cells(ws.Rows.Count, 1).End(xlUp).Row — vakiotapa löytää viimeinen käytetty rivi sarakkeesta A riippumatta siitä, kuinka monta työntekijää taulukossa on;
  • For i = 2 To lastRow ... Next i — silmukka, joka toistaa koodin jokaiselle tietoriville alkaen riviltä 2, jotta otsikkorivi ohitetaan;
  • If ws.Cells(i, 6).Value > 55000 Then — päätös: vain ne rivit, joissa palkkasarake (sarake 6) ylittää 55000, muotoillaan;
  • MsgBox — yksinkertainen ponnahdusikkuna, joka vahvistaa makron suorittamisen.

Kirjoita tämä proseduurin modIntro-moduuliin, aseta kohdistin sen sisälle ja paina F5. Tarkista luvut itse — Emma Davis ja Olivia Brown ovat kaksi työntekijää, jotka ansaitsevat yli $55,000 esimerkkitaulukossa.

Tehtävä

  1. Kirjoita HighlightTopEarners täsmälleen kuten esimerkissä modIntro-moduuliin ja suorita se. Varmista, että kaksi riviä muuttuu vihreäksi.
  2. Kopioi proseduurista toinen versio nimellä HighlightITDepartment ja muuta ehtoa niin, että se korostaa kaikki rivit, joissa Department (sarake 3) on "IT" sen sijaan, että tarkistetaan palkka.
  3. Lisää kommentti jokaisen proseduurin yläpuolelle, jossa yhdessä lauseessa kerrotaan, mitä se tekee — harjoittele kommenttien kirjoittamista lukijalle, ei itsellesi.
  4. Tallenna työkirja uudelleen (se on edelleen .xlsm, joten tavallinen Ctrl+S riittää).
Vihje
expand arrow
  1. Valitse koko HighlightTopEarners-proseduuri (alkaen Sub-rivistä End Sub-riviin), kopioi se ja liitä heti perään modIntro-moduuliin.
  2. Nimeä toisen kopion Sub-rivi muotoon Sub HighlightITDepartment() — jokaisella proseduurilla moduulissa täytyy olla yksilöllinen nimi, muuten VBA ei tiedä, mitä suorittaa.
  3. Muutettava ehto on If-rivi. Tällä hetkellä se tarkistaa luvun:
If ws.Cells(i, 6).Value > 55000 Then

Nyt sen tulee tarkistaa teksti — sarake 3 (Department) on "IT". Muista luvusta 2, että tekstivertailuissa arvo laitetaan lainausmerkkeihin ja käytetään =-operaattoria, ei >. 4. Kaikki muu silmukan sisällä (rivi Interior.Color, silmukan rakenne) voi pysyä ennallaan — vain testattava ehto muuttuu.

Kommenttien lisääminen

  1. Kommenttirivi alkaa heittomerkillä (') ja sijoitetaan omalle rivilleen suoraan Sub-rivin yläpuolelle — ei proseduurin sisälle.
  2. Kirjoita kommentti kuin selittäisit makron työkaverille, joka ei ole sitä ennen nähnyt, ei muistutuksena itsellesi. Vertaa:
    • Ei kovin hyödyllinen: ' loops through rows (kuvaa miten, mikä näkyy jo koodista)
    • Parempi: ' Highlights employees earning over $55,000 (kuvaa mitä saavutetaan, mikä ei ole heti ilmeistä)
  3. Tee sama toiselle proseduurille — yksi lause, joka kuvaa, mitä se korostaa ja miksi, liiketoiminnan näkökulmasta (IT-osaston henkilöstö), ei silmukan toimintaa.
Ratkaisu
expand arrow
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — high earners are highlighted."
End Sub

' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 3).Value = "IT" Then
            ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — IT department is highlighted."
End Sub

Kirjoita molemmat modIntro-moduuliin, suorita ensin HighlightTopEarners ja varmista, että täsmälleen kaksi riviä muuttuu vihreäksi (Emma Davis $62,000 ja Sophia Miller $59,000 — kolme muuta ovat $55,000 tai alle), sitten suorita HighlightITDepartment ja varmista, että Sophia Millerin rivi korostuu. Tallenna Ctrl+S, kun molemmat toimivat.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 6

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Ensimmäisen VBA-proseduurin kirjoittaminen

Makrojen tallentaminen opettaa sanastoa; kun kirjoitat makron alusta asti itse, alat ajatella ohjelmoijan tavoin.

Sub-proseduurin rakenne

Jokainen uudelleenkäytettävä VBA-koodilohko, joka suorittaa toiminnon (eikä palauta arvoa, kuten Function), kirjoitetaan Sub-rakenteena:

Sub ProcedureName()
    ' instructions go here
End Sub

Kun kohdistin on missä tahansa Subin sisällä, paina F5 (tai napsauta vihreää Suorita-nuolta) suorittaaksesi sen. Kommentit — kaikki rivit, jotka alkavat heittomerkillä (') — VBA ohittaa kokonaan; käytä niitä runsaasti selittämään miksi koodi tekee jotakin, ei vain mitä se tekee, sillä mitä yleensä selviää koodista itsestään.

Muotoilutottumukset, jotka maksavat itsensä heti takaisin

  • Kirjoita Option Explicit jokaisen moduulin alkuun — se pakottaa sinut määrittelemään kaikki muuttujat, mikä auttaa havaitsemaan kirjoitusvirheet ennen kuin niistä tulee bugeja;
  • Sisennä koodi silmukoiden ja If-lohkojen sisällä yhdellä sarkaimella — VBE ei pakota tätä, mutta sisentämätön koodi muuttuu nopeasti vaikealukuiseksi;
  • Käytä kuvaavia nimiä (HighEarnerCount, ei x) — kiität itseäsi kolmen viikon päästä.

Esimerkkiharjoitus: Suurituloisten korostaminen

Kirjoitetaan käsin proseduuria, joka käy läpi jokaisen työntekijän taulukossa ja korostaa kaikki, joiden palkka ylittää $55,000 — tämä ei onnistuisi makron tallentimella, koska se vaatii päätöksen (If-lauseen) toistettuna jokaiselle riville (silmukka).

Option Explicit
 
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long
 
    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
 
    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i
 
    MsgBox "Done — high earners are highlighted."
End Sub
Rivikohtainen läpikäynti
expand arrow
  • Dim ws As Worksheet / Dim i As Long — nämä määrittelevät kaksi muuttujaa: ws viittaa Employees-taulukkoon ja i laskee rivejä;
  • Set ws = ThisWorkbook.Worksheets("Employees") — tämä on objektimallin tapa: nimeä taulukko suoraan sen sijaan, että luottaisit aktiiviseen taulukkoon;
  • ws.Cells(ws.Rows.Count, 1).End(xlUp).Row — vakiotapa löytää viimeinen käytetty rivi sarakkeesta A riippumatta siitä, kuinka monta työntekijää taulukossa on;
  • For i = 2 To lastRow ... Next i — silmukka, joka toistaa koodin jokaiselle tietoriville alkaen riviltä 2, jotta otsikkorivi ohitetaan;
  • If ws.Cells(i, 6).Value > 55000 Then — päätös: vain ne rivit, joissa palkkasarake (sarake 6) ylittää 55000, muotoillaan;
  • MsgBox — yksinkertainen ponnahdusikkuna, joka vahvistaa makron suorittamisen.

Kirjoita tämä proseduurin modIntro-moduuliin, aseta kohdistin sen sisälle ja paina F5. Tarkista luvut itse — Emma Davis ja Olivia Brown ovat kaksi työntekijää, jotka ansaitsevat yli $55,000 esimerkkitaulukossa.

Tehtävä

  1. Kirjoita HighlightTopEarners täsmälleen kuten esimerkissä modIntro-moduuliin ja suorita se. Varmista, että kaksi riviä muuttuu vihreäksi.
  2. Kopioi proseduurista toinen versio nimellä HighlightITDepartment ja muuta ehtoa niin, että se korostaa kaikki rivit, joissa Department (sarake 3) on "IT" sen sijaan, että tarkistetaan palkka.
  3. Lisää kommentti jokaisen proseduurin yläpuolelle, jossa yhdessä lauseessa kerrotaan, mitä se tekee — harjoittele kommenttien kirjoittamista lukijalle, ei itsellesi.
  4. Tallenna työkirja uudelleen (se on edelleen .xlsm, joten tavallinen Ctrl+S riittää).
Vihje
expand arrow
  1. Valitse koko HighlightTopEarners-proseduuri (alkaen Sub-rivistä End Sub-riviin), kopioi se ja liitä heti perään modIntro-moduuliin.
  2. Nimeä toisen kopion Sub-rivi muotoon Sub HighlightITDepartment() — jokaisella proseduurilla moduulissa täytyy olla yksilöllinen nimi, muuten VBA ei tiedä, mitä suorittaa.
  3. Muutettava ehto on If-rivi. Tällä hetkellä se tarkistaa luvun:
If ws.Cells(i, 6).Value > 55000 Then

Nyt sen tulee tarkistaa teksti — sarake 3 (Department) on "IT". Muista luvusta 2, että tekstivertailuissa arvo laitetaan lainausmerkkeihin ja käytetään =-operaattoria, ei >. 4. Kaikki muu silmukan sisällä (rivi Interior.Color, silmukan rakenne) voi pysyä ennallaan — vain testattava ehto muuttuu.

Kommenttien lisääminen

  1. Kommenttirivi alkaa heittomerkillä (') ja sijoitetaan omalle rivilleen suoraan Sub-rivin yläpuolelle — ei proseduurin sisälle.
  2. Kirjoita kommentti kuin selittäisit makron työkaverille, joka ei ole sitä ennen nähnyt, ei muistutuksena itsellesi. Vertaa:
    • Ei kovin hyödyllinen: ' loops through rows (kuvaa miten, mikä näkyy jo koodista)
    • Parempi: ' Highlights employees earning over $55,000 (kuvaa mitä saavutetaan, mikä ei ole heti ilmeistä)
  3. Tee sama toiselle proseduurille — yksi lause, joka kuvaa, mitä se korostaa ja miksi, liiketoiminnan näkökulmasta (IT-osaston henkilöstö), ei silmukan toimintaa.
Ratkaisu
expand arrow
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — high earners are highlighted."
End Sub

' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 3).Value = "IT" Then
            ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — IT department is highlighted."
End Sub

Kirjoita molemmat modIntro-moduuliin, suorita ensin HighlightTopEarners ja varmista, että täsmälleen kaksi riviä muuttuu vihreäksi (Emma Davis $62,000 ja Sophia Miller $59,000 — kolme muuta ovat $55,000 tai alle), sitten suorita HighlightITDepartment ja varmista, että Sophia Millerin rivi korostuu. Tallenna Ctrl+S, kun molemmat toimivat.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 6
some-alt