Rechnen mit VBA?

Hallo zusammen,

ich habe folgenden Code gebastelt, der rechnen soll:

C9 = A9 * B9
C10 = A10 * B10
C11 = A11 * B11
usw.

Private Sub ToggleButton2\_Click()

If ToggleButton2 Then
 Range("c9") = Range("a9") \* Range("b9")
 Range("c10") = Range("a10") \* Range("b10")
 Range("c11") = Range("a11") \* Range("b11")
 Range("c12") = Range("a12") \* Range("b12")
 Range("c13") = Range("a13") \* Range("b13")
 ...
 ...

Else
 Range("c9") = 0
 Range("c10") = 0
 Range("c11") = 0
 Range("c12") = 0
 Range("c13") = 0
 ...
 ...

End If
End Sub

funktioniert auch.

Dazu 2 Fragen:

  1. Kann man ihm sagen, dass er diese Berechnung bis zur letzten
    belegten Zeile fortsetzen soll, ohne dass ich jede Zeile
    einklappern muss?

  2. Kann er auch rechnen, wenn sich eine Zahl ändert, ohne
    dass man die Berechnung über eine Schaltfläche „anschiebt“?

Die else-Schleife ist hier eher unwichtig. (Excel 2000)

Gruß und danke
Rolf

Hallo Rolf.

Der folgende Code kann in den Deklarations-Abschnitt des entsprechenden Tabellnblattes eingefügt werden:

Private Sub Worksheet\_Change(ByVal Target As Range)
 On Error GoTo Fehler 'Veranlaßt eine Verzweigung zur Zeilenmarke "Fehler", wenn irgendwo ein Fehler innerhalb dieser Prozedur ein Fehler auftritt
 Select Case Target.Column 'Leitet eine Fall-Prüfung ein
 Case 1, 2 'Fall: Die gewählte Spalte ist entweder Spalte A oder Spalte B
 Application.EnableEvents = False 'Schaltet den Aufruf von Ereignissen ab, damit keine Rekursion entsteht
 If Not IsNumeric(Cells(Target.Row, Target.Column)) Then GoTo Fehler 'Sollte der Inhalt der aktiven Spalte nicht numerisch sein, dann verzweige zur Zeilenmarke "Fehler"
 If Not IsNumeric(Cells(Target.Row, Target.Column \* -1 + 3)) Then GoTo Fehler 'Sollte der Inhalt der jeweils anderen Spalte nicht numerisch sein, dann verzweige zur Zeilenmarke "Fehler"
 If (IsEmpty(Cells(Target.Row, Target.Column)) Or IsEmpty(Cells(Target.Row, Target.Column \* -1 + 3))) = True Then 'Wenn eine der beiden Spalten leer ist, dann...
 Cells(Target.Row, 3).Clear 'Lösche den Inhalt in Spalte C der aktiven Zeile
 GoTo Ende 'Verzweige zur Zeilenmarke "Ende"
 End If
 Cells(Target.Row, 3) = Cells(Target.Row, 1) \* Cells(Target.Row, 2) ' Berechnung des Ergebnisses und eintragen in Spalte C der aktiven Zeile
 End Select
Ende:
 Application.EnableEvents = True 'Schaltet den Aufruf von Ereignissen wieder ein
 Exit Sub 'Verlassen der Prozedur
Fehler:
 Resume Ende 'Beenden der Fehlerbehandlung und verzweigung zur Zeilenmarke "Ende"
End Sub

Dieser Code berechnet immer nur das eine Ergebnis in der aktiven Zeile; nicht wie gewünscht in einem Durchlauf alle Ergebnisse. Das ließe sich zwar ohne Weiteres machen, aber da man ja sowieso immer nur in einer Zelle etwas ändert, denke ich, geht es auch so.

Die Funktionalität sollte durch die Kommentare eigentlich ausreichend erklärt sein.

Der Code wird immer dann aufgerufen, wenn eine Zahl in Spalte A oder Spalte B geändert wird; ToggleButton ist also überflüssig.

Kannst Du ja 'mal ausprobieren.

VG
Carsten

Hallo Rolf.

Der folgende Code kann in den Deklarations-Abschnitt des
entsprechenden Tabellnblattes eingefügt werden:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fehler 'Veranlaßt eine Verzweigung zur
Zeilenmarke „Fehler“, wenn irgendwo ein Fehler innerhalb
dieser Prozedur ein Fehler auftritt
Select Case Target.Column 'Leitet eine Fall-Prüfung ein
Case 1, 2 'Fall: Die gewählte Spalte ist entweder
Spalte A oder Spalte B
Application.EnableEvents = False 'Schaltet den
Aufruf von Ereignissen ab, damit keine Rekursion entsteht
If Not IsNumeric(Cells(Target.Row, Target.Column))
Then GoTo Fehler 'Sollte der Inhalt der aktiven Spalte nicht
numerisch sein, dann verzweige zur Zeilenmarke „Fehler“
If Not IsNumeric(Cells(Target.Row, Target.Column *
-1 + 3)) Then GoTo Fehler 'Sollte der Inhalt der jeweils
anderen Spalte nicht numerisch sein, dann verzweige zur
Zeilenmarke „Fehler“
If (IsEmpty(Cells(Target.Row, Target.Column)) Or
IsEmpty(Cells(Target.Row, Target.Column * -1 + 3))) = True
Then 'Wenn eine der beiden Spalten leer ist, dann…
Cells(Target.Row, 3).Clear 'Lösche den Inhalt
in Spalte C der aktiven Zeile
GoTo Ende 'Verzweige zur Zeilenmarke „Ende“
End If
Cells(Target.Row, 3) = Cells(Target.Row, 1) *
Cells(Target.Row, 2) ’ Berechnung des Ergebnisses und
eintragen in Spalte C der aktiven Zeile
End Select
Ende:
Application.EnableEvents = True 'Schaltet den Aufruf von
Ereignissen wieder ein
Exit Sub 'Verlassen der Prozedur
Fehler:
Resume Ende 'Beenden der Fehlerbehandlung und verzweigung
zur Zeilenmarke „Ende“
End Sub

Dieser Code berechnet immer nur das eine Ergebnis in der
aktiven Zeile; nicht wie gewünscht in einem Durchlauf alle
Ergebnisse. Das ließe sich zwar ohne Weiteres machen, aber da
man ja sowieso immer nur in einer Zelle etwas ändert, denke
ich, geht es auch so.

Die Funktionalität sollte durch die Kommentare eigentlich
ausreichend erklärt sein.

Der Code wird immer dann aufgerufen, wenn eine Zahl in Spalte
A oder Spalte B geändert wird; ToggleButton ist also
überflüssig.

Moin Carsten,

das klappt prima, so dachte ich mir das *freu*
Vielen herzlichen Dank.

Gruß
Rolf

Cells(Target.Row, 3) = Cells(Target.Row, 1) * Cells(Target.Row, 2)

Hallo Carsten
Ich habe folgendes „Problemchen“ bei der Anwendung Deines Codes:
Ich habe die ganze Tabelle formatiert: Zahlenformat mit zwei Dezimalstellen und 1000er-Trennzeichen. In der dritten Spalte wird diese Formatierung „überschrieben“ durch das Standard-Format.
Wenn ich das Buchhaltungsformat verwende, wird das abgeändert.
Weisst Du, warum das passiert? Und vor allem: Wie könnte man den Code ändern, dass die dritte Spalte so formatiert wird oder bleibt, wie man es möchte?
Vielen Dank für Deine Hilfe und viele Grüsse
Niclaus

Hallo Niclaus,

Cells(Target.Row, 3) = Cells(Target.Row, 1) * Cells(Target.Row, 2)

Ich habe die ganze Tabelle formatiert: Zahlenformat mit zwei
Dezimalstellen und 1000er-Trennzeichen. In der dritten Spalte
wird diese Formatierung „überschrieben“ durch das
Standard-Format.
Wenn ich das Buchhaltungsformat verwende, wird das abgeändert.

was willst du, das Buchhaltungsformat oder das vorher beschriebene Zahl-Format?

probier dieses mal:

Private Sub Worksheet\_Change(ByVal Target As Range)
If Target.Cells.Count \> 1 Then Exit Sub
If Intersect(Target, Range("A:B")) Is Nothing Then Exit Sub
If Cells(Target.Row, 1) "" And Cells(Target.Row, 2) "" And \_
 IsNumeric(Cells(Target.Row, 1)) And IsNumeric(Cells(Target.Row, 2)) Then
 'Cells(Target.Row, 3).NumberFormat = "#,##0.00"
 Cells(Target.Row, 3).NumberFormat = "#,##0.00 €"
 Cells(Target.Row, 3) = Cells(Target.Row, 1) \* Cells(Target.Row, 2)
ElseIf Not IsNumeric(Cells(Target.Row, 1)) Or Not IsNumeric(Cells(Target.Row, 2)) Then
 Cells(Target.Row, 3) = "Feh.ler,00" '\*gg\*
Else
 Cells(Target.Row, 3) = ""
End If
End Sub

Gruß
Reinhard

Hallo Niclaus.

Ich habe folgendes „Problemchen“ bei der Anwendung Deines
Codes:
Ich habe die ganze Tabelle formatiert: Zahlenformat mit zwei
Dezimalstellen und 1000er-Trennzeichen. In der dritten Spalte
wird diese Formatierung „überschrieben“ durch das
Standard-Format.
Wenn ich das Buchhaltungsformat verwende, wird das abgeändert.
Weisst Du, warum das passiert? Und vor allem: Wie könnte man
den Code ändern, dass die dritte Spalte so formatiert wird
oder bleibt, wie man es möchte?
Vielen Dank für Deine Hilfe und viele Grüsse
Niclaus

Nein, das kann ich Dir nicht sagen. Ich habe bei mir sowohl die Formatierung „Zahl mit zwei Dezimalstellen und Tausender-Trennzeichen“, als auch „Buchführung“ ausprobiert, aber bei mir wird die Formatierung nach Ausführung des Codes nicht überschrieben.

Ich verwende EXCEL XP (2002).

VG
Carsten

Nein, das kann ich Dir nicht sagen. Ich habe bei mir sowohl
die Formatierung „Zahl mit zwei Dezimalstellen und
Tausender-Trennzeichen“, als auch „Buchführung“ ausprobiert,
aber bei mir wird die Formatierung nach Ausführung des Codes
nicht überschrieben.

Ich verwende EXCEL XP (2002).

Hallo Carsten,

bei meinem XL2000 geschieht das was Niclaus sagt.

A und B sind als Zahl mit 2 Nachkommastellen formatiert.
C als Buchhaltung mit 2 Nachkommastelen und dem Eurosymbol.

Gib mal in A und B was ein, anfangs klappt das, dann lösche mal aber mal in A oder B und trage wieder was ein, auf einmal hat Spalte C nur noch das Standard-Format, also keine Nachkommastellen, kein Eurosymbol.

Gruß
Reinhard

Hallo Reinhard und Niclaus.

Wenn man in dem Code die „Clear“-Methode durch die „ClearContents“-Methode ersetzt, dann funktioniert es.

Scheinbar löscht „Clear“ irgendwie alles inklusive Formatierung.

VG
Carsten

was willst du, das Buchhaltungsformat oder das vorher
beschriebene Zahl-Format?

Vielen Dank, Reinhard

Mit dem Hinweis von Carsten auf ClearContents hat sich das Problem gelöst.
Was ich wolle, fragst Du: einmal so, einmal anders - und möglichst kompliziert, wie wir Schweizer halt sind:

_ SFr. * #’##0.00_ ;_ SFr. * - #’##0.00_ ;_ SFr. * „-“??_ ;_ @_

Dazu kommt, dass wir Dezimaltrennzeichen und Tausendertrennzeichen ganz anders handhaben als Ihr Nordländer.

Grüsse aus Zürich Niclaus

Wenn man in dem Code die „Clear“-Methode durch die
„ClearContents“-Methode ersetzt, dann funktioniert es.

Tut es! Vielen Dank. Niclaus

Hallo Niclaus,

_ SFr. * #’##0.00_ ;_ SFr. * - #’##0.00_ ;_ SFr. * „-“??_ ;_
@_

mein Excel mag diese Formatierung nicht.
Wäre sie korrekt könnte man sie per Numberformatlocal mittels Vba benutzen.

Dazu kommt, dass wir Dezimaltrennzeichen und
Tausendertrennzeichen ganz anders handhaben als Ihr
Nordländer.

Nordländer? Aha, deshalb frier ich grad so im Freien :smile:)

Gruß
Reinhard