Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1108to1112
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
Inhaltsverzeichnis

Eintrag prüfem

Eintrag prüfem
Susanne
Hallo Forum,
komme bei einer Sache einfach nicht weiter. Habe folgenen Code:

Sub SpeichernVerhindern()
Dim j As Integer
Dim Cancel As Boolean
For j = 5 To Workbooks.Count
If Range("K6:K36").Value = "" Then Exit Sub
If Len(Range("K3")) 

Es soll geprüft werden, wenn im Bereich K6:K36 ein Eintrag ist, ob in K3 eine Kostenstelle oder ein Kostenträger angegeben ist (und die Nummer muss mindestens 6 Stellen haben). Wenn nicht soll die MSGBox ausgegeben werden und Speichern nicht möglich sein. Wenn ich jetzt in dem Bereich etwas eintrage und K3 leer lasse passiert gar nichts :-(. Speichern geht auch normal. Der Debugger zeigt keinen Fehler an. Kann mir da jemand helfen?
Vielen Dank im Voraus!
Susanne
So wie du das geschrieben hast,...
19.10.2009 17:20:09
Luc:-?
...Susanne,
passiert Folgendes:
Für jedes Blatt wird Range("K6:K36").Value auf leer geprüft. Das kann so schon mal kaum fkt, weil ein Feld keinen einzelnen Wert liefert, sondern eben ein Wertefeld — das müsste Zelle für Zelle geprüft wdn. Deshalb wird hier fortgesetzt und es piept, wenn Len(Range("K3")) ist. Das ist alles. Anschließend kommt auf jeden Fall, auch, wenn es nicht piept, die MsgBox. Anschließend wird immer Cancel = True gesetzt.
Wenn du das nicht so haben willst, musst du alles, was von einer Bedingung abhängig ist, _ auch der Bedingungsabfrage zuordnen. Das macht man mit...

If bedingung Then
aktion1
Else: aktion2
End If
...in separaten Zeilen oder mit...

If bedingung Then aktion1.1: aktion1.2:...aktion1.n Else aktion2.1: aktion2.2:...aktion2.m
...in einer Zeile.
Gruß Luc :-?
Anzeige
AW: So wie du das geschrieben hast,...
20.10.2009 07:56:33
Susanne
Hallo Luc,
schnonmal danke für deine Hinweise, dass war mir so nicht bewusst. Das heißt ich muss die Aktionen mit _ am Ende der Zeile verbinden (da sie nicht in eine Zeile passen), oder? Wenn ich das mache, kommt bei der MsgBox immer Anweisungsende erwartet.
Wie kann ich für den Bereich K6:K36 Zelle für Zelle prüfen, ob sie leer ist, ohne dass es zu umfangreich wird? Das Problem ist nämlich, dass ich das für die Spalten K bis AN machen muss, hab hier K nur als Beispiel rausgesucht.
Danke für deine Hilfe!
Viele Grüße,
Susanne
Noch eine Anmerkung
20.10.2009 08:11:34
Susanne
Vielleicht sollte ich noch erwähnen, dass in den Zellen Formeln stehen können. Es soll nur geprüft werden, ob kein Wert drinsteht.
Anzeige
So sollte es funktionieren,...
21.10.2009 04:29:34
Luc:-?
...Susanne,
wenn ich dich richtig verstanden habe...
Sub SpeichernVerhindern()
Dim j As Integer, c As Range
For j = 5 To Workbooks.Count
For Each c In Range("K6:AN36")
If c  "" And Not c.HasFormula Then
If Len(c) 

Dein Cancel habe ich weggelassen, weil du es im BspCode nicht benutzt hast. Ich kann allerdings nur für dich hoffen, dass deine Identifikationskriterien einer unvollständigen Eingabe ausreichend sind...
Außerdem kann die MsgBox so wie hier einfach „weggeklickt" wdn, ohne das eine Eingabe erfolgt. Reicht dir das denn?
Wenn du eine andere Abarbeitungsreihenfolge wünschst, musst du einen weiteren For_Each-(Unter-)Zyklus einbauen (1x für die Spalten und 1x für die darin enthaltenen Zeilenwerte), denn For Each geht wohl zeilenweise vor.
Viel Erfolg! Gruß Luc :-?
Anzeige
Zellinhalte vor Speichern prüfen
21.10.2009 04:58:56
NoNet
Hallo Susanne, hey Luc,
ich habe das so verstanden (Code bitte in Klassenmodul "DieseArbeitsmappe" kpieren !) :
VBA-Code:
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:-?

:-?
Anzeige
So etwas hatte ich schon geahnt,...
21.10.2009 14:57:54
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,...
22.10.2009 08:49:42
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
Anzeige
Nee, dann wird gespeichert,...
23.10.2009 02:43:33
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... ;-)
Anzeige
Funktioniert nicht :-(
23.10.2009 08:54:05
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
23.10.2009 09:56:16
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
Anzeige
Indem du den entsprechenden Teil aus...
23.10.2009 14:51:48
Luc:-?
...meinem einfügst, Susanne,
also das mit ...HasFormula.
Gruß Luc :-?
AW: Indem du den entsprechenden Teil aus...
23.10.2009 15:54:18
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
Anzeige
Nach deiner Erläuterung habe ich das mal...
23.10.2009 18:09:09
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 :-?
Anzeige
das sieht gut aus
25.10.2009 13:13:29
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
25.10.2009 19:15:29
Luc:-?
:-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige