Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Läsa och skriva cellvärden | Arbeta med Exceldata
Excel VBA för affärsautomatisering

Läsa och skriva cellvärden

Svep för att visa menyn

Det mest grundläggande som VBA gör är att läsa och skriva ett cells Value:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
 
Debug.Print ws.Range("C2").Value      ' Acme Corp
ws.Range("I2").Value = "Shipped"      ' overwrite the Status cell

Cells(row, column) gör samma sak med siffror istället för bokstäver — mycket användbart när du börjar loopa, eftersom en loopvariabel är ett tal, inte en bokstav:

Debug.Print ws.Cells(2, 3).Value      ' same as Range("C2") — row 2, column 3
ws.Cells(2, 9).Value = "Shipped"      ' same as Range("I2")

Value vs. Formula vs. Formula2

Dessa ser ut att vara utbytbara men är det inte:

ws.Range("H2").Value                  ' returns the calculated result: 202.5
ws.Range("H2").Formula                ' returns the formula as typed: =E2*F2*(1-G2)
ws.Range("H2").Formula2               ' like Formula, but supports newer dynamic-array functions
Figur.3.1

Använd .Value när du bara vill ha talet. Använd .Formula när du skriver in en formel i en cell — till exempel för att bygga Total-kolumnen programmatiskt istället för att skriva den en gång och kopiera:

ws.Range("H2").Formula = "=E2*F2*(1-G2)"

NumberFormat

Styr hur ett värde visas utan att ändra det underliggande talet:

ws.Range("F2:F6").NumberFormat = "$#,##0.00"     ' currency
ws.Range("G2:G6").NumberFormat = "0%"              ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy"      ' date

Detta är viktigare än det låter — en cell kan innehålla 0.1 och visa "10%" samtidigt, och endast NumberFormat styr den andra delen.

Uppgift

  1. Skriv en Sub som läser in Order ORD1003:s Customer och Total till två variabler och visar dem i en MsgBox.
  2. Ändra ORD1002:s Status till "Shipped" med hjälp av Cells(row, column) istället för Range.
  3. Använd NumberFormat = "$#,##0.00" på kolumnerna Unit Price och Total, samt "0%" på kolumnen Discount %.
Tips
expand arrow

1. Läsa ORD1003:s Customer och Total

  • Börja med att ta reda på vilken rad ORD1003 finns på — räkna ner i tabellen från kapitel 3:s inledande data: ORD1001 är rad 2, så ORD1003 är två rader längre ner.
  • Customer och Total är två olika kolumner — räkna över rubrikraden (Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status) för att hitta respektive kolumnbokstav.
  • Deklarera en variabel för kundnamnet (String) och en för totalen (Double), referera till bladet explicit på det sätt som kapitel 3 visade (ThisWorkbook.Worksheets("Orders")), och läs in varje cells .Value till motsvarande variabel.
  • Slå ihop båda variablerna till ett meddelande med & innan du skickar dem till MsgBox — du använde samma mönster i kapitel 2.

2. Ändra ORD1002:s Status med Cells(row, column)

  • Cells(row, column) använder siffror, inte bokstäver — du vet redan vilken rad ORD1002 finns på från tabellen; för kolumnen räknar du positionen istället för att skriva en bokstav (Status är den sista av de nio kolumnerna).
  • Detta är en direkt tilldelning: .Cells(row, column).Value = "Shipped", du behöver inte läsa något först.

3. Använda NumberFormat på tre kolumner

  • NumberFormat ställs in på samma sätt för ett område som för en enskild cell — du använder det på F2:F6, H2:H6 och G2:G6 (dubbelkolla vilken bokstav som hör till Unit Price, Total och Discount % innan du skriver dem).
  • Varje kolumn får sin egen rad, eftersom Unit Price/Total ska ha valutaformat och Discount % procentformat — försök inte använda båda formaten på samma rad.
  • Att referera till området via samma ws-variabel som du redan har satt gör alla tre rader korta och konsekventa.
Lösning
expand arrow
Sub ExploreOrdersData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Read ORD1003's Customer and Total ---
    Dim customerName As String
    Dim orderTotal As Double

    customerName = ws.Range("C4").Value
    orderTotal = ws.Range("H4").Value

    MsgBox "Customer: " & customerName & " | Total: " & orderTotal

    ' --- 2. Change ORD1002's Status using Cells(row, column) ---
    ws.Cells(3, 9).Value = "Shipped"

    ' --- 3. Apply NumberFormat to Unit Price, Total, and Discount % ---
    ws.Range("F2:F6").NumberFormat = "$#,##0.00"   ' Unit Price
    ws.Range("H2:H6").NumberFormat = "$#,##0.00"   ' Total
    ws.Range("G2:G6").NumberFormat = "0%"           ' Discount %
End Sub
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 1

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Läsa och skriva cellvärden

Det mest grundläggande som VBA gör är att läsa och skriva ett cells Value:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Orders")
 
Debug.Print ws.Range("C2").Value      ' Acme Corp
ws.Range("I2").Value = "Shipped"      ' overwrite the Status cell

Cells(row, column) gör samma sak med siffror istället för bokstäver — mycket användbart när du börjar loopa, eftersom en loopvariabel är ett tal, inte en bokstav:

Debug.Print ws.Cells(2, 3).Value      ' same as Range("C2") — row 2, column 3
ws.Cells(2, 9).Value = "Shipped"      ' same as Range("I2")

Value vs. Formula vs. Formula2

Dessa ser ut att vara utbytbara men är det inte:

ws.Range("H2").Value                  ' returns the calculated result: 202.5
ws.Range("H2").Formula                ' returns the formula as typed: =E2*F2*(1-G2)
ws.Range("H2").Formula2               ' like Formula, but supports newer dynamic-array functions
Figur.3.1

Använd .Value när du bara vill ha talet. Använd .Formula när du skriver in en formel i en cell — till exempel för att bygga Total-kolumnen programmatiskt istället för att skriva den en gång och kopiera:

ws.Range("H2").Formula = "=E2*F2*(1-G2)"

NumberFormat

Styr hur ett värde visas utan att ändra det underliggande talet:

ws.Range("F2:F6").NumberFormat = "$#,##0.00"     ' currency
ws.Range("G2:G6").NumberFormat = "0%"              ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy"      ' date

Detta är viktigare än det låter — en cell kan innehålla 0.1 och visa "10%" samtidigt, och endast NumberFormat styr den andra delen.

Uppgift

  1. Skriv en Sub som läser in Order ORD1003:s Customer och Total till två variabler och visar dem i en MsgBox.
  2. Ändra ORD1002:s Status till "Shipped" med hjälp av Cells(row, column) istället för Range.
  3. Använd NumberFormat = "$#,##0.00" på kolumnerna Unit Price och Total, samt "0%" på kolumnen Discount %.
Tips
expand arrow

1. Läsa ORD1003:s Customer och Total

  • Börja med att ta reda på vilken rad ORD1003 finns på — räkna ner i tabellen från kapitel 3:s inledande data: ORD1001 är rad 2, så ORD1003 är två rader längre ner.
  • Customer och Total är två olika kolumner — räkna över rubrikraden (Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status) för att hitta respektive kolumnbokstav.
  • Deklarera en variabel för kundnamnet (String) och en för totalen (Double), referera till bladet explicit på det sätt som kapitel 3 visade (ThisWorkbook.Worksheets("Orders")), och läs in varje cells .Value till motsvarande variabel.
  • Slå ihop båda variablerna till ett meddelande med & innan du skickar dem till MsgBox — du använde samma mönster i kapitel 2.

2. Ändra ORD1002:s Status med Cells(row, column)

  • Cells(row, column) använder siffror, inte bokstäver — du vet redan vilken rad ORD1002 finns på från tabellen; för kolumnen räknar du positionen istället för att skriva en bokstav (Status är den sista av de nio kolumnerna).
  • Detta är en direkt tilldelning: .Cells(row, column).Value = "Shipped", du behöver inte läsa något först.

3. Använda NumberFormat på tre kolumner

  • NumberFormat ställs in på samma sätt för ett område som för en enskild cell — du använder det på F2:F6, H2:H6 och G2:G6 (dubbelkolla vilken bokstav som hör till Unit Price, Total och Discount % innan du skriver dem).
  • Varje kolumn får sin egen rad, eftersom Unit Price/Total ska ha valutaformat och Discount % procentformat — försök inte använda båda formaten på samma rad.
  • Att referera till området via samma ws-variabel som du redan har satt gör alla tre rader korta och konsekventa.
Lösning
expand arrow
Sub ExploreOrdersData()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Orders")

    ' --- 1. Read ORD1003's Customer and Total ---
    Dim customerName As String
    Dim orderTotal As Double

    customerName = ws.Range("C4").Value
    orderTotal = ws.Range("H4").Value

    MsgBox "Customer: " & customerName & " | Total: " & orderTotal

    ' --- 2. Change ORD1002's Status using Cells(row, column) ---
    ws.Cells(3, 9).Value = "Shipped"

    ' --- 3. Apply NumberFormat to Unit Price, Total, and Discount % ---
    ws.Range("F2:F6").NumberFormat = "$#,##0.00"   ' Unit Price
    ws.Range("H2:H6").NumberFormat = "$#,##0.00"   ' Total
    ws.Range("G2:G6").NumberFormat = "0%"           ' Discount %
End Sub
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 1
some-alt