Lesen und Schreiben von Zellwerten
Swipe um das Menü anzuzeigen
Das grundlegendste, was VBA tut, ist das Lesen und Schreiben des Zellwerts:
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) macht dasselbe, verwendet jedoch Zahlen anstelle von Buchstaben — besonders nützlich beim Durchlaufen von Schleifen, da eine Schleifenvariable eine Zahl und kein Buchstabe ist:
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
Diese sehen austauschbar aus, sind es aber nicht:
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
Verwendung von .Value, wenn nur die Zahl benötigt wird. Verwendung von .Formula, wenn eine Formel in eine Zelle geschrieben werden soll – zum Beispiel, um die Spalte Total programmatisch zu erstellen, anstatt sie einmal einzugeben und dann zu kopieren:
ws.Range("H2").Formula = "=E2*F2*(1-G2)"
NumberFormat
Steuert die Anzeige eines Wertes, ohne die zugrunde liegende Zahl zu verändern:
ws.Range("F2:F6").NumberFormat = "$#,##0.00" ' currency
ws.Range("G2:G6").NumberFormat = "0%" ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy" ' date
Dies ist wichtiger, als es scheint – eine Zelle kann 0,1 enthalten und gleichzeitig "10%" anzeigen, und nur NumberFormat steuert den zweiten Teil.
Aufgabe
- Schreiben eines
Sub, das den Kunden und den Gesamtbetrag der Bestellung ORD1003 in zwei Variablen einliest und diese in einerMsgBoxanzeigt. - Ändern des Status von ORD1002 auf "Shipped" unter Verwendung von Cells(row, column) anstelle von Range.
- Anwenden von
NumberFormat = "$#,##0.00"auf die Spalten Unit Price und Total sowie "0%" auf die Spalte Discount %.
1. Einlesen von Kunde und Gesamtbetrag für ORD1003
- Zuerst ermitteln, in welcher Zeile ORD1003 steht — zähle in der Tabelle aus den Anfangsdaten von Kapitel 3 nach unten: ORD1001 ist in Zeile 2, also ist ORD1003 zwei Zeilen weiter unten.
- Kunde und Gesamtbetrag befinden sich in unterschiedlichen Spalten — zähle über die Kopfzeile (Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status), um den jeweiligen Buchstaben zu finden.
- Eine Variable für den Kundennamen (
String) und eine für den Gesamtbetrag (Double) deklarieren, das Arbeitsblatt explizit referenzieren wie in Kapitel 3 (ThisWorkbook.Worksheets("Orders")), und die.Valuejeder Zelle in die entsprechende Variable einlesen. - Beide Variablen mit
&zu einer Nachricht verketten, bevor sie anMsgBoxübergeben werden — dieses Muster wurde bereits in Kapitel 2 verwendet.
2. Ändern des Status von ORD1002 mit Cells(row, column)
Cells(row, column)verwendet Zahlen, keine Buchstaben — die Zeile von ORD1002 ist bereits aus der Tabelle bekannt; für die Spalte einfach die Position zählen, anstatt einen Buchstaben zu verwenden (Status ist die letzte der neun Spalten).- Dies ist eine direkte Zuweisung:
.Cells(row, column).Value = "Shipped", es muss vorher nichts eingelesen werden.
3. Anwenden von NumberFormat auf drei Spalten
NumberFormatwird für einen Bereich genauso gesetzt wie für eine einzelne Zelle — es wird aufF2:F6,H2:H6undG2:G6angewendet (vor dem Tippen prüfen, welcher Buchstabe zu Unit Price, Total und Discount % gehört).- Jede Spalte erhält eine eigene Zeile, da Unit Price/Total eine Währungsformatierung und Discount % eine Prozentformatierung benötigen — beide Formate nicht in einer Zeile anwenden.
- Die Referenzierung des Bereichs über die bereits gesetzte Variable
wshält alle drei Zeilen kurz und einheitlich.
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
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Lesen und Schreiben von Zellwerten
Das grundlegendste, was VBA tut, ist das Lesen und Schreiben des Zellwerts:
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) macht dasselbe, verwendet jedoch Zahlen anstelle von Buchstaben — besonders nützlich beim Durchlaufen von Schleifen, da eine Schleifenvariable eine Zahl und kein Buchstabe ist:
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
Diese sehen austauschbar aus, sind es aber nicht:
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
Verwendung von .Value, wenn nur die Zahl benötigt wird. Verwendung von .Formula, wenn eine Formel in eine Zelle geschrieben werden soll – zum Beispiel, um die Spalte Total programmatisch zu erstellen, anstatt sie einmal einzugeben und dann zu kopieren:
ws.Range("H2").Formula = "=E2*F2*(1-G2)"
NumberFormat
Steuert die Anzeige eines Wertes, ohne die zugrunde liegende Zahl zu verändern:
ws.Range("F2:F6").NumberFormat = "$#,##0.00" ' currency
ws.Range("G2:G6").NumberFormat = "0%" ' percentage
ws.Range("B2:B6").NumberFormat = "dd/mm/yyyy" ' date
Dies ist wichtiger, als es scheint – eine Zelle kann 0,1 enthalten und gleichzeitig "10%" anzeigen, und nur NumberFormat steuert den zweiten Teil.
Aufgabe
- Schreiben eines
Sub, das den Kunden und den Gesamtbetrag der Bestellung ORD1003 in zwei Variablen einliest und diese in einerMsgBoxanzeigt. - Ändern des Status von ORD1002 auf "Shipped" unter Verwendung von Cells(row, column) anstelle von Range.
- Anwenden von
NumberFormat = "$#,##0.00"auf die Spalten Unit Price und Total sowie "0%" auf die Spalte Discount %.
1. Einlesen von Kunde und Gesamtbetrag für ORD1003
- Zuerst ermitteln, in welcher Zeile ORD1003 steht — zähle in der Tabelle aus den Anfangsdaten von Kapitel 3 nach unten: ORD1001 ist in Zeile 2, also ist ORD1003 zwei Zeilen weiter unten.
- Kunde und Gesamtbetrag befinden sich in unterschiedlichen Spalten — zähle über die Kopfzeile (Order ID, Order Date, Customer, Product, Qty, Unit Price, Discount %, Total, Status), um den jeweiligen Buchstaben zu finden.
- Eine Variable für den Kundennamen (
String) und eine für den Gesamtbetrag (Double) deklarieren, das Arbeitsblatt explizit referenzieren wie in Kapitel 3 (ThisWorkbook.Worksheets("Orders")), und die.Valuejeder Zelle in die entsprechende Variable einlesen. - Beide Variablen mit
&zu einer Nachricht verketten, bevor sie anMsgBoxübergeben werden — dieses Muster wurde bereits in Kapitel 2 verwendet.
2. Ändern des Status von ORD1002 mit Cells(row, column)
Cells(row, column)verwendet Zahlen, keine Buchstaben — die Zeile von ORD1002 ist bereits aus der Tabelle bekannt; für die Spalte einfach die Position zählen, anstatt einen Buchstaben zu verwenden (Status ist die letzte der neun Spalten).- Dies ist eine direkte Zuweisung:
.Cells(row, column).Value = "Shipped", es muss vorher nichts eingelesen werden.
3. Anwenden von NumberFormat auf drei Spalten
NumberFormatwird für einen Bereich genauso gesetzt wie für eine einzelne Zelle — es wird aufF2:F6,H2:H6undG2:G6angewendet (vor dem Tippen prüfen, welcher Buchstabe zu Unit Price, Total und Discount % gehört).- Jede Spalte erhält eine eigene Zeile, da Unit Price/Total eine Währungsformatierung und Discount % eine Prozentformatierung benötigen — beide Formate nicht in einer Zeile anwenden.
- Die Referenzierung des Bereichs über die bereits gesetzte Variable
wshält alle drei Zeilen kurz und einheitlich.
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
Danke für Ihr Feedback!