Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Application.CountA(Range("K6:K36")) > 0 Then
If Len(Range("K3")) < 6 Then
Beep
MsgBox "Bitte Kostenträger oder Kostenstelle richtig angeben!"
Cancel = True
End If
Else
'Im Bereich K6:K36 sind alle Zellen leer
'Speichern ist dann wohl erlaubt ?
End If
End Sub
Gruß, NoNet
So etwas hatte ich schon geahnt,...
Luc:-?
...NoNet,
denn wie kommt die Susi sonst ausgerechnet auf Cancel?! Da hat sie wohl irgendwann irgendwo etwas ziemlich missverstanden, wofür es ja noch andere Anzeichen gab. In der Klärung des Allgemeinen ging mir dann das Spezielle verloren... ;-) Bei deinem Vorschlag ist's übrigens umgekehrt, so dass Suse dann wohl beides irgendwie kombinieren müsste. Hoffentlich gelingt ihr das...!
Gruß Luc :-?
AW: So etwas hatte ich schon geahnt,...
Susanne
Hallo Luc, hallo NoNet,
erstmal danke für eure Antworten! Mein Code sah dem von NoNet schon mal verdammt ähnlich ;-) (steht in den Beispielen), leider bin ich zu blöd den aufzurufen. In der Liste der Makros taucht dieses Makro nicht auf. Ansonsten trifft das Makro schon genau das, was ich brauche, nur zusätzlich noch für L6:L36 und L3 usw. Muss ich bei "Else" noch was schreiben? Speichern soll erlaubt sein, wenn die Zellen keinen Wert enthalten oder in Zeile 3 eine richtige Zahl eingegeben ist.
Danke nochmal für eure Hilfe,
liebe Grüße,
Susanne
Nee, dann wird gespeichert,...
Luc:-?
...Susanne!
Der Assi zeigt die Proz natürlich nicht an, denn es handelt sich hier um eine Behandlungsroutine für ein automatisch ausgelöstes Ereignis (unbedingt in VBE-Hilfe nachlesen!) der Arbeitsmappe. Das wird abgearbeitet, wenn du auf Speichern klickst. Wenn die Kriterien für fehlerhafte Ausfüllung erfüllt sind, wird das Speichern abgebrochen (Cancel = True bewirkt das; deshalb heißt die Proz auch BeforeSave !). Folglich muss die Proz auch in das Dokument-Klassenmodul der Arbeitsmappe DieseArbeitsmappe eingefügt wdn (die stehen da übrigens schon alle im rechten Dropdown, wenn du im linken Workbook auswählst.
Gruß Luc :-?
PS: Antworte rechtzeitiger, dann meldet sich ggf auch NoNet... ;-)
Funktioniert nicht :-(
Susanne
Hallo Luc,
war einen Tag nicht auf Arbeit, deswegen die verspätete Antwort. Den Code von NoNet habe ich in das Klassenmodul meiner Arbeitsmappe eingefügt, aber es passiert immer noch nichts. Wenn ich in den Zellen K6 bis K36 etwas eintrage, das Feld K3 leerlasse und auf Speichern gehe, speichert Excel ganz normal. Was mache ich falsch?
Danke, dass du mich noch nicht aufgegeben hast ;-)
AW: Funktioniert nicht
Susanne
Ok, hab jetzt gesehen, dass ich den Code zwar in einem Klassenmodul hatte, aber nicht in "Diese Arbeitsmappe". hab das jetzt geändert und jetzt passiert genau das Gegenteil. Die MsgBox kommt immer und man kann nicht speichern (wenn Zelle K3 leer), obwohl im Bereich K6:K36 nichts steht. (Außer Formen, da ist wahrscheinlich der Knackpunkt). Wie kann man beim Code von NoNet einbauen, dass nur auf Werte geprüft wird?
Danke noch mal und liebe Grüße,
Susanne
Indem du den entsprechenden Teil aus...
Luc:-?
...meinem einfügst, Susanne,
also das mit ...HasFormula.
Gruß Luc :-?
AW: Indem du den entsprechenden Teil aus...
Susanne
Hallo Luc,
kann sein, dass ich deinen code falsch verstehe, aber ich glaube er trifft nicht das, was ich brauche. Ich versuch mal zu beschreiben, was ich genau brauche: In den Zellen stehen (anfangs immer) Formeln. Aber nur wenn (durch Befüllen anderer Zellen) auch ein (Zeit-)Wert im Bereich K6:K36 angezeigt wird oder die Formeln mit einem absoluten Wert überschrieben werden, soll eine Eingabe in K3 zwingend sein. Solange nur die Formeln in den Zellen stehen, sollen diese praktisch als "leer" gelten und die Zelle K3 kann auch leer bleiben.
Ist es das, was dein Code aussagt? Sorry, wenn ich deine Nerven strapaziere, bin dir sehr dankbar für deine Hilfe!
Liebe Grüße,
Susanne
Nach deiner Erläuterung habe ich das mal...
Luc:-?
...umgestellt, Susanne,
jetzt wird nur gespeichert, wenn mind 1 Zelle im Bereich entweder leer ist oder keinen Zeitwert liefert bzw alle Zellen Zeitwerte liefern und K3 ≥ 6 Zeichen lang ist.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim c As Range, d As Boolean
For Each c In Range("K6:K36")
d = c "" And IsDate(c)
If Not d Then Exit For
Next c
If d Then
If Len(Range("K3"))
Das Ganze wird nur für das jeweils aktuelle Blatt geprüft. Der Zyklus für die anderen Blätter müsste dann wohl noch dazukommen, ebenso wie die Bereichserweiterung. Wenn mir klar wäre, ob da auch K3 oder eher die 3.Zeile der jeweiligen Spalte geprüft wdn soll, hätte ich das gleich mitberücksichtigt. Außerdem kann es ja sein, dass schon 1 vorhandener Zeitwert (0 ist auch einer!) für die Speicherung reicht, dann müsste das Not vor d entfallen. Das wurde nicht ganz klar...
Falls aber stets gespeichert wdn darf, wenn im Bereich (noch) Fmln enthalten sind, muss sich d so ergeben: d = c "" And Not c.HasFormula
Gruß Luc :-?
das sieht gut aus
savoy84
Hallo Luc,
ich glaub, damit wird es klappen, werde es gleich morgen auf Arbeit ausprobieren. Jetzt schon mal einen riesen Dank an dich für deine Mühe!
Liebe Grüße,
Susanne
Na dann viel Erfolg + guten WoStart! Gruß owT
Luc:-?
:-?
|