Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1504to1508
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

Datum ergänzen

Datum ergänzen
12.07.2016 20:28:45
Andreas
Hi Forum,
ich möchte ein Datum automatisch generieren lassen.
Auf einem Tabellenblatt steht in Zelle K1 der Erste eines beliebigen Monats (z.B. 01.06.2016).
Wenn ich jetzt in Spalte I die Zahl eines Tages eingebe (z.B.4), dann soll diese Zahl automatisch um Monat und Jahr aus der Zelle K1 ergänzt werden, wenn ich Enter drücke.
Geht das?
Danke für Hilfen... Andreas

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datum ergänzen
13.07.2016 00:19:46
Werner
Hallo Andreas,
Rechtsklick auf den Tabellenblattreiter des Tabellenblattes, auf dem sich das auswirken soll, Code anzeigen, Code rechts ins Codefenster kopieren.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 9 Then
If Not Target Is Nothing Then
If IsDate(Range("K1")) Then
Application.EnableEvents = False
Target = Range("K1") + Target - 1
End If
End If
End If
Application.EnableEvents = True
End Sub
Gruß Werner
Alles gelöst! Danke!!
15.07.2016 17:21:41
Andreas
Ihr seid die Helden der Arbeit !!!
Danke für Eure Hilfe.
AW: Gerne u. Danke für die Rückmeldung. o.w.T
15.07.2016 19:50:40
Werner

AW: Datum ergänzen
13.07.2016 01:12:23
Werner
Hallo Andreas,
nimm den Code hier, beim anderen hatte ich vergessen den Fehler bei Mehrfachselektion abzufangen.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 9 Then
If Target.Count > 1 Then Exit Sub
If Not Target Is Nothing Then
If IsDate(Range("K1")) Then
Application.EnableEvents = False
Target = Range("K1") + Target - 1
End If
End If
End If
Application.EnableEvents = True
End Sub
Gruß Werner

Anzeige
AW: und noch was vergessen...
13.07.2016 03:38:34
Werner
Hallo Andreas,
..und zwar die Prüfung der Spalte I auf Zahl.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 9 Then
If Target.Count > 1 Then Exit Sub
If Not Target Is Nothing Then
If IsNumeric(Target) Then
If IsDate(Range("K1")) Then
Application.EnableEvents = False
Target = Range("K1") + Target - 1
End If
End If
End If
End If
Application.EnableEvents = True
End Sub
Gruß Werner

AW: und noch was vergessen...
13.07.2016 10:33:28
Niclaus
Hallo Werner
Ich würde die Prüfung der Spalte I auf Zahl ergänzen mit der Prüfung, ob I auch ganzzahlig ist:
If IsNumeric(Target) Then
If Target = CInt(Target) Then
Viele Grüsse
Niclaus

Anzeige
AW: hoffentlich letzte Version
13.07.2016 13:13:43
Werner
Hallo Nicolaus,
danke für den Hinweis. War wohl der Nachtschicht geschuldet. Zusätzlich habe ich jetzt noch das zellformat auf Standard gesetzt. Hatte festgestellt, dass es dann nicht mehr richtig funktioniert, wenn in einer Zelle in Spalte I schon ein Datum drin steht, Zellformat ist ja dann automatisch Datum. Gibt man jetzt erneut eine Zahl ein dann kommt als Ergebnis der richtige Tag, der richtige Monat aber als Jahr 1900 heraus. Mit dem Umstellen auf Zellformat Standard wàhren dem Makrolauf scheint es zu klappen.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 9 Then
If Target.Count > 1 Then Exit Sub
If Not Target Is Nothing Then
If IsNumeric(Target) Then Target.NumberFormat = "General"
If Target = CInt(Target) Then
If IsDate(Range("K1")) Then
Application.EnableEvents = False
Target = Range("K1") + Target - 1
End If
End If
End If
End If
Application.EnableEvents = True
End Sub
Gruß Werner

Anzeige
AW: hoffentlich letzte Version
13.07.2016 16:29:58
Niclaus
Hallo Werner

Umstellen auf Zellformat Standard 
Tolle Lösung! - Dein Makro funktioniert nun bestens, wenn die Eingabe in Spalte I eine ganzzahlige Zahl ist. Probleme habe ich, wenn die Eingabe aus alphanumerischen Zeichen besteht oder nicht nur ein ganzzahliger Wert ist, sondern z. B. ein Datum. So etwas passiert mir selber immer wieder.
Ich habe da folgendes gebastelt:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next    ' sehr un-optimal!!
datV = Range("K1")
If Not IsDate(datV) Then
MsgBox "K1 ist kein Datumswert!"
Exit Sub
End If
datF = "#NV"
If Target.Column = 9 Then
If Target.Count > 1 Then Exit Sub
Target.NumberFormat = "General"
If Not Target Is Nothing Then
If IsNumeric(Target) Then
If Target  Month(datV) Then datN = datF
Target = datN
Else: Target = datF
End If
Else: Target = datF
End If
Else: Target = datF
End If
End If
End If
Application.EnableEvents = True
End Sub

Meine Idee dabei: Falsch-Eingaben wie Buchstaben oder Zahlen, die einen andern Monat bewirken als in C1, sollen ein #NV auslösen.
Was mich stört, ist "On Error Resume Next" - höchst unprofessionell! - Ich weiss nicht, wie ich die Fehlermeldungen sonst abfangen kann. Muss man "Application.EnableEvents = False" wo anders einsetzen im Makro? Weisst Du dazu eine Lösung?
Auch der zweimalige Auftritt von "Else: Target = datF" gefällt mir nicht.
Viele Grüsse
Niclaus

Anzeige
AW: hoffentlich letzte Version
13.07.2016 19:03:57
Andreas
So, da bin ich nun auch wieder. Ich kann immer erst nach der Arbeit wieder ran.
Hier hat sich ja einiges getan. Danke Euch schon mal für Eure Mühen :-)
Allerdings wird bei mir in eine in Spalte I eingegebene Zahl immer um Monat 01 und jahr 1900 ergänzt, egal, ob ich Werners oder Nicolaus letzte Version benutze und egal, was in K1 steht
Vielleicht ist eines der folgenden "Dinge" schuld?:
- Die Tabelle hat einen Kopfbereich, wo auch in Spalte I was völlig anderes drin steht
- Beim Durchlauf des Makros beschwert er sich über einen mehrdeutigen Namen "Worksheet_Change". Ich habe den in "Worksheet_Change1" umbenannt.
Danke fürs weiterschubsen... Andreas

Anzeige
AW: hoffentlich letzte Version
13.07.2016 19:17:21
Werner
Hallo Andreas,
an einem Kopfbereich/Überschrift in Spalte I liegt es ganz sicher nicht.
Mehrdeutiger Name: Dann hast du zwei mal ein Worksheet_Change Ereignis in ein und demselben Worksheet und das ist nicht zulässig/möglich.
Eines davon dann einfach umzubenennen ist sinnlos, Excel kann mit dem Umbenannten nichts anfangen.
Am besten stellst du mal deine Datei hier ein. Aber heute schaue ich mir das nicht mehr an.
Gruß Werner

AW: hoffentlich letzte Version
13.07.2016 19:23:59
Andreas
Gute Idee. Datei ist hier: https://www.herber.de/bbs/user/106994.xlsm
ist noch im Rohbau, aber schon in Grundzügen bedienbar

Anzeige
AW: hoffentlich letzte Version
13.07.2016 19:30:17
Andreas
Habe jetzt das andere Worksheet_Change-Ereignis umbenannt. damit läuft dieses Makro einwandfrei, aber das andere nicht mehr. Ich brauche aber beide :-/

AW: hoffentlich letzte Version
13.07.2016 20:39:50
Werner
Hallo Andreas,
falls du nochmal vorbei schaust. Stell doch mal nur deinen Code auch noch ein. Excel mit Makro kann ich gerade nicht öffnen in Ermangelung eines PC, sitze am Tablet. Könnte also nur drüber schauen wenn du den Code auch noch einstellen würdest.
Gruß Werner

AW: hoffentlich letzte Version
13.07.2016 22:09:04
Niclaus
Grüezi Andreas
Du musst die beiden Worksheet_Change-Ereignisse in eines verpacken, indem Du im Makro die Bereiche definierst. Im Makro musst Du sie bei Set Bereich1 / Bereich2 genau definieren

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finis    ' sehr un-optimal!!
Dim Bereich1 As Range, Bereich2 As Range
Set Bereich1 = Range("i6:i500")
Set Bereich2 = Range("b6:b500")
If Not Intersect(Target, Bereich1) Is Nothing Then
datV = Range("K1")
datF = "#NV"
If Not IsDate(datV) Then
MsgBox "K1 ist kein Datumswert!"
Exit Sub
End If
If Target.Count > 1 Then Exit Sub
Target.NumberFormat = "General"
If Not Target Is Nothing Then
If IsNumeric(Target) Then
If Target = CInt(Target) Then
Application.EnableEvents = False
datN = DateSerial(Year(datV), Month(datV), Target)
If Month(datN)  Month(datV) Then datN = datF
Target = datN
Else: Target = datF
End If
Else: Target = datF
End If
End If
End If
If Not Intersect(Target, Bereich2) Is Nothing Then
If Target.Value = "v" Then Target.Value = "hallo"
End If
finis:
Application.EnableEvents = True
End Sub
Den Makro-Teil für die Spalte B habe ich am Ende des Makros nur angedeutet, da musst Du Dein Makro "automatische Dezimalstellen in Spalte B und C" einfügen. Das sollte kein Problem sein.
@Werner
Meine Fehler-Behandlung ist katastrophal! Ich benutze das oben aufgeführte Makro. Wenn ich nun in Spalte i während einer Excel-Session zweimal einen "falschen" Wert eingebe, wird mein Excel 2010 heruntergefahren (ohne erkenntnisbringenden Hinweis). Wenn ich den falschen Wert während einer Session nur einmal eingebe, wird kein Fehler produziert. - Seltsam! Zählt Excel irgendwo die Anzahl Fehler? - In der Version des Makros von heute Nachmittag ist dieser Fehler nicht aufgetreten.
Viele Grüsse Niclaus

Anzeige
AW: hoffentlich letzte Version
13.07.2016 22:14:12
Niclaus
Wie kriegt man das hin, eine Antwort zweimal zu senden?
Und wie kann man eine der beiden löschen?
Niclaus

AW: hoffentlich letzte Version
13.07.2016 22:09:38
Niclaus
Grüezi Andreas
Du musst die beiden Worksheet_Change-Ereignisse in eines verpacken, indem Du im Makro die Bereiche definierst. Im Makro musst Du sie bei Set Bereich1 / Bereich2 genau definieren

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finis    ' sehr un-optimal!!
Dim Bereich1 As Range, Bereich2 As Range
Set Bereich1 = Range("i6:i500")
Set Bereich2 = Range("b6:b500")
If Not Intersect(Target, Bereich1) Is Nothing Then
datV = Range("K1")
datF = "#NV"
If Not IsDate(datV) Then
MsgBox "K1 ist kein Datumswert!"
Exit Sub
End If
If Target.Count > 1 Then Exit Sub
Target.NumberFormat = "General"
If Not Target Is Nothing Then
If IsNumeric(Target) Then
If Target = CInt(Target) Then
Application.EnableEvents = False
datN = DateSerial(Year(datV), Month(datV), Target)
If Month(datN)  Month(datV) Then datN = datF
Target = datN
Else: Target = datF
End If
Else: Target = datF
End If
End If
End If
If Not Intersect(Target, Bereich2) Is Nothing Then
If Target.Value = "v" Then Target.Value = "hallo"
End If
finis:
Application.EnableEvents = True
End Sub
Den Makro-Teil für die Spalte B habe ich am Ende des Makros nur angedeutet, da musst Du Dein Makro "automatische Dezimalstellen in Spalte B und C" einfügen. Das sollte kein Problem sein.
@Werner
Meine Fehler-Behandlung ist katastrophal! Ich benutze das oben aufgeführte Makro. Wenn ich nun in Spalte i während einer Excel-Session zweimal einen "falschen" Wert eingebe, wird mein Excel 2010 heruntergefahren (ohne erkenntnisbringenden Hinweis). Wenn ich den falschen Wert während einer Session nur einmal eingebe, wird kein Fehler produziert. - Seltsam! Zählt Excel irgendwo die Anzahl Fehler? - In der Version des Makros von heute Nachmittag ist dieser Fehler nicht aufgetreten.
Viele Grüsse Niclaus

Anzeige
AW: hoffentlich letzte Version
14.07.2016 10:44:55
Werner
Hallo Nicolaus,
ich habe dein Makro jetzt mal getestet. Dazu habe ich dies Version verwendet:
Private Sub Worksheet_Change(ByVal Target As Range)
' Automatisches generieren eines Datums bei Eingabe einer Zahl in Spalte I '
'On Error Resume Next    ' sehr un-optimal!!
datV = Range("K1")
If Not IsDate(datV) Then
MsgBox "Das ist kein Datumswert!"
Exit Sub
End If
datF = ""
If Target.Column = 9 Then
If Target.Count > 1 Then Exit Sub
Target.NumberFormat = "General"
If Not Target Is Nothing Then
If IsNumeric(Target) Then
If Target  Month(datV) Then datN = datF
Target = datN
Else: Target = datF
End If
Else: Target = datF
End If
Else: Target = datF
End If
End If
End If
Application.EnableEvents = True
End Sub
Die Zeile mit #NV habe ich raus genommen und das On Error auskommentiert. So wie ich das sehe, ist beides nicht notwendig. ich konnte, egal was ich in Spalte I eingegeben habe keinen Fehler provozieren.
Das mehrfache Else sehe ich persönlich nur als ein kosmetisches Problem. Ob sich das auch eleganter lösen lässt kann ich dir nicht sagen, dazu bin ich in VBA nicht fit genug.
Das Problem von Andreas bezüglich den zwei Worksheet_Change Events hast du ja gelöst, deshalb schreibe ich da nicht noch einmal etwas dazu.
Gruß Werner

Anzeige
AW: hoffentlich letzte Version
14.07.2016 19:10:23
Andreas
Hi Werner und Niclaus,
Habs dank eurer Hilfe jetzt ganz gut hingebastelt bekommen.
Das Einzige, was nicht funktioniert ist die Datumsgeneration (Eingangsfrage) wenn der Blattschutz eingeschaltet ist. Monat ist dann immer 01, Jahr 1900.
Hab das File noch mal hochgeladen: https://www.herber.de/bbs/user/107020.xlsm
Der Code ist bis jetzt so:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finis    ' sehr un-optimal!!
Dim Bereich1 As Range, Bereich2 As Range
Set Bereich1 = Range("i6:i500")
Set Bereich2 = Range("b6:c500")
If Not Intersect(Target, Bereich1) Is Nothing Then
datV = Range("K1")
datF = ""
If Not IsDate(datV) Then
MsgBox "K1 ist kein Datumswert!"
Exit Sub
End If
If Target.Count > 1 Then Exit Sub
Target.NumberFormat = "General"
If Not Target Is Nothing Then
If IsNumeric(Target) Then
If Target = CInt(Target) Then
Application.EnableEvents = False
datN = DateSerial(Year(datV), Month(datV), Target)
If Month(datN)  Month(datV) Then datN = datF
Target = datN
Else: Target = datF
End If
Else: Target = datF
End If
End If
End If
If Not Intersect(Target, Bereich2) Is Nothing Then
' automatische Dezimalstellen in Spalte B und C '
Dim Eingabebereich As Range
Set Eingabebereich = Range("b6:c500")
Application.EnableEvents = False
If Target.Count = 1 Then
If Not Intersect(Target, Eingabebereich) Is Nothing Then
If Application.WorksheetFunction.IsNumber(Target) Then
If Val(Target.Value) = Target.Value Then
Target.Value = Target.Value / 100
End If
End If
End If
End If
End If
finis:
Application.EnableEvents = True
End Sub

AW: hoffentlich letzte Version
14.07.2016 21:11:33
Niclaus
Hallo Andreas
Normalerweise ist also die Tabelle geschützt? - In der Datei, die Du hochgeladen hast, war das nicht der Fall! - Du musst Dein Makro ergänzen mit "ActiveSheet.Unprotect" und mit
"ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True". Siehe unten.
Ich hoffe, das war's!
Viele Grüsse Niclaus

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo finis    ' sehr un-optimal!!
Dim Bereich1 As Range, Bereich2 As Range
Set Bereich1 = Range("i6:i500")
Set Bereich2 = Range("b6:c500")
If Not Intersect(Target, Bereich1) Is Nothing Then
ActiveSheet.Unprotect
datV = Range("K1")
datF = ""
If Not IsDate(datV) Then
MsgBox "K1 ist kein Datumswert!"
Exit Sub
End If
If Target.Count > 1 Then Exit Sub
Target.NumberFormat = "General"
If Not Target Is Nothing Then
If IsNumeric(Target) Then
If Target = CInt(Target) Then
Application.EnableEvents = False
datN = DateSerial(Year(datV), Month(datV), Target)
If Month(datN)  Month(datV) Then datN = datF
Target = datN
Else: Target = datF
End If
Else: Target = datF
End If
End If
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
If Not Intersect(Target, Bereich2) Is Nothing Then
usw.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige