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

Automatische Werte befüllen wenn bestimmtes Datum

Automatische Werte befüllen wenn bestimmtes Datum
03.09.2008 13:43:00
Heiderer
Hallo!
Ich habe folgendes Excel-Sheet:
In Spalte A soll mittels VBA ein Datum eingefügt werden, zb. 01.09.2008. In Spalte B soll ein Betrag zb. € 70,00 eingetragen werden. Bezüglich der Spalte B gibt es kein Problem. Es geht nur um die Spalte A.
Ich will nämlich, dass Excel automatisch jedes Monat ab 01. des Monats mir diesen Betrag reinschreibt, aber nur dann, wenn das Datum erreicht ist. Es sollte so aussehen:
A1= 01.09.2008
A2= 01.10.2008
A3= 01.11.2008 usw...
Leider habe ich das nicht ganz geschafft, kann es leider nur für eine einmalige Prüfung machen, die wie folgt aussieht:

Private Sub Workbook_Open()
Const Datum = #9/1/2008# 'MM/TT/JJJJ
If Date >= Datum Then
Worksheets("Tabelle1").Range("A2") = "01.09.2008"
End If
End Sub


Nachdem ich nun nicht vorhabe, in VBA diesen Code für jedes Datum selbst zu erstellen, ergeht nun meine Frage, ob das anders und einfacher auch geht?
Ich hoffe, dass ihr versteht was ich will und hoffe, dass es irgendwer schafft.

29
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Automatische Werte befüllen wenn bestimmtes Datum
03.09.2008 14:38:00
Chris
Servus,
probier's mal so:
Geht aber nur beim Öffnen des Workbooks.

Private Sub Workbook_Open()
Dim dat As Date
dat = DateSerial(Year(Date), Month(Date), 1) ' = Erster des aktuellen Monats
If Date >= dat Then
Dim rSuche  As Range, rFinde As Range
Set rFinde = Sheets("Tabelle1").Range("A:A")
Set rSuche = rFinde.Find(what:=dat, Lookat:=xlWhole, LookIn:=xlValues)
If rSuche Is Nothing Then
If Sheets("Tabelle1").Range("A65536").End(xlUp).Offset(1, 0).Row > 2 Then
Sheets("Tabelle1").Range("A65536").End(xlUp).Offset(1, 0) = dat
Else
Sheets("Tabelle1").Range("A1") = dat
End If
End If
End If
End Sub


Gruß
Chris

Anzeige
AW: Automatische Werte befüllen wenn bestimmtes Datum
03.09.2008 16:35:00
Thomas
danke sehr für die rasche lösung, habs auch gleich probiert, hat am anfang auch toll ausgeschaut, als ich deinen code eingefügt habe, hat er mir aufomatisch den 01.09.2008 in a1 geschrieben
nur als ich das datum auf 01.10. umgestellt habe und das excel-sheet nochmals neu geöffnet habe, hat er mir den wert vom 01.09.2008 auf 01.10.2008 überschrieben, was ich nicht wollte, ich will ja, dass er mir dann in die nächste zeile (sprich a2) den 01.10.2008 schreibt, der wert von a1 mit 01.09.2008 soll stehen bleiben, verstehst du?
ich hoffe, dass du weißt was ich meine und das du es lösen kannst, mit bestem dank jetzt schon
Anzeige
AW: Automatische Werte befüllen wenn bestimmtes Datum
03.09.2008 16:45:57
Thomas
nochmals kurz zur erklärung, was ich eigentlich will:
ich schreibe zB. in a1 den monats ersten hinein, wäre also der 01.09.2008
nun will ich, wenn das aktuelle datum der 01.10. ist, dass er mir nun automatisch in a2 das datum 01.10. hinschreibt, auch wenn ich zb. die datei erst am 03.10. öffne, würde ich die datei überhaupt erst am 03.11. öffnen, soll er mir in a2 01.10. und in a3 01.11. schreiben
ich hoffe, dass du verstehst was ich meine und bedanke mich jetzt schon ganz herzlichst bei dir um dein bemühen
AW: Sorry, kleiner Denkfehler
03.09.2008 17:52:40
Chris
Servus,
so:

Private Sub Workbook_Open()
Dim dat As Date
dat = DateSerial(Year(Date), Month(Date), 1) ' = Erster des aktuellen Monats
If Date >= dat Then
Dim rSuche  As Range, rFinde As Range
Set rFinde = Sheets("Tabelle1").Range("A:A")
Set rSuche = rFinde.Find(what:=dat, Lookat:=xlWhole, LookIn:=xlValues)
If rSuche Is Nothing Then
If Sheets("Tabelle1").Range("A1")  "" Then
Sheets("Tabelle1").Range("A65536").End(xlUp).Offset(1, 0) = dat
Else
Sheets("Tabelle1").Range("A1") = dat
End If
End If
End If
End Sub


Gruß
Chris

Anzeige
AW: Sorry, kleiner Denkfehler
03.09.2008 18:16:00
Heiderer
hallo, danke für die rasche behebung meines problemes, jetzt funktionierts super, nur hätte ich noch ein kleines problem, nehmen wir an, ich vergesse einmal im monat diese datei zu öffnen und der letzte wert ist: 01.09.2008. stelle ich das systemdatum nun auf november ein, schreibt er mir in die nächste zeile: 01.11.2008, aber was ist nun mit dem 01.10.2008? kannst du das noch so einbauen, dass wenn ich einmal im monat die datei nicht öffne, dann excel das fehlende monat automatisch ergänzt? das wäre echt super von dir, wenn du das schaffen würdest
ich bedanke mich jetzt schon wieder ganz herzlichst bei dir
Anzeige
AW: Sorry, kleiner Denkfehler
03.09.2008 18:43:00
Chris
Servus,
dann ganz anders:

Private Sub Workbook_Open()
Dim lngletzte As Long, Monat As Long, Jahr As Long, i As Long, k As Long
Dim MonatsDifferenz As Long, JahresDifferenz As Long
With Sheets("Tabelle1")
lngletzte = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(Rows.Count, 1).End(xlUp).Row, Rows.  _
_
Count)
Select Case .Range("A1")
Case Is = "":
.Range("A1") = DateSerial(Year(Date), Month(Date), 1)
Exit Sub
Case Else
Monat = Month(.Cells(lngletzte, 1))
Jahr = Year(.Cells(lngletzte, 1))
End Select
End With
JahresDifferenz = Year(Date) - Jahr
Select Case JahresDifferenz
Case 0:
MonatsDifferenz = Month(Date) - Monat
Select Case MonatsDifferenz
Case 0:
Exit Sub
Case 1:
With Sheets("Tabelle1")
.Range("A65536").End(xlUp).Offset(1, 0) = DateSerial(Year(Date),  _
Month(Date), 1)
End With
Case Else
For i = Monat + 1 To Month(Date)
With Sheets("Tabelle1")
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date),   _
_
i, 1)
End With
Next i
End Select
Case Else
For k = 0 To JahresDifferenz
If k = 0 Then
For i = Monat + 1 To 12
With Sheets("Tabelle1")
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date) -  _
JahresDifferenz + k, i, 1)
End With
Next i
Else
For i = 1 To 12
If Year(Date) - JahresDifferenz + k = Year(Date) And i = Month(Date) + 1 Then   _
_
Exit Sub
With Sheets("Tabelle1")
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date) -  _
JahresDifferenz + k, i, 1)
End With
Next i
End If
Next k
End Select
End Sub


Hier ist es egal, wie lange du nichts mehr eingetragen hast. das Makro füllt die Differenz vom letzten datum bis zum jetzigen auf, steht nichts in der Tabelle wird das aktuelle Datum (natürlich der Erste des Monats) eingetragen.
Viel Spaß
Gruß
Chris

Anzeige
AW: Sorry, kleiner Denkfehler
03.09.2008 19:13:00
Heiderer
danke sehr, hört sich toll an, nur kommen beim kompilieren einige fehlermeldungen, ich hab dir die zeilen, welche vba rot makiert, unten angeführt:
lngletzte = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(Rows.Count, 1).End(xlUp).Row, Rows. _
_
Count)
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date), _
_
i, 1)
If Year(Date) - JahresDifferenz + k = Year(Date) And i = Month(Date) + 1 Then _
_
oder mache ich was falsch?
AW: Sorry, kleiner Denkfehler
04.09.2008 08:15:43
Chris
Servus,
das liegt am Seitenumbruch, wenn du den entfernst , dann verschwindet auch der rote Text.
Zur Sicherheit:
https://www.herber.de/bbs/user/55179.xls
In der Datei ist der Code ohne Zeilenumbrüche aufgeführt. Das mit den Zeilenumbrüchen passiert, wenn der Text zu lang für die Forumsansicht ist, oder einb Fehler bei der Vorschau hier im Forum vorlag.
Gruß
Chris
Anzeige
AW: Sorry, kleiner Denkfehler
04.09.2008 08:20:18
Heiderer
hej super danke, jetzt funktioniert die datei so, wie ich es mir vorgestellt habe, du bist echt toll, danke dir für die rasche hilfe
AW: Sorry, kleiner Denkfehler
04.09.2008 08:36:33
Heiderer
tut mir leid, dass ich jetzt nochmals stören muss, was muss ich machen, wenn in a1 eine überschrift (zb. datum) steht und das richtige datum erst mit a2 beginnt? hätte es in vba von a1 auf a2 geändert, kommt aber leider eine fehlermeldung, ich hoffe, dass du mir noch einmal helfen kannst (trau mich ja kaum noch dich fragen)
AW: Sorry, kleiner Denkfehler
04.09.2008 08:40:08
Heiderer
sorry, problem schon gelöst, hab einfach einen falschen tabellen-namen gehabt, alles ok, danke nochmals
AW: Sorry, kleiner Denkfehler
04.09.2008 14:45:00
Heiderer
hallo, eine kleine frage hätte ich noch, was müsste ich in vba umstellen, wenn will, dass es nicht immer der erste des monats ist sondern vielleicht der 5.? danke dir jetzt schon wiedermal
Anzeige
AW: na ganz einfach...
04.09.2008 15:53:00
Chris
... so:
DateSerial(Year(Date), Month(Date), 1) + 4
Gruß
Chris
AW: na ganz einfach...
04.09.2008 16:04:00
Heiderer
hab ich probiert, nur schreibt er mir, wenn ich als anfangsdatum den 05.08. und ich im system den 01.08 eingestellt habe, trotzdem den 05.09. hin, was er ja noch nicht soll, da ja noch nicht der 05.09. ist, hm, funtkioniert leider nicht und mache ich was falsch?
AW: na ganz einfach...
04.09.2008 16:34:04
Heiderer
also hier nochmal der ganze code, den ich verwende, leider klappt es noch immer nicht:

Private Sub Workbook_Open()
Dim lngletzte As Long, Monat As Long, Jahr As Long, i As Long, k As Long
Dim MonatsDifferenz As Long, JahresDifferenz As Long
With Sheets("Tabelle1")
lngletzte = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(Rows.Count, 1).End(xlUp).Row, Rows. _
Count)
Select Case .Range("A1")
Case Is = "":
.Range("A1") = DateSerial(Year(Date), Month(Date), 1) + 4
Exit Sub
Case Else
Monat = Month(.Cells(lngletzte, 1))
Jahr = Year(.Cells(lngletzte, 1))
End Select
End With
JahresDifferenz = Year(Date) - Jahr
Select Case JahresDifferenz
Case 0:
MonatsDifferenz = Month(Date) - Monat
Select Case MonatsDifferenz
Case 0:
Exit Sub
Case 1:
With Sheets("Tabelle1")
.Range("A65536").End(xlUp).Offset(1, 0) = DateSerial(Year(Date),  _
Month(Date), 1) + 4
End With
Case Else
For i = Monat + 1 To Month(Date)
With Sheets("Tabelle1")
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date),  _
i, 1) + 4
End With
Next i
End Select
Case Else
For k = 0 To JahresDifferenz
If k = 0 Then
For i = Monat + 1 To 12
With Sheets("Tabelle1")
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date) -  _
JahresDifferenz + k, i, 1) + 4
End With
Next i
Else
For i = 1 To 12
If Year(Date) - JahresDifferenz + k = Year(Date) And i = Month(Date) + 1 Then  _
Exit Sub
With Sheets("Tabelle1")
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date) -  _
JahresDifferenz + k, i, 1) + 4
End With
Next i
End If
Next k
End Select
End Sub


Anzeige
AW: na ganz einfach...
04.09.2008 16:59:55
Chris
Hier bitteschön auf den 5. angepasst:

Sub Test()
Dim lngletzte As Long, Monat As Long, Jahr As Long, i As Long, k As Long
Dim MonatsDifferenz As Long, JahresDifferenz As Long
With Sheets("Tabelle1")
lngletzte = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(Rows.Count, 1).End(xlUp).Row, Rows. _
Count)
Select Case .Range("A1")
Case Is = "":
If Day(Date) >= 5 Then
.Range("A1") = DateSerial(Year(Date), Month(Date), 1) + 4
Exit Sub
Else
Exit Sub
End If
Case Else
Monat = Month(.Cells(lngletzte, 1))
Jahr = Year(.Cells(lngletzte, 1))
End Select
End With
JahresDifferenz = Year(Date) - Jahr
Select Case JahresDifferenz
Case 0:
MonatsDifferenz = Month(Date) - Monat
Select Case MonatsDifferenz
Case 0:
Exit Sub
Case 1:
With Sheets("Tabelle1")
If Day(Date) >= 5 Then
.Range("A65536").End(xlUp).Offset(1, 0) = DateSerial(Year(Date),  _
Month(Date), 1) + 4
Else
Exit Sub
End If
End With
Case Else
For i = Monat + 1 To Month(Date)
If i = Month(Date) And Day(Date) 


Da kommen dann noch die ein oder andere If-Abfrage dazu, weil ja der Tag auch noch geprüft werden muss.
Gruß
Chris

Anzeige
AW: na ganz einfach...
04.09.2008 17:28:32
Heiderer
super danke, jetzt bin ich ganz zufrieden *g*
herzlichsten dank nochmals für deine raschen lösungen und bemühungen
AW: na ganz einfach...
04.09.2008 18:20:49
Heiderer
hallo nochmal, ich weiß, dass ich dich sicher schon nerve, aber ich hätte probiert, dass mir das datum nicht in die zellen A geschrieben werden schon in B, habe das auch in vba umgebessert, überall wo a1 gestanden ist auf b1 bzw. A65536 auf B65536, leider funktioniert das nicht
ich hoffe, dass du mir noch einmal helfen kannst *liebschau*
Warum probierst du das nicht?
04.09.2008 23:26:29
Beate
Hallo Thomas,
warum fragst du in anderen Foren und reagierst dort nicht auf Vorschläge?:
http://www.online-excel.de/fom/fo_read.php?f=1&bzh=0&h=30995&ao=1#a123x
Wenn es immer der Monatsfünfte sein soll und ab B1 abwärts bis zum Fünften des aktuellen Monats, dann so:
' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private Sub Workbook_Open()
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        If Sheets("Tabelle1").Range("B1").Value = "" Then
            Sheets("Tabelle1").Range("B1").Value = DateSerial(Year(Now), Month(Now), 5)
        Else
            Sheets("Tabelle1").Range("B1").DataSeries Rowcol:=xlColumns, _
                Type:=xlChronological, _
                Date:=xlMonth, _
                Step:=1, _
                Stop:=Date, _
                Trend:=False
        End If
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub

Gruß,
Beate
Verbesserung
04.09.2008 23:55:58
Beate
Hallo Thomas,
hiermit würdest du obendrauf sicherstellen, dass in B1 als Tag immer der Fünfte drin steht, egal in welchem Monat / Jahr der Eintrag in B1 gemacht wurde. Das muss nämlich sichergestellt sein, damit die Reihe nach Wunsch aufgefüllt wird:
Option Explicit

Private Sub Workbook_Open()
    Sheets("Tabelle1").Select 'Tabellenname anpassen
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        Range("B2:B65536").ClearContents
        If Range("B1").Value = "" Then
            Range("B1").Value = DateSerial(Year(Now), Month(Now), 5)
        Else
            Range("B1").Value = DateSerial(Year(Range("B1")), Month(Range("B1")), 5)
            Range("B1").DataSeries Rowcol:=xlColumns, _
                Type:=xlChronological, _
                Date:=xlMonth, _
                Step:=1, _
                Stop:=Date, _
                Trend:=False
        End If
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub

Gruß,
Beate
AW: Verbesserung
05.09.2008 07:52:00
Heiderer
hej super danke, genauso hab ich mir das vorgestellt, du bist spitze danke nochmals
AW: Verbesserung
06.09.2008 07:46:00
Heiderer
hallo nochmal, wollte mich nochmals bei mir bedanken, hat alles super funktioniert
nun hätte ich noch eine Frage, könnten man noch was bei dem code einbauen: ich will, dass dieser code nur 5 mal (sprich 5 monate) ausgeführt wird, danach nicht
beispiel: start 05.09.2008, 05.10.2008, 05.11.2008, 05.12.2008, 05.01.2009, 05.02.2009, danach soll er stoppen
wenn du das noch hinbekommen könntest, wäre das super
AW: na ganz einfach...
05.09.2008 09:03:16
Chris
Servus,
du hast ja jetzt auch eine andere Lösung, aber mal fürs grundsätzliche Verständnis:
.Cells(65536, 1).End(xlUp).Offset(1, 0) = DateSerial(Year(Date) - JahresDifferenz + k, i, 1) + 4
entspricht:
.Range("A65535").End(xlUp).Offset(1, 0) = DateSerial(Year(Date) - JahresDifferenz + k, i, 1) + 4
wobei die die 1 in der Klammer bei .Cells(65536, 1) für die Spalte steht, also A, bei 2 dann B,...
außerdem:
lngletzte = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)
hier hast du auch die 1 bei der Bestimmung der letzten beschriebenen Zeile, wie gehabt, 2 = B, 3 = C,...
das muss man dann entsprechend auch ändern.
Gruß
Chris
AW: na ganz einfach...
05.09.2008 10:01:29
Heiderer
ok, super danke für die info
AW: na ganz einfach...
04.09.2008 16:36:00
Heiderer
bei dem code, den ich dir gerade geschrieben habe, schreibt er mir jetzt zwar brav den 05.09. hin, aber dies dürfte er ja noch gar nicht, weil ja heute erst der 04.09. ist, ich hoffe, dass du verstehst, was ich will, danke dir jetzt schon
AW: Automatische Werte befüllen wenn bestimmtes Datum
03.09.2008 15:08:00
Beate
Hallo Thomas,
das wäre deine Tabelle:
 AB
101.05.200870,00 €
201.06.200870,00 €
301.07.200870,00 €
401.08.200870,00 €
501.09.2008 
601.10.2008 
701.11.2008 
801.12.2008 

Dann geht es so:
Private Sub Workbook_Open()
    If Cells(Rows.Count, "B").End(xlUp).Offset(1, -1).Value > DateSerial(Year(Now), Month(Now), 1) Then Exit Sub
    Cells(Rows.Count, "B").End(xlUp).Offset(1, 0).Value = 70
End Sub


Gruß,
Beate
Falls ich die Frage falsch verstanden habe...
03.09.2008 15:17:00
Beate
bewirkt dieser Code, dass in Spalte A der aktuelle Monatserste eingetragen wird:
Private Sub Workbook_Open()
    If Sheets("Tabelle1").Cells(Rows.Count, "A").End(xlUp).Offset(0, 0).Value = DateSerial(Year(Now), Month(Now), 1) Then Exit Sub
    Sheets("Tabelle1").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0) = DateSerial(Year(Now), Month(Cells(Rows.Count, "A").End(xlUp).Offset(0, 0)) + 1, 1)
End Sub


Gruß,
Beate
AW: Falls ich die Frage falsch verstanden habe...
03.09.2008 16:45:00
Thomas
hallo, danke für die rasche antwort, aber ich glaube, dass du mein anliegen vielleicht falsch verstanden hast
ich schreibe zB. in a1 den monats ersten hinein, wäre also der 01.09.2008
nun will ich, wenn das aktuelle datum der 01.10. ist, dass er mir nun automatisch in a2 das datum 01.10. hinschreibt, auch wenn ich zb. die datei erst am 03.10. öffne, würde ich die datei überhaupt erst am 03.11. öffnen, soll er mir in a2 01.10. und in a3 01.11. schreiben
ich hoffe, dass du verstehst was ich meine und bedanke mich jetzt schon ganz herzlichst bei dir um dein bemühen
AW: Falls ich die Frage falsch verstanden habe...
03.09.2008 17:03:28
Thomas
hallo nochmal, ich habs nun so einiger maßen hinbekommen, ich muss eben die datei zweimal öffnen, damit er mir auch zwei monate aktualisiert, wenn du das noch schaffen könntest, wäre das super, ansonsten kann man nix machen
nur ist mir jetzt aufgefallen, dass es über das jahr darüber geht, schreibt er mir nicht 2009 schon gleich 2010 hin, obwohl ich bei windows 2009 eingestellt habe, was hats da nun?

310 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige