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