5.5k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo erstmal liebe Excel Experten
Ich soll für meinen Chef eine Kassenbuchvorlage erstellen. Was so kein Problem ist. Jetzt will der aber das. wenn der Wert in Spalte Bestand(Wert aus Einnahme - Ausgabe +Bestand voherige Zeile) ins negative rutscht, eine MsgBox aufgeht, welche nach klick auf ok die letzte Eingabe zurücksetzt. Nun habe ich folgendes Probiert
VBA Modul erstellt
Function Alarm()
MsgBox "Negative Werte im Bestand sind unzulässig" ,VbInformation , "Falsche Eingabe"
End Function
Dann habe ich Hilfszelle benutzt und folgende Formel benutzt
=Wenn(ZelleBestand<o;Alarm();"")
Irgendwie funzt das aber net, wenn ich einen negativen Wert erreiche erscheint in der Hilfszelle Name statt der MsgBox.
Bin am verzweifeln, und hoffe es kann mir jemand helfen, dafür schon mal vielen Dank im vorraus.

31 Antworten

0 Punkte
Beantwortet von
Hallo zusammen,

auch wenn das geschriebene hier schon etwas älter ist, hoffe ich, das mir jemand helfen kann.

Ich arbeite heute zum ersten mal mit VBA und bin alles andere als ein Computerprofi, also bitte so erklären dass auch ich das verstehen kann.

Ich habe hier genau das angesprochene Problem.

Ich habe den letzten Eintrag von Karin übernommen und im Test klappt das super.

Nur wenn ich es dann da anwende wo ich brauche, passiert nicht. Keine Fehlermeldung oder sonstiges.

Die Box bezieht sich auf alle Zellen einer bestimmten Spalte, aus einer bestimmten Tabelle.

Folgendes habe ich erfolglos versucht:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("Tab_Geld[Stand Kasse]")) Is Nothing Then
Application.EnableEvents = False
If Cells(Target.Row, 7) < 0 Then
MsgBox "letzter Wert fehlerhaft! ", vbCritical, "Achtung negativer Kassenbestand"
Application.Undo
End If
Application.EnableEvents = True
End If
End Sub

Wenn ich einen "freien" Bereich, z.B. G1:G3 angebe, klappt es problemlos.

Wenn ich aber einen Bereich, oder auch nur eine Zelle innerhalb dieser Tabelle und dieser Range eingebe, passiert einfach nichts.

Ich würde mich freuen wenn mir da jemand weiterhelfen könnte.

Gruß

Björn
0 Punkte
Beantwortet von
Hallo zusammen,

ich weiß das Thema ist schon was älter. Ich hoffe mir kann trotzdem jemand helfen.

Ich habe genau das o.g. Problem.

Ich arbeite heute zum ersten mal

Die Formel von Karin klappt super, aber leider nur in "freien" Bereichen.

Meine Formel lautet:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("Tab_Geld[Stand Kasse]")) Is Nothing Then
Application.EnableEvents = False
If Cells(Target.Row, 7) < 0 Then
MsgBox "letzter Wert fehlerhaft! ", vbCritical, "Achtung negativer Kassenbestand"
Application.Undo
End If
Application.EnableEvents = True
End If
End Sub

Wenn ich z.B. G1:G3 eingebe, klappt es prima. Sobald ich aber eine Zelle oder die Range aus der Tabelle eingebe, passiert einfach gar nichts. Keine Fehlermeldung oder so.

Ich hoffe dass mir irgendjemand helfen kann.

Gruß

Björn
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo Björn,

mit der Zeile

If Cells(Target.Row, 7) < 0 Then

wird die Messagebox eben nur dann gestartet, wenn in Spalte 7, also Spalte G, der jeweiligen Eingabezeile der Wert kleiner Null ist.

Ändere die Zeile wie folgt.

If Target.Value < 0 Then

Dann wird der Wert in der betreffenden Eingabezelle geprüft, unabhängig von der Spalte.

Gruß

M.O.

0 Punkte
Beantwortet von

Hallo m-o,

vielen Dank für die Antwort.

Erstmal sorry das meine Anfrage zweimal auftaucht. Ich schreibe zum ersten mal in ein Forum und wusste nicht dass es anscheinend eine Zeit lang dauert, bis der Text erscheint.

Deine Änderung hat mich schon mal ein Stück weiter gebracht, aber noch nicht ans Ziel.

Tatsächlich wird jetzt genau der richtige Bereich angesprochen den ich brauche.

Jetzt habe ich aber zwei neue Probleme:

1. Der Bereich ist ja innerhalb eine sich stetig erweiternden Tabelle. Wenn ich in der letzten Zelle der Tabelle bin, drücke ich die Tab- Taste und eine neue Zeile mit den selben Formatierungen etc. erscheint. Jetzt drücke ich Tab und es öffnet sich automatisch die VBA mit dem Fenster "Laufzeitfehler `13`: Typen unverträglich. Wenn ich auf "Debuggen" klicke, markiert der mir genau deine Zeile Gelb.

2. Es funktioniert nur wenn ich eine negative Zahl direkt eintrage. Die Zahlen werden allerdings anhand meiner Ausgaben automatisch berechnet. Er zeigt mir keine Fehlermeldung o.ä. an, sondern schreibt einfach die negative Zahl.

Ich hänge mal zum besseren Verständnis ein Bild an:

Die Spalte "Stand Kasse" (Rot unterlegt) berechnet sich automatisch, je nach dem was ich in den Spalten "Quelle", "Einn." und "Ausg." eingebe. Da aber ja die Kasse niemals <0€ sein darf, soll sich in dem Fall das Fenster öffnen.

Name Tabelle: Tab_Geld

Name Range: Stand Kasse

Hoffe ich konnte es verdeutlichen.

Gruß

Björn

0 Punkte
Beantwortet von
Ich habe mittlerweile verstanden, das VBA nur erkennt das in der Zelle eine Formel steht und keine negative Zahl in dem Sinne. Aber wie kann ich sagen das er nicht die Formel lesen soll, sondern das tatsächlich geschriebene?
0 Punkte
Beantwortet von
Problem eins ist übrigens "behoben".
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Bjorn,

du musst die Spalten Spalten "Einn." und "Ausg." (hier werden ja wohl die Zahlen eingegeben) überwachen und bei einer Eingabe in diese Spalten, die Summe der Spalte Kasse prüfen, also ähnlich wie beim ursprünglichen Makro. Wenn du noch schreiben würdest, in welchen Spalten "Einn." (=Spalte F ??) und "Ausg." (=Spalte G ??) sowie der "Stand der Kasse" (=Spalte I ??) stehen, dann könnte man dir den Code auch anpassen.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo m-o,

mit den Spalten kann ich (glaube ich) leider nicht arbeiten, da die o.g. Tabelle nur ein Auszug aus dem Arbeitsblatt ist. Sowohl darüber, als auch darunter stehen noch ganz andere Sachen. Der würde doch dann, je nach dem was in einer anderen Zeile steht, evtl. einen "Fehlalarm" anzeigen. Oder sehe ich das falsch?

Ich arbeite mich ja jetzt seit Monaten immer weiter in Excel rein und habe mittlerweile viele Formeln (aber noch nie in VBA) so ungeschrieben, dass nicht ganze Spalten sondern nur bestimmte Ranges überwacht werden. Seit dem ist mir Excel auch nicht mehr abgeschmiert. Der Rechner ist halt auch nicht mehr der neuste.

Aber ansonsten ist die 1. Zelle ("Datum") in dem oben gezeigten Arbeitsblatt A1 und es geht bis J35.

In der Originalmappe geht es mit der Zelle "Datum" bei A70 los und geht derzeit bis J150. Die erste zu berechende Zeile ist also bei A71 und die letzte verschiebt sich natürlich bei jedem neuen Eintrag eine nach unten.

Alle anderen Ranges haben allerdings auch Namen. Ich als Laie stelle mir vor, das es damit evtl. besser geht?!

Die anderen Ranges sind:

"Quelle" = Rng_Quelle

"Einn." = Rng_Einnahmen

und wie könnte es anders sein

"Ausg." = Rng_Ausgaben

Gruß

Björn
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo Björn,

du kannst nicht nur Spalten auch einzelne Bereiche überwachen. Und wenn diese Bereiche einen Namen haben, kannst du statt der Zellbezüge auch die Namen verwenden.

Schau mal, ob ich dich richtig verstanden habe:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("Rng_Ausgaben, Rng_Einnahmen")) Is Nothing Then
Application.EnableEvents = False
If Cells(Target.Row, 9).Value < 0 Then           'Kassenbestandt steht in Spalte I = 9
MsgBox "letzter Wert fehlerhaft! ", vbCritical, "Achtung negativer Kassenbestand"
Application.Undo
End If
Application.EnableEvents = True
End If
End Sub

Gruß

M.O.

0 Punkte
Beantwortet von
Hallo m-o,

leider funktioniert es nicht.

Er zeigt an:

Laufzeitfehler `1004`:

Die Methode `Range`für das Objekt `_Worksheet`ist fehlgeschlagen

Wenn auch "Debuggen" klicke, markiert er mit folgende Zeiel Geld:

"If Not Intersect(Target, Range("Rng_Ausgaben, Rng_Einnahmen")) Is Nothing Then"

Gruß

Björn
...