Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Datum in Bereich suchen und range kopieren

Forumthread: Datum in Bereich suchen und range kopieren

Datum in Bereich suchen und range kopieren
10.03.2025 19:59:14
Chris
Hallo Forum,

das unten stehende Makro sucht das heutige Datum aus unzähligen Datumsangaben in einem Sheet. Wenn gefunden, nutzt es den jeweiligen Inhalt in der Spalte in der das Datum gefunden wurde als neuen Suchbegriff, um weitere Inhalte zu kopieren.

Das Datum, welches gesucht werden soll steht in folgender Form in einer Zelle:
Mo 10.03.2025

Ich erhalte die Fehlermeldung "Index außerhalb des gültigen Bereichs" bei der Zeile

ReDim Preserve arrfind(1 To cnt)

Das Makro findet anscheinend das heutige Datum nicht.
Ändere ich die im Makro die Zeile auf

searchval = "10.03.25"

-also trage manuelle ein festes Datum ein - läuft das Makro problemlos.

Hat jmd, einen Idee, was geändert werden muss, damit das Makro das jeweils aktuelle Datum findet?
Ganz unten noch ein Makro mit dem die Datumswerte in das Suchsheet kopiert werden. Evtl. liegt der
Fehler beim Kopieren der Datumswerte.

Gruß
Chris



Sub listNames()

Dim searchWs As Worksheet, searchWs2 As Worksheet, resultWs As Worksheet
Dim searchrng As Range, rngfund As Range
Dim arrfind, result
Dim lrow&, i&, cnt&
Dim searchval$

searchval = "Format(Date, "dd.mm.yy") 'Funktioniert bei manueller/fester Eingabe
Set searchWs = Worksheets("1-Suche")
Set searchWs2 = Worksheets("2-Suche&KOPIEREhierHERAUS")
Set resultWs = Worksheets("3-ERGEBNIS")

Set searchrng = searchWs.UsedRange
ReDim arrfind(1 To searchrng.Columns.Count)

For i = 1 To searchrng.Columns.Count
Set rngfund = searchrng.Columns(i).Find(What:=searchval, LookIn:=xlValues, lookat:=xlPart)
If Not rngfund Is Nothing Then
cnt = cnt + 1
arrfind(cnt) = searchrng.Columns(i).Cells(1)
End If
Next
ReDim Preserve arrfind(1 To cnt)

If Not TypeName(arrfind) = "Empty" Then
Application.ScreenUpdating = False
lrow = resultWs.Cells(Rows.Count, 1).End(xlUp).Row
cnt = 0

For i = LBound(arrfind) To UBound(arrfind)
result = Application.WorksheetFunction.Match(arrfind(i), searchWs2.UsedRange.Columns(1), 0)
If IsNumeric(result) Then
resultWs.Cells(lrow + cnt, 1).NumberFormat = "@"
resultWs.Cells(lrow + cnt, 1).Resize(1, 4).Value = searchWs2.Cells(result, 1).Resize(1, 4).Value
cnt = cnt + 1
End If
Next

End If

End Sub




Sub CopyData

Dim lngLZ, lnglCOL, lnglROW As Long
Dim qws As Worksheet

Application.ScreenUpdating = False

lnglCOL = Sheets("FA-CALC").Cells(1, Columns.Count).End(xlToLeft).Column + 1
lngLZ = Sheets("FA-CALC").Range("O:O").Find(What:="*", LookIn:=xlValues, Lookat:=xlWhole, SearchDirection:=xlPrevious).Row

Sheets("FA-CALC").Range("O1:O" & lngLZ).Copy

With Sheets("1-Suche")
.Cells(1, lnglCOL).PasteSpecial Paste:=xlValues, Operation:=xlNone
.Cells(1, lnglCOL).PasteSpecial Paste:=xlFormats, Operation:=xlNone
End With

Application.ScreenUpdating = True

End Sub
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datum in Bereich suchen und range kopieren
10.03.2025 20:23:50
Uduuh
Hallo,
hast du schon
searchval=Date

versucht?

Gruß aus'm Pott
Udo
AW: Datum in Bereich suchen und range kopieren
11.03.2025 11:05:02
Chris
Uwe: leider nein, funktioniert nicht
AW: Datum in Bereich suchen und range kopieren
10.03.2025 20:29:48
Yal
Hallo Chris,

ein Datum ist ein Zahl. Durch Zahlenformat wird es als "Mo 10.03.2025". Aber es bleibt ein Zahl.
Mit Format (Date, "dd.mm.yy") erzeugst Du eine Zeichenkette (String).

Zahlen und Zeichenkette miteinander zu vergleichen kann nur scheitern...

VG
Yal
Anzeige
AW: Datum in Bereich suchen und range kopieren
10.03.2025 21:30:04
Yal
Das Problem mit dem "Index ausserhalb der gültigen Bereich" kannst Du umgehen, in dem Du den Array fortlaufend aufbaust.

Sub listNames()

Dim arrFind
Dim C As Range
Dim rngfund As Range
Dim arrErg
Dim Result
Dim i

'Suche nach Datum, Sammeln der Spaltenüberschrift
arrFind = Array()
With Worksheets("1-Suche")
For Each C In .UsedRange.Columns
Set rngfund = C.Find(What:=Date, LookIn:=xlValues, lookat:=xlPart)
If Not rngfund Is Nothing Then
ReDim Preserve arrFind(UBound(arrFind) + 1)
arrFind(UBound(arrFind)) = C.Cells(1)
End If
Next
End With

If UBound(arrFind) = -1 Then Exit Sub 'keine Ergebnis, aussteigen
Application.ScreenUpdating = False

'Suche nach Zeilen mit dem Spaltenüberschrift, Sammeln der Daten
arrErg = Array()
With Worksheets("2-Suche&KOPIEREhierHERAUS")
For i = LBound(arrFind) To UBound(arrFind)
Result = Application.WorksheetFunction.Match(arrFind(i), .UsedRange.Columns(1), 0)
If IsNumeric(Result) Then
ReDim Preserve arrErg(UBound(arrErg) + 1)
arrErg(UBound(arrErg)) = .Cells(Result, 1).Resize(1, 4).Value
End If
Next
End With

'Ausgabe der Daten
With Worksheets("3-ERGEBNIS")
For i = LBound(arrErg) To UBound(arrErg)
With .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
.NumberFormat = "@"
.Resize(1, 4).Value = arrErg(i)
End With
Next
End With

Application.ScreenUpdating = True
End Sub

VG
Yal
Anzeige
AW: Datum in Bereich suchen und range kopieren
11.03.2025 11:04:12
Chris
Hallo Yal,

Danke für die Rückmeldung.
Da es sich bei mir um ein Datum als String handelt, habe ich deine Variante um zwei Zeilen angepasst, so dass das Datum als String erkannt wird.

searchVAL= Format(Date, "dd.mm.yy")

Set rngfund = C.Find(What:=CStr(searchVAL), LookIn:=xlValues, lookat:=xlPart)

Bisher läuft es.. Ist die Umsetzung aus deiner Sicht gut?

Zweite Frage:

Bei der Zeile:

arrErg(UBound(arrErg)) = .Cells(Result, 1).Resize(1, 15).Value


benötige ich noch weitere Zeilen ...resize(1,15).value dann 16-19 nicht berücksichtigen und weiter ab Spalte 20, hier resize um weitere 5 Spalten.
Wie ergänzt man dies?

Gruß und Danke
Chris
Anzeige
AW: Datum in Bereich suchen und range kopieren
11.03.2025 14:27:36
Yal
Hallo Christian,

alles was funktioniert kann nicht vollkommen schlecht sein. Zwar wäre es "besser", dass Datum als Datum vorliegen und nicht als Text, aber solang es für dich funktioniert.

zu der Frage nach 2 Bereiche: es kommt nicht nur darauf an, wie Du die Daten sammelst, sondern wie Du diese ablegen möchtest. Spricht, das Sammeln sollte das Ablegen vorbereiten.

hier sehe ich wenig andere Möglichkeit als die Zellenwert einzeln zu sammeln:
Dim Arr(1 To 20)

For i = 1 To 15: Arr(i) = Cells(1, i).Value: Next
For i = 20 To 24: Arr(i + 15 - 20) = Cells(1, i).Value: Next
arrErg(UBound(arrErg)) = Arr

Die Ausgabe muss dementsprechend angepasst werden:
.Resize(1, 20).Value = arrErg(i)


VG
Yal
Anzeige
AW: Datum in Bereich suchen und range kopieren
10.03.2025 21:17:22
Alwin Weisangler
Hallo Chris,

Datumssuche ist mit .Find ungünstig. Besser ist es mit Application.Match.
Dazu gibt es hier im Forum Beispiele, wie Sand am Meer.

Gruß Uwe

Forumthreads zu verwandten Themen

Anzeige
Anzeige