Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Tagesdifferenzen auswerten bzw. kennzeichnen
#1
Hallo,

(alles hier ist beispielhaft, es zählt hier nur das Prinzip)

mit folgendem kleinen Programm konstruiere ich erstmal meine Werte, die ich danach auswerten möchte.

Code:
Sub Werte_konstruieren()
Dim i%, vbVor, vbNach, vbV, vbN
vbVor = Array("Lili", "Elke", "Pit", "Gert", "Fred", "Tea")
vbNach = Array("Beck", "Lot", "Pop", "Tar", "Reck", "Stur")
'Namen nach Zufallsprinzip schreiben
For i = 1 To 100
vbV = vbVor(WorksheetFunction.RandBetween(0, 5))
vbN = vbNach(WorksheetFunction.RandBetween(0, 5))
Range("A" & i) = vbV & " " & vbN
Next
'Datum nach Zufallsprinzip schreiben
For Each Zelle In Range("a1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
Zelle.Offset(0, 1) = WorksheetFunction.RandBetween(9, 13) & ".06.2017"
Next
End Sub

Ausgehend von dem jeweils aktuellen Datum möchte ich nun  alle Werte kennzeichnen, die 2 oder 3 Tage zurückliegen.
Das mache ich hiermit:
Code:
Sub Tagesdifferenzen_Auswerten()
Columns(3).Clear: Columns(4).Clear
For Each Zelle In Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
If CDate(Date) - CDate(Zelle.Offset(0, 1)) = 3 Then Zelle.Offset(0, 2) = "3 Tage"
If DateDiff("d", Zelle.Offset(0, 1), CDate(Date)) = 2 Then Zelle.Offset(0, 3) = "2 Tage"
Next
End Sub
So weit so gut. Welche Alternativen zur For Each Schleife (ist mir bei großen Datenmengen zu langsam) für eine solche Auswertung gibt es?
Danke schon mal für eure Mühe und Rat im voraus.
Antworten Top
#2
Hallo Elke,

das sollte schneller sein:


Code:
Sub Fen()
f = Cells(1).CurrentRegion.Resize(, 4)
For i = 1 To UBound(f)
   If CDate(Date) - CDate(f(i, 2)) = 3 Then f(i, 3) = "3 Tage"
   If DateDiff("d", f(i, 2), CDate(Date)) = 2 Then f(i, 4) = "2 Tage"
Next i
Cells(1, 6).Resize(UBound(f), UBound(f, 2)) = f
End Sub


Testen: zuerst die Daten in Spalte A:B einfügen, dann meinen Code (schreibt ab Spalte 6), dann deinen Code zur Kontrolle

mfg
[-] Folgende(r) 1 Nutzer sagt Danke an Fennek für diesen Beitrag:
  • Elke Boese
Antworten Top
#3
Hallo Elke,

auch das konstruieren kannst du mit der Nutzung eines Arrays stark beschleunigen.
Code:
Option Explicit
Sub Werte_konstruieren()
Dim i%, vbVor, vbNach, vbV, vbN, vbArr()
vbVor = Array("Lili", "Elke", "Pit", "Gert", "Fred", "Tea")
vbNach = Array("Beck", "Lot", "Pop", "Tar", "Reck", "Stur")
Const intAnz As Integer = 1000
'Namen nach Zufallsprinzip schreiben
ReDim vbArr(1 To intAnz, 1 To 2)
For i = 1 To intAnz
    vbV = vbVor(WorksheetFunction.RandBetween(0, 5))
    vbN = vbNach(WorksheetFunction.RandBetween(0, 5))
    vbArr(i, 1) = vbV & " " & vbN
    vbArr(i, 2) = CDate(WorksheetFunction.RandBetween(9, 13) & ".06.2017")
Next
Range("A1").Resize(intAnz, 2).Value = vbArr
End Sub

Sub Tagesdifferenzen_Auswerten()
Dim vbArr()
Dim intI As Integer
Dim datAkt As Date
datAkt = Date
Columns(3).Clear: Columns(4).Clear
vbArr = Range("A1").Resize(Cells(Rows.Count, 1).End(xlUp).Row, 4)
For intI = 1 To UBound(vbArr, 1)
    If datAkt - vbArr(intI, 2) = 3 Then vbArr(intI, 3) = "3 Tage"
    If datAkt - vbArr(intI, 2) = 2 Then vbArr(intI, 4) = "2 Tage"
Next intI
Range("A1").Resize(Cells(Rows.Count, 1).End(xlUp).Row, 4) = vbArr
End Sub

ps. Gibt es einen Grund, warum du das Datum beim Konstruieren als Text abgespeichert hast?
helmut

Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität.
Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen."
Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.





[-] Folgende(r) 1 Nutzer sagt Danke an Ego für diesen Beitrag:
  • Elke Boese
Antworten Top
#4
Hallo,

bitte helft mir weiter. Statt wie Fennek und Ego ein Feld zu verwenden, habe ich mir überlegt, dass es auch mit dem  Autofilter gehen müßte.

Code:
Sub Datum_Filtern2()

With Sheets("Tabelle1")

'Autofilter einschalten
.Columns(2).AutoFilter Field:=1, Criteria1:=CStr(DateAdd("d", -3, Date))

'mit dem Filter gefundene Werte auswählen
.AutoFilter.Range.Resize(.AutoFilter.Range.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Select

'Ergebnisse der Auswahl kennzeichnen und in Spalte C schreiben
For Each Zelle In Selection
Zelle.Offset(0, 1) = "3 Tage"
Next

'Autofilter wieder ausschalten
.Columns(2).AutoFilter
End With

End Sub

Wie ihr anhand meines Codes sehen könnt, habe ich alle mit dem Autofilter gefundenen Werte erstmal selektiert und die selektierten Werte

dann über eine For Each - Schleife, als Ergebnis in Spalte C geschrieben.

Jetzt frage ich mich aber, welche Alternativen es gibt, die durch den Autofilter gefundenen Werte auszulesen, anstatt eine For Each - Schleife

zu verwenden?
Antworten Top
#5
Hallo Elke,
Sub Tagesdifferenzen_Auswerten()
 Columns("C:D") = ""
 With Range("B1").Resize(Cells(Rows.Count, 2).End(xlUp).Row)
   .Offset(, 1).Formula = "=IF(TODAY()-B1=3,""3 Tage"","""")"
   '.Offset(, 1).Value = .Offset(, 1).Value
   .Offset(, 2).Formula = "=IF(TODAY()-B1=2,""2 Tage"","""")"
   '.Offset(, 2).Value = .Offset(, 2).Value
 End With
End Sub
Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Elke Boese
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste