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.
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.
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
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
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.
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.
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: