Wie erstelle ich in VBA eine MsgBox mit Ja-Nein-Abfrage?

3 Antworten

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Cells(15, 4).Value = "LK" Then
    a = MsgBox("beliebiger Fragestellung", vbYesNo, "beliebiger Titel")
Else
    Exit Sub
End If

If a = vbYes Then Exit Sub
MsgBox "beliebiger Text"

End Sub

Sowas?

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Antwort
If Not Intersect(Target, Range("D15")) Is Nothing Then
If Target.Value = "LK" Then
Antwort = MsgBox("Dieses Produkt benötigt eine Lebensmittelkühlung! Bitte Bestätigen", 4, "Bestätigung erforderlich")
If Antwort = vbNo Then
MsgBox "NANA, sie wollen sich doch nicht strafbar machen oder?"
Else
End If
End If
End If
End Sub
oomee 
Fragesteller
 13.10.2015, 14:23

Dein Befehl funktioniert hervorragend wenn ich in Zelle (D15) den Wert "LK" manuell eingebe, allerdings funktioniert es nicht wenn der Wert "LK" durch eine SVerweis Formel hervorgerufen wird ... woran kann es liegen?

0
schmiddi1967  13.10.2015, 14:28
@oomee

Naja, das geht auch nicht.

Er prüft ja nur die Eingabe in Zelle D15. Ich will mal sehen ob ich auf die schnelle eine Lösung finde.

1
Suboptimierer  13.10.2015, 14:34
@oomee

Der Intesect-Befehl 

If Not Intersect(Target, Range("D15")) Is Nothing Then
muss alle Zellen einschließen, deren Änderung eine Änderung in der Berechnung des SVerweis hervorrufen kann.
1
schmiddi1967  13.10.2015, 14:53
@Suboptimierer

Naja, eventuell kannst du das ja auch dann direkt über eine Function machen. Das würde dann so gehen das du dir ein Modul anlegst und da folgenden Code anlegst:

Function Frage()
Dim Antwort
Antwort = MsgBox("Dieses Produkt benötigt eine Lebensmittelkühlung! Bitte Bestätigen", 4, "Bestätigung erforderlich")
If Antwort = vbNo Then
MsgBox "NANA, sie wollen sich doch nicht strafbar machen oder?"
Else
End If
End Function

Dann in irgendeine Zelle folgenden Code schreiben:

=WENN(D15="LK";Frage();"")

Und diese Zelle dann schriftart Weiß

2
oomee 
Fragesteller
 14.10.2015, 08:18
@schmiddi1967

Brauche noch bitte ein Befehl dazu!

Wir hatten zum Schluss folgendes aufgebaut ...

If Antwort = vbNo Then
MsgBox "NANA, sie wollen sich doch nicht strafbar machen oder?"

anschließen muss der Anwender nach dieser MsgBox auf "ok" drücken!

DANN soll allerdings die Zelle "D10" automatisch gelöscht werden.

Wie kann ich das mit einbauen?

0
schmiddi1967  14.10.2015, 13:04
@oomee

Naja, da eine Function keine Makro Codes ausführen kann, das müsste man dann wieder über umwege laufen lassen, würde ich dir raten doch lieber folgenden Code in Deine Tabelle direkt zu setzen:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Antwort
If Not Intersect(Target, Range("D10")) Is Nothing Then
If Target.Value = "LK" Then
Antwort = MsgBox("Dieses Produkt benötigt eine Lebensmittelkühlung! Bitte Bestätigen", 4, "Bestätigung erforderlich")
If Antwort = vbNo Then
MsgBox "NANA, sie wollen sich doch nicht strafbar machen oder?"
Range("D10").ClearContents
Else
End If
End If
End If
End Sub

Dieser überwacht jetzt nicht Zelle D15 sondern die Zelle D10, denn von da kommt ja nach deiner Aussage der Wert.

Oder du musst bis heute Abend warten:))


1
schmiddi1967  14.10.2015, 20:31
@schmiddi1967

Also, in der Function ist es nicht möglich. Da bleibt uns nur diese Möglichkeit. Aber was mir da einfällt, du hast geschrieben das der Wert in D15 aus einem Sverweis kommt, dann steht in D10 ja auch nicht direkt LK drin oder? Wenn ich das richtig verstehe steht in D10 ja was anderes und in D15 der Sverweis.

Wenn das der Fall ist müssen wir das mit diesem Code direkt in der Tabelle machen. Hier hat der Anwender jetzt noch einmal die Möglichkeit doch noch die Bestätigung mit Ja zu beantworten :))

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$15" And Target.Value = "LK" Then
Msg = "Dieses Produkt benötigt eine Lebensmittelkühlung! Bitte Bestätigen"
Ans = MsgBox(Msg, vbQuestion + vbYesNo)
Select Case Ans
Case vbYes
Cancel = True
Case vbNo
Msg = "NAJA, wollen Sie wirklich Abrechen?"
Ans = MsgBox(Msg, vbQuestion + vbYesNo)
Select Case Ans
Case vbYes
MsgBox "OK, die Eingabe wird jetzt zurückgesetzt"
Range("D10").ClearContents
Case vbNo
Msg = "OK, wollen Sie jetzt Bestätigen das dieses Produkt eine Lebensmittelkühlung benötigt?"
Ans = MsgBox(Msg, vbQuestion + vbYesNo)
Select Case Ans
Case vbYes
Cancel = True
Case vbNo
MsgBox "Ich werde das ganze hier jetzt Abrechen und die Eingaben zurücksetzen"
Range("D10").ClearContents
End Select
End Select
End Select
End If
End Sub

Hilft dir das so weiter?

0
schmiddi1967  14.10.2015, 22:36
@schmiddi1967

Ha das geht doch nicht. Sorry aber ich habe dafür Heute keine Zeit mehr. Wenn ich morgen Zeit habe schaue ich mir das gerne nochmal an.

Es gebe eventuell eine Möglichkeit ein SVERWEIS_Vlookup in VBA einzubauen welches den Verweis dann als Text in D15 ablegt, damit könnte man dann arbeiten. Dafür müsste man aber genau wissen wo und in welchem Bereich deine SVERWEIS abfage läuft.

Sorry das ich nicht gleich helfen konnte, jetzt habe ich leider keine Zeit mehr. Morgen Abend werde ich mich da mal ran machen wenn dir das reicht?

0
oomee 
Fragesteller
 15.10.2015, 10:52
@schmiddi1967

Ich glaube ich muss diese Funktion weg lassen, da mehrere Zellen habe und es zu kompliziert wird. Danke trotzdem!

0
schmiddi1967  15.10.2015, 19:39

oki doki, wenn das doch mal weiter gehen sollte einfach Fragen. Ich bin ja nicht der einzige hier der in der Lage ist die zu helfen :))

0

Den Sinn hinterfrage ich mal nicht, aber die 1:1-Umsetzung sieht so aus:

Sub MsgBoxSpecial()
  If Range("D15").Value = "LK" Then
    If MsgBox("Ja oder nein?", vbYesNo + vbDefaultButton1, "Ja-Nein-Frage") = vbYes Then
      Exit Sub
    Else
      MsgBox "Beliebiger Text"
      Exit Sub
    End If
  End If
End Sub
oomee 
Fragesteller
 13.10.2015, 14:29

Suboptimierer, es würde ewig dauern dir den Sinn zu erklären... lassen wir es lieber ;-) Danke für die schnelle Antwort

1
Suboptimierer  13.10.2015, 14:31
@oomee

Okey, wenn dir damit geholfen ist, dann hake ich auch nicht nach. ;-)

0
Iamiam  13.10.2015, 18:11
@Suboptimierer

DH! auf die Idee, VbYesNo etc auf diese Art und Weise ohne Variable auszuwerten, bin ich noch nicht gekommen!

Andererseits würde ich hier die einzeilige if-then Variante (ohne Else und End if) verwenden, die Aktion ist ja mit nur wenigen und weiters unbedingt aufeinander folgenden Befehlen auszuführen, die mit : aneinandergehängt werden können.

1
Suboptimierer  14.10.2015, 08:01
@Iamiam

Jepp, es gibt Optimierungspotenzial. 
Ich traue mich jedoch nicht, zum Beispiel die Exit Subs dem Fragesteller abzusprechen, weil ich den Kontext nicht kenne.

So hat der Fragesteller noch etwas zum Basteln. Dadurch erschließt sich einem oft einiges.

1
Iamiam  14.10.2015, 12:14
@Suboptimierer

bei der einzeiligen Variante können weitere Befehle. mit jeweils Doppelpunkt, hier als :Exit Sub angehängt werden!

es scheint so zu sein, dass die Syntax mit Zeilenumbruch nach then die Normalvariante, ohne Zeilenumbruch die einzeilige Variante aufruft.

0