Messagebox in Excel anzeigen, wenn bestimmter Wert ausgegeben wird?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Damit die erste Antwort kein Bandwurm wird, ein neuer Anlauf:

Wenn ich es richtig verstanden habe sind A, B, C Datum, Uhrzeit und Kategorie einer Veranstaltung. Es darf maximal 6 Buchungen der gleichen Art geben, also gleiches Datum, gleiche Uhrzeit und gleiche Kategorie.

Die Abfrage auf Pivot finde ich sehr unglücklich, weil sich die Pivottabelle abhängig von den Einträgen verschiebt. Ich wüsste da nicht, wie man sicher die richtigen Zellen abfragt. Zudem muss bei diesem Verfahren erst der Eintrag kopiert, die Pivot aktualisiert und alles ggf. wieder zurückgedreht werden.

Daher würde ich die Prüfung entweder als Formel in einer Zelle oder halt im Makro selbst machen und zwar bevor der Eintrag geschrieben wird.

Den ersten Block kannst Du ggf. löschen, falls Du schon anderweitig prüfst, ob alle Eingabefelder auch gefüllt sind.

Im zweiten wird dann geprüft, ob schon mehr als 5 angelegt sind. Sind 6 vorhanden, kann keine weitere Buchung erfolgen und es kommt die Abweisung.

War die Prüfung erfolgreich, werden die Einträge A4:D4 ans Ende der Liste kopiert, die Pivot aktualisiert und die Eingaben gelöscht.

Ich bin beim Beispiel davon ausgegangen, dass in Zeile 8 eine Überschrift steht und ab 9 die Einträge kommen.

Sub buchung()
' Prüfung ob alle Eingabfelder gefüllt sind -> löschen wenn es nicht benötigt wird
If Cells(4, 1).Value = "" Or Cells(4, 2).Value = "" Or Cells(4, 3).Value = "" Or Cells(4, 4).Value = "" Then
MsgBox ("Bitte alle Felder ausfüllen")
Exit Sub
End If

' Prüfen ob inkl. der gewünschten Buchung mehr als 6 entstehen würden
Dim anzzeilen
anzzeilen = Cells(Rows.Count, 1).End(xlUp).Row
If WorksheetFunction.CountIfs(Range(Cells(9, 1), Cells(anzzeilen, 1)), Cells(4, 1).Value, Range(Cells(9, 2), Cells(anzzeilen, 2)), Cells(4, 2).Value, Range(Cells(9, 3), Cells(anzzeilen, 3)), Cells(4, 3).Value) > 5 Then
MsgBox ("Diese Buchung ist nicht möglich")
Exit Sub
End If

' Buchung eintragen
For i = 1 To 4
Cells(anzzeilen + 1, i).Value = Cells(4, i).Value
Next
ActiveSheet.PivotTables("PivotTable3").PivotCache.Refresh
Range(Cells(4, 1), Cells(4, 4)) = "" 'löschen der Eingaben
MsgBox ("Buchung erfolgreich erfasst")
End Sub


melsen03 
Fragesteller
 19.01.2016, 13:02

Síeht super aus Danke erstmal!! Leider zeigts mir beim Ausführen den Fehler "Typen sind unverträglich...

Kannst du mir bitte damit eventuell nochmal helfen?

0
Ninombre  19.01.2016, 13:06
@melsen03

wenn Du das Makro mit F8 schrittweise ausführst: An welcher Stelle kommt diese Fehlermeldung?

0
melsen03 
Fragesteller
 19.01.2016, 13:13
@Ninombre

Über Makros > Ausführen und dann F8? oder wie?

Die Prüfung auf ausgefüllte Felder funktioniert auf jeden Fall. Erst wenn auch der Name eingetragen ist, meckerts mich an.

Dazu 2 Sachen:

Stört es dass das Datum im Format "Datum ist"? Der Rest ist nämlich Standard

Die Pivottabelle gibt Werte im Bereich B6 bis K12 aus, könnte das ein Problem darstellen?

0
melsen03 
Fragesteller
 19.01.2016, 13:18
@melsen03

Ich hab das mit F8 jetzt gefunden. Das Makro wird ausgeführt bis zum 2. Exit Sub

0
melsen03 
Fragesteller
 19.01.2016, 13:31
@melsen03

Also das mit dem 2. Exit Sub war klar...es meckert eigentlich die Zeile ActiveSheet.PivotTables...an

0
Ninombre  19.01.2016, 13:38
@melsen03

Zeichne mit dem Recorder noch mal auf, was beim Aktualisieren passiert. Ggf. stimmt das nicht, ich hab bei meiner Tabelle keine Pivottabelle drin, daher kann ich es nicht gut nachstellen.

0
melsen03 
Fragesteller
 19.01.2016, 13:50
@Ninombre

also bis Refresh, macht es das gleiche

Da ich mir wegen der Zeilen nicht sicher war, habe ich das Range direkt dahinter weiter geschrieben, dann kommt in dieser Zeile das mit den Typen unverträglich

Wenn ich jetzt probiere mit dem Range auf der nächsten Zeile kommt Laufzeitfehler 1004: Anwendungs- oder objektbezogener Fehler beim Springen von der Refresh-Zeile auf die Range-Zeile

0
melsen03 
Fragesteller
 19.01.2016, 14:00
@melsen03

Vielleicht hab ich das auch bisschen viel belastet...ich probier also rum und jetzt passiert folgendes (immer noch range auf extrazeile):

Fehler 400 auf der Zeile ActiveSheet...die Daten werden trotzdem in die Tabelle übernommen. Das ausgebucht funktioniert auch noch.

0
Ninombre  19.01.2016, 14:08
@melsen03

Laufzeitfehler 1004: Anwendungs- oder objektbezogener Fehler beim Springen von der Refresh-Zeile auf die Range-Zeile

das könnte darauf hindeuten, dass die Pivottabelle anders heißt.

Range gehört auf jeden Fall in eine neue Ziele, das ist schon richtig.

Du kannst vor einzelne Zeilen ein ' machen, damit wird die Zeile zum Kommentar und nicht ausgeführt. Das könnte beim Fehlersuchen helfen.

0
melsen03 
Fragesteller
 19.01.2016, 15:03
@Ninombre

ich habe den Fehler gefunden: Wenn die Pivottabelle im gleichen Tabellenblatt ist wie der Rest klappt es...gibt es einen Befehl mit dem die Pivottabelle auf einem anderen Tabellenblatt angesprochen werden kann?

0
melsen03 
Fragesteller
 19.01.2016, 15:14
@melsen03

Ok erstmal Vielen Dank ich habs hingekriegt. Vielen vielen Dank!!!

Eine Frage hab ich aber noch: Der Termin ist wie gesagt über 3 Parameter festgelegt. Der zweite ist A oder B. Bei A ist das mit den 6 Plätzen korrekt. Bei B habe ich gerade den Änderungswunsch bekommen max 5 Teilnehmer...geht das?

0
Ninombre  19.01.2016, 16:50
@melsen03

Da muss nur eine Variable rein, statt der festen Abfrage auf die Anzahl und die Variable muss entsprechend auf 5 oder 6 gesetzt werden:

Ich bin davon ausgegangen, dass in B4 A oder B steht, musst Du sonst ändern. Das ist diese Stelle

If Cells(4, 2).Value = "A"

Gibt es noch weitere Ausprägungen außer A und B? Dann muss es ggf. erweitert werden.

Das Ansprechen der Pivottabelle geht auch auf anderen Tabellenblättern. Bisher war es als "Activesheet" hinterlegt, in meinem Beispiel musst Du den Namen noch anpassen in sheets("Tabelle1") wie die Tabelle eben benannt ist.

Sub buchung()
' Prüfung ob alle Eingabfelder gefüllt sind -> löschen wenn es nicht benötigt wird
If Cells(4, 1).Value = "" Or Cells(4, 2).Value = "" Or Cells(4, 3).Value = "" Or Cells(4, 4).Value = "" Then
MsgBox ("Bitte alle Felder ausfüllen")
Exit Sub
End If

' Prüfen ob inkl. der gewünschten Buchung mehr als 6 entstehen würden
Dim anzzeilen As Integer
Dim maxanzahl As Integer
If Cells(4, 2).Value = "A" Then maxanzahl = 6 Else: maxanzahl = 5
anzzeilen = Cells(Rows.Count, 1).End(xlUp).Row

If WorksheetFunction.CountIfs(Range(Cells(9, 1), Cells(anzzeilen, 1)), Cells(4, 1).Value, Range(Cells(9, 2), Cells(anzzeilen, 2)), Cells(4, 2).Value, Range(Cells(9, 3), Cells(anzzeilen, 3)), Cells(4, 3).Value) > maxanzahl - 1 Then
MsgBox ("Diese Buchung ist nicht möglich")
Exit Sub
End If

' Buchung eintragen
For i = 1 To 4
Cells(anzzeilen + 1, i).Value = Cells(4, i).Value
Next
Sheets("Tabelle1").PivotTables("PivotTable3").PivotCache.Refresh
Range(Cells(4, 1), Cells(4, 4)) = "" 'löschen der Eingaben
MsgBox ("Buchung erfolgreich erfasst")
End Sub
0
melsen03 
Fragesteller
 20.01.2016, 09:58
@Ninombre

Vielen Dank, du hast grad nem Azubi zu Ruhm und Ehre verholfen ;-)

0

Es wäre aus meiner Sicht eleganter die Abfrage an das bestehende Makro anzuhängen als das Tabellenblatt laufend auf Änderungen zu kontrollieren und dann die Messagebox aufzurufen. Außerdem ist es dann ja eigentlich zu spät, dann wurde der Eintrag schon vorgenommen. Das zurückdrehen ist komplizierter, als wenn man den Eintrag gleich verhindert.

Wie ist denn das Makro bisher aufgebaut? Code wäre notwendig, um die konkrete Änderung auch zu beschreiben.

Die Abfrage wäre dann sinngemäß: Wenn Zielfeld + neue Eingabe >6 dann...



melsen03 
Fragesteller
 18.01.2016, 11:38

Momentan hab ich nur folgendes:

Range ("A4") . Select

Selection.Copy

ActiveWindow.SmallScroll Down:=3

Range ("A8"). Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,SkipBlanks_ := False, Transpose:= False

DAS GLEICHE FÜR B4 BIS D4

Range ("A8:D8"). Select

Selection.Insert Shift:=xlDown, CopyOrigin:= xlFormatFromLeftOrAbove

Sheets ("Übersicht").Select

ActiveSheet.PivotTables("PivotTable3").PivotSelect "Termine[All]", xlLabelOnly_+ xlFirstRow, True

ActiveSheet.PivotTables("PivotTable3").PivotCache.Refresh

End Sub

Ich hab nicht wirklich nen Plan von MAkros, hab das hier mit Makro aufzeichnen gemacht.

Danke schonmal für deine Hilfe

0
Ninombre  18.01.2016, 12:24
@melsen03

Der Recorder schreibt immer ziemlich viel mit, so dass es schwer lesbar wird. Das Makro soll doch nur die Werte A4 bis D4 nach A8 bis A8 kopieren und die Pivottabelle aktualisieren, oder?

Wo passiert dann die Berechnung, bei der ggf. ein Wert über 6 herauskommen kann?

0
melsen03 
Fragesteller
 18.01.2016, 12:34
@Ninombre

Ja genau, bei A4-C4 ist es Kopieren, bei D4 ist es ausschneiden

die Berechnung erfolgt direkt beim Aktualisieren der Pivottabelle.

0
Ninombre  18.01.2016, 15:59
@melsen03

Ich möchte nicht das ganze Konstrukt zerpfücken, aber ich kann das Zusammenspiel der einzelnen Punkte noch nicht nachvollziehen. So ist es etwas schwierig, eine passende Lösung zu finden.

Die Eingabe der Werte erfolgt in der Tabelle, diese werden dann per Makro kopiert und in der Pivot summiert.

Wenn die Werte von einer festen Stelle zu einer anderen übernommen werden, könnte das auch mit einem direkten Bezug gemacht werden (A8=A4) oder die Eingabe direkt in A8 bis D8.

Wenn die übrigen Zellen unverändert bleiben, ist die Frage, was die Pivottabelle dann macht. Ich nehme an, die Pivottabelle bringt das Problem, dass sie nicht automatisch aktualisiert wird und daher das Makro kommt. Wenn die Logik der Pivot mit normalen Formeln abgebildet wird, dann wird automatisch aktualisiert.

Den Hinweis, dass der Maximalwert überschritten wurde, kann man mit einer Wenn-Formel in einer normalen Zelle anzeigen.

0
melsen03 
Fragesteller
 19.01.2016, 10:47
@Ninombre

Die Übernahme ist notwendig, weil viele User mit der Tabelle arbeiten sollen. Im Endeffekt ist das Ziel eine Teilnehmerliste mit begrenzter Teilnehmerzahl zu erstellen, in die sich die Nutzer selbst eintragen.

Die 4. Zeile ist die, wo sich der Nutzer eintragen soll (in DropDownMenüs und ein Textfeld für den Namen) Der Rest ist gesperrt und in den gesperrten Bereich, z. B. Zeile 8 sollen die eingegebenen Daten übernommen werden.

Die Pivottabelle zählt dann die eingetragenen Personen für jeden möglichen Termin ( wird durch 3 Parameter bestimmt: Datum, Kategorie, Uhrzeit) Wenn ein Feld über 6 ausgibt, soll das PopUp kommen um zu einer erneuten Eingabe mit anderem Termin aufzufordern.

Außerdem hab ich noch ein Makro drin, das die Datei nach bestimmter Zeit nicht bearbeiten der Tabelle schließt. Das funktioniert auch.

Ich habe jetzt schon bisschen rumprobiert und habe den Verdacht, dass sich das Makro zum Übertragen etc. mit dem MsgBox-Makro überschneidet.

0