Abfrage von Zeitreihe (ohne Wochenende) - Fehler bei Loop

  • #1
J

JonnyHeart

Aktives Mitglied
Themenersteller
Dabei seit
12.01.2005
Beiträge
31
Reaktionspunkte
0
In Spalte A steht eine Zeitreihe OHNE Wochenendtage. In Zelle B1 soll ein Eingabefeld für ein Datum stehen, welches im VBA-Code über die Range Funktion wie folgt ausgelesen werden soll :
----------------------------------------------------------------------------------------------------
Dim da As Single

i = 5

Do Until Cells(i, 1) = Range(O14)

i = i + 1

Loop

m = i

For X = 1 To 12

Cells(X, 19) = Cells(m, X)

Next X

End Sub

Problem bei der Abfrage ist, wenn in Zelle B1 ein Datum eingegeben wird, welches nicht in Spalte A verfügbar ist.

-> 12.03.2006 nicht drin da Sonntag
13.03.2006
14.03.2006
15.03.2006
16.03.2006

Wie kann nun der Code dahingehend verändert werden dass entweder das Loopen abgebrochen wird sofern der Tag nicht gefunden wird bzw. dass sofern der TAG nicht gefunden wird - 1TAG gerechnet wird, sofern dieser nicht drin ist -2TAGE .

Vielen Dank

JONNY
 
  • #2
Hi.

So würd ich das Lösen:

Code:
Sub aufruf()
Dim dDate As Date
Dim i As Integer
Dim strTemp As String
dDate = #3/18/2006#

For i = 0 To 2
  strTemp = FindeDatum(dDate - i)
  If strTemp <>  Then
    MsgBox strTemp
    Exit For
  End If
Next i

End Sub



Function FindeDatum(dSearchDate As Date) As String

Dim rng As Range
  Set rngSearch = Worksheets(1).Range(a1:a30)
  Set rng = rngSearch.Find(dSearchDate)
  If rng Is Nothing Then
    FindeDatum = 
  Else
    FindeDatum = rng.Address
  End If
End Function

Gruß
 
  • #3
Vielen Dank für deinen Ansatz, leider klappt das bei mir nicht.

Da ich noch VBA_NEWBIE bin bräuchte ich noch etwas Hilfe.

Was muss ich bei deinem CODE verändern, dass er in meiner Excelfile läuft.

Spalte A enthält bei mir die Datumswerte (ohne Wochenenden)

Spalte B1 enthält das gesuchte Datum (bsp 19.03.2006 , welches händisch eingetragen wird
-> Danach soll per Makro Spalte A nach dem Datum B1 durchsuchen.

Sofern Datum nicht gefunden wird (wie in diesem Fall, da 19.03 = Sonntag, soll
von diesem Datum 1 Tag abgezogen werden.

a) ist dieser Tag (hier 18.03.2006) vorhanden - so endet die Suche

b) wenn nicht wird nochmals um -1 Tag reduziert


Da in diesem Fall 19.03 Sonntag und 18.03 Samstag ist wird der Code erst bei -2 Tage fündig.


Die gefundene Zeile sieht in meinem Fall so aus :

Zeile Spalte A B C D
1 19.03.06
2
3
4 17.03.2006 56 66 55



MfG

JONNYHEART
 
  • #4
Hallo,

ich muss gestehen, dass gänzlich unkommentierter Code nicht nur für Newbies schwer zu verstehen ist.

Spalte A enthält bei mir die Datumswerte (ohne Wochenenden)
Ebenso das obige Beispiel. Allerdings werden nur die Zeilen 1-30 berücksichtigt.
Einfach die Zeile Set rngSearch = Worksheets(1).Range(a1:a30) anpassen.

Spalte B1 enthält das gesuchte Datum (bsp 19.03.2006 , welches händisch eingetragen wird
-> Danach soll per Makro Spalte A nach dem Datum B1 durchsuchen.
Im Beispiel wird das Datum nicht aus B1 ausgelesen. Der Einfachheit halber steht es im Quellcode, in der Variablen dDate. Wenn dDate der Wert von B1 zugewiesen werden soll, würde das so aussehen:
Code:
If IsDate(Cells(1, 2).Value) Then 	'Prüfen ob in B1 wirklich ein Datum steht
  ddate = Cells(1, 2).Value		'Zuweisen
End If

Sofern Datum nicht gefunden wird (wie in diesem Fall, da 19.03 = Sonntag, soll
von diesem Datum 1 Tag abgezogen werden.

a) ist dieser Tag (hier 18.03.2006) vorhanden - so endet die Suche

b) wenn nicht wird nochmals um -1 Tag reduziert


Da in diesem Fall 19.03 Sonntag und 18.03 Samstag ist wird der Code erst bei -2 Tage fündig.
Genau so läufts ;)
Die Funktion FindeDatum gibt ein String mit der Zellenadresse zurück, wenn das entsprechende (= als Parameter übergebene) Datum gefunden wurde. Wenn es nicht gefunden wurde wird ein leerer String zurückgegeben.
Weil ein leerer String nicht gewünscht ist (Wochenendproblem), wird in diesem Fall die Funktion nocheinmal aufgerufen, als Parameter wird das dDate-1 übergeben.
Wenn immer noch kein Datum gefunden wurde (leerer Rückgabe-String), wird es mit dem Parameter dDate-2 versucht.

Das Wochenendproblem wird im Code an dieser Stelle berücksichtigt
Code:
For i = 0 To 2				'Die Schleife soll max 3 mal durchlaufen werden
  strTemp = FindeDatum(dDate - i)	'Der Funktionsaufruf: In dDate ist das Datum(B1) gespeichert
  If strTemp <>  Then		'Der Rückgabewert ist nicht leer, d.h. ein Datum wurde gefunden
    MsgBox strTemp				'Ausgabe der Zellenadresse
    Exit For				'Verlassen der Schleife, das Datum wurde gefunden
  End If
Next i
'Bei einem Wochentag wird die Schleife nur ein mal durchlaufen (i=0)
'Bei einem Samstag wird die Schleife zwei mal durchlaufen (i=1)
'Bei einem Sontag drei mal (i=2)

Ich hoffe Du kommst klar damit, wenn nicht sag noch mal Bescheid ;)
 
Thema:

Abfrage von Zeitreihe (ohne Wochenende) - Fehler bei Loop

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben