Anzeige
Archiv - Navigation
164to168
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
164to168
164to168
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Abfrage vor Wertübernahme in Zelle

Abfrage vor Wertübernahme in Zelle
09.10.2002 12:45:20
edi
Wie kann ich verhindern, daß beim Abbruch einer Message der Wert den ich zuvor in die Zelle eingetragen hab übernommen wird. (Es sollte der alte wert wieder erscheinen).

Oder anders ausgedrückt, kann ich eine Abfrage (MsgBox) machen befor ich einen neuen Wert in einer Zelle übernehme?

Kann mir jemand eine Tip geben.

Anbei folgt ein Auszug aus meinem Programm. Beim Ändern der Kalenderwoche in einer bestimmten Zelle soll eine Aktion ausgeführt werden andernfalls nicht. Beim Abbruch soll zudem die alte KW statt der neuen in der Zelle stehen.

Dim mldg$, title$
Dim ergebnis%, stil%


mldg = "Beim Ändern der KW werden die Stundenwerte auf Null gesetzt" _
& vbLf & "Vorher Daten übertragen!"
stil = vbCritical + vbOKCancel
title = "A C H T U N G ! ! !"
ergebnis = MsgBox(mldg, stil, title)

if ergebnis = vbok then
'Aktion ausführen (Stundenwerte auf 0 setzen)
else
'Abbruch (und alten Wert in die Ausgangszelle der KW schreiben?!)
end if

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: Abfrage vor Wertübernahme in Zelle
09.10.2002 13:01:26
MAlexander
... indem Du den Wert erst dann einstellst, wenn alles seine Richtigkeit hat ....
In Deinem Falle wäre das in dem Block "Aktion ausführen"

MAlexander

Leider Nein
09.10.2002 13:52:01
edi
Der neue Wert wird momentan in jedem Fall übernommen.

Ich hab den Programmausschnitt in einer Private Sub worksheet_Change (....) damit wird eine Zelle überwacht.

Mein Target ist die Zelle B2. Wenn in dieser Zelle die Kalenderwoche von Hand geändert wird, soll erst die Abfrage kommen und dann bei Ok der neue Wert; bei Cancel der alte Wert für die Kalenderwoche in der Zelle B2 stehen.

Der Wert kommt also nicht aus VB sondern soll von Hand eingetragen werden.

Wie kann ich mir den Wert vor der Eingabe merken und diesen im Block "Abruch" zurückschreiben????

Anzeige
Re: Abfrage vor Wertübernahme in Zelle
09.10.2002 14:05:08
JürgenR
Hallo,

versuche es so:

Gruß
Jürgen

Re: Leider Nein
09.10.2002 14:37:18
MAlexander
Das geht auf jeden Fall.

Im Moment werde ich aber mit so nebensächlichen Dingen wie der Arbeit in Anspruch genommen.

Ich komme heute noch darauf zurück.

MAlexander

Re: Leider Nein
09.10.2002 18:54:45
MAlexander
Nu geit dat los.
So, versprochen ist versprochen, obwohl es unsinnig ist zu schreiben, wenn schon eine Antwort vorliegt, was ich aber nicht
überprüfen kann, da ich zur Zeit in der U-Bahn sitze.

Ich schreibe aus MEINER Sicht - frage 10 Programmierer und Du kriegst 10 verschiedene Sichten der Sache.

Bekanntlich führen viele Wege nach Rom - und so auch hier.
Ich hoffe Dir nicht auf den Schlips zu treten, aber ich beschreibe mal eine einfacher nachvollziehbare Variante als die mit
Classes.

Zunächst gibst Du der Eingabezelle einen Namen: z.B. Eingabe
Anschließend definierst Du ein Workbook_Open-Ereignis in "DieseArbeitsmappe":

Was hier an Routinen steht, ist nur skizziert !
Die Details mußt Du selber einbauen. Ich klimpere hier alles über einen Texteditor rein.

Es geht hier nur ums Prinzip.

Option Explicit
Public Eingabewert as Byte
Private Sub workbook_open()
Eingabewert = Range("Eingabe")
End Sub

Dies läuft ab, wenn das Workbook geöffnet wird und schreibt den Inhalt der definierten Zelle in die Public-Byte-Variable
"Eingabewert".

Wundere Dich nicht, daß ich von vornherein bestimme, daß Eingabewert vom Type Byte ist.
Du als Programmierer hast dafür Sorge zu tragen, daß in die Variable nix anderes reinkommt als ein Byte-Wert.
Aber Du wirst gleich sehen, daß das wirklich funktioniert.

Variants sind edel - aber problematisch

Versuche immer, klar und deutlich zu definieren.
Auch in unserem Beispiel solltest Du Eingabewert als Byte definieren (bei 1 -52,53 völlig unproblematisch)..
Den ganzen Schwachsinn, den ein User eingeben kann, muß man halt vorher prüfen, bevor man ihn in die Variable schreibt.

Mit der obigen Routine kennst Du den Ursprungswert, also den vor JEDER Änderung.

Bleibt die Frage: wie stelle ich fest, ob dieser Wert geändert wurde ?
Das geht über das Worksheet_Change-Ereignis (in dem betreffenden Blatt-Code)

Diesen Teil habe ich heute schon erwähnt:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Set rng = Application.Intersect(Target, ActiveSheet.Range("Eingabe"))
If rng Is Nothing Then exit sub
'Hier nun Deine Plausis
' auf Numerisch
' ggf. auf einen Wertebereich (Eingabe >=1 UND Eingabe <=53)
' etc.
if not MonatsAuswahlOK(Target) then
ActiveSheet.Range("Eingabe") = Eingabewert
else
EingabeWert = ActiveSheet.range("Eingabe")
endif
End If
Set rng = Nothing
End Sub

Wenn rng nothing (also nix) ist, dann gibt es keine Schnittmenge zwischen Target (also, wo was geändert wurde) und der
geänderten Zelle.
Denk an die Mengenlehre: die Schnittmenge gehört gemeinsam zu den betroffenen Mengen und bei nur zwei
ein-elementigen Mengen ist die Schnittmenge das Element selbst; wenn das nix ist, dann ist diese Zelle auch nicht geändert
worden - alles klar ????
Das ist die Funktion von Intersect.

Also: ist rng nothing, dann fertig

Jetzt kommt Dein Problem:
Der User gibt HUGO ein.
Offensichtlich eine falsche Eingabe.
Diese ganzen Prüfungen, die Du vornehmen mußt (numerisch, evtl. Länge), würde ich in einer Funktion zusammenfassen,
die jeweils das richtige Ergebnis zurückliefert; so z.B.:

Function MonatsAuswahlOK(byval EingabeMonat as range) as boolean

MonatsAuswahlOK = false

Wenn (EingabeMonat = Schtring) then
msgbox "Nur Zahlen bitte"
exit Function
endif

etc.

MonatsauswahlOK = true

end function

Die Funktion geht erstmal davon aus, daß die Eingabe falsch ist.
Erst wenn alle Prüfungen durchlaufen sind und er nicht vorher über exit function ausgestiegen ist, geht der Funktionswert auf
true.

In der aufrufenden Routine geht es dann weiter:
Ist das Ergebnis dieser Prüfung false, dann setzt er den GLOBALEN "Eingabewert" (also den letzten vor der Änderung) wieder
in die Zelle.
Handelte es sich bei der Eingabe des Users allerdings um einen korrekten Wert, dann wird der neue Wert als vorläufig letzter
Wert in "Eingabewert" festgehalten.

Jetzt ist der Kreis aber geschlossen: selbst wenn der User ganz zum Schluß (also kurz vor dem Schließen des Workbooks)
irgend einen Blödsinn in diese Zelle schreibt, wird immer ein korrekter Wert in dieser Zelle stehen.

Du mußt nur dafür sorgen, daß in "Eingabewert" einmal ein korrekter Wert steht, also in Deinem Falle NICHT "Hugo".
Sollte Dir aber nicht schwer fallen.

Ich hoffe, daß Du mit diesen Zeilen etwas anfangen kannst.
Wenn nicht: NACHFRAGEN - max@maxgalle.de

Bis dann

MAlexander




Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige