Excel: Datum von Namensbereich als Zahl auslesen

Salu zusammen,

ich greife mit Range(„AnfangsDatum“) auf eine Zelle zu, in der ein Datum hinterlegt ist und erhalte das Datum als String. Ich benötige im Script aber die zugrundeliegende Zahl, damit ich auch im Script mit dem Wert rechnen kann, z. B. eine Woche hinzu: Range(„AnfangsDatum“) + 7 …

Wie stelle ich das an?

Bestlichen Dank und Grüße vom
-Rob.

Range(‚Anfangsdatum‘).Value+7 - o.w.T.
owT

Ist immer noch ‚Date‘
Salu Markus,

dann erhalten ich als Ergebnis aber immer noch ein Date-Format. Ich benötige aber das Integer-Format aus dem hinterlegten Datum.

Grüßken
-Rob.

Hintergrund mit Mustermappe
Hier die Datei: http://www.file-upload.net/download-3580686/Datumssu…

Und hier die Details:

Ich habe eine Zeile mit fortlaufenden Datumsangaben (volles Datum hinterlegt angezeigt aber im Format „T“, nur Tag). Ich möchte jetzt mit der Find-Funktion nach einem bestimmten Datum x suchen, das irgendwo auf der Zeile ist. Dieses Datum x ist über Range(„Anfangsdatum“) abrufbar, muß aber noch um einige Tage verschoben werden können.

Komisch ist nur: Wenn ich mir den Inhalt der von Find eigentlich zu findenden Zelle anzeigen lasse, dann steht da „01.08.2011“, der Inhalt von Range(„Anfangsdatum“) wird ebenfalls mit „01.08.2011“ angezeigt, und dennoch ist das Ergebnis der Find-Suche „Nothing“. Es hängt wohl mit der Formatierung als Datum zusammen, daher würde ich gerne einfach alles als Ganzzahlwert behandeln.

Wie also komme ich an die Zahlenwerte der Zellen? .value klappt nicht bei Cells, es wird immer die Datumsschreibweise ausgegeben und Find findet nichts :o(

Vielen Dank & beste Grüße
-Rob.

CInt(Range(‚Anfangsdatum‘).Value+7)
RTFM

RTFM

Sehr erwachsen. Ich dachte, das sei hier ein Forum. Sollen wir besser gleich dicht machen, oder sollen wir uns noch ein paar Beleidigungen an den Kopf werfen?

Anyway: TINFM

Und es klappt dennoch nicht, denn wie ich anhand der hochgeladenen Mappe zu zeigen versuchte, findet die Find-Funktion nichts, egal ob die Suchvariable nun Date oder Double ist. Zeig mir wo hier bei mir eine Anleitung rumliegt, in der das steht.

2 „Gefällt mir“

RTFM

ohje. wer gleich so’ne dicke lippe riskiert, sollte TFM by heart können, was hier nicht der fall sein kann, denn gesucht war wohl das integer-format, nicht der integer-typ. bei excel ist integer nämlich nicht ±2^16, sondern nur ±2^15, und da stößt man mit den datumswerten an die grenze.

richtiger wäre also

Fix(CDbl(Range("Anfangsdatum")))

, falls das anfangsdatum die uhrzeit enthält.

mit dem verweis auf TFM könnte man so ziemlich jedes posting hier parieren. also immer höflich bleiben, MK

JK

2 „Gefällt mir“

Gesuchtes Format in find übergeben
hallo rob,

Ich habe eine Zeile mit fortlaufenden Datumsangaben (volles
Datum hinterlegt angezeigt aber im Format „T“, nur Tag). Ich
möchte jetzt mit der Find-Funktion nach einem bestimmten Datum
x suchen, das irgendwo auf der Zeile ist. Dieses Datum x ist
über Range(„Anfangsdatum“) abrufbar, muß aber noch um einige
Tage verschoben werden können.

Komisch ist nur: Wenn ich mir den Inhalt der von Find
eigentlich zu findenden Zelle anzeigen lasse, dann steht da
„01.08.2011“, der Inhalt von Range(„Anfangsdatum“) wird
ebenfalls mit „01.08.2011“ angezeigt, und dennoch ist das
Ergebnis der Find-Suche „Nothing“. Es hängt wohl mit der
Formatierung als Datum zusammen, daher würde ich gerne einfach
alles als Ganzzahlwert behandeln.

Wie also komme ich an die Zahlenwerte der Zellen? .value
klappt nicht bei Cells, es wird immer die Datumsschreibweise
ausgegeben und Find findet nichts :o(

excel hat da probleme mit den datumswerten, und irritierenderweise gilt .value hier nicht. der kniff ist folgender: weise das tatsächlich verwendete format bei der suche zu:

bla = Range("Anfangsdatum") - 6
With ThisWorkbook.Worksheets("Tabelle1")
 Set Fundstelle = .Range(.Cells(1, 1), .Cells(1, 40)) \_
 .Find(what:=Format(bla, Range("A7").NumberFormat), \_
 LookIn:=xlValues, SearchDirection:=xlNext)

dann klappts

viele grüße
JayKay

Korrektur: FUNKTIONIERT NICHT
Hallo JayKay,

da war ich etwas voreilig, wie Du vielleicht auch!? ;o)

excel hat da probleme mit den datumswerten, und
irritierenderweise gilt .value hier nicht. der kniff ist
folgender: weise das tatsächlich verwendete format bei der
suche zu:

bla = Range(„Anfangsdatum“) - 6
With ThisWorkbook.Worksheets(„Tabelle1“)
Set Fundstelle = .Range(.Cells(1, 1), .Cells(1, 40)) _
.Find(what:=Format(bla, Range(„A7“).NumberFormat), _
LookIn:=xlValues, SearchDirection:=xlNext)

dann klappts

Nein, leider klappts nicht, denn auf diese Weise finde ich ja nur dann die richtigen Daten, wenn der richtige Kalendertag(!) als erster erscheint. Wird z. B. der 5. eines bestimmten Monats gesucht, findet Deine Formel bereits den 5. des ersten beliebigen Monats, nicht des bestimmten Monats.

Was also nötig ist, wäre eine Möglichkeit, das Format der zu durchsuchenden Zellen für .find anzupassen.

Bitte helft mir :o(

Viele Grüße
-Rob.

Grüezi Rob

excel hat da probleme mit den datumswerten,

Das ist hier korrekt - Bei der Suche mit .Find spielt das Zellenformat (und damit auch die Ländereinstellungen) eine Rolle.

Nein, leider klappts nicht, denn auf diese Weise finde ich ja
nur dann die richtigen Daten, wenn der richtige Kalendertag(!)
als erster erscheint. Wird z. B. der 5. eines bestimmten
Monats gesucht, findet Deine Formel bereits den 5. des ersten
beliebigen Monats, nicht des bestimmten Monats.

Das Problem scheint mir hier zu sein, dass Du die ‚Datumswerte‘ dermasen eigentümlich formatiert haben willst/musst.
Wären sie als TT.MM.JJJJ formatiert wie üblich wäre da vieles einfacher.

Was also nötig ist, wäre eine Möglichkeit, das Format der zu
durchsuchenden Zellen für .find anzupassen.

Ja, das ist eine Möglichkeit, die man in den Code bringen könnte.

Hier erstmal eine Variante die ohne diesen Schritt auskommt und die auch auf das Zellenformat nicht angewiesen ist.
Sie liefert auch gleich das Range-Objekt als Ergebnis mit dem direkt weiter gearbeitet werden kann:

Sub tr\_test()
Dim dblSearch As Double
Dim rngFind As Range

 With ThisWorkbook.Worksheets("Tabelle1")
 dblSearch = Day(Range("Anfangsdatum").Value) - 6
 MsgBox ("Zu findende Zelle: " \_
 & .Range("H1").Value & vbCrLf \_
 & "Suchwert: " & dblSearch & vbCrLf \_
 & "Suchwert-Type: " & TypeName(dblSearch))
 Set rngFind = .Range("A1:AN1").Find(dblSearch, \_
 LookIn:=xlValues, \_
 SearchDirection:=xlNext)
 MsgBox rngFind.Address
 End With
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Datum und Find

Hier erstmal eine Variante die ohne diesen Schritt auskommt
und die auch auf das Zellenformat nicht angewiesen ist.
Sie liefert auch gleich das Range-Objekt als Ergebnis mit dem
direkt weiter gearbeitet werden kann:

Sub tr_test()
Dim dblSearch As Double
Dim rngFind As Range

With ThisWorkbook.Worksheets(„Tabelle1“)
dblSearch = Day(Range(„Anfangsdatum“).Value) - 6
MsgBox ("Zu findende Zelle: " _
& .Range(„H1“).Value & vbCrLf _
& "Suchwert: " & dblSearch & vbCrLf _
& "Suchwert-Type: " & TypeName(dblSearch))
Set rngFind = .Range(„A1:AN1“).Find(dblSearch, _
LookIn:=xlValues, _
SearchDirection:=xlNext)
MsgBox rngFind.Address
End With
End Sub

Grüezie Thomas,

da geschieht doch der gleiche Fehler wie bei Jens.
Es wird immer G1 gefunden, egal ob in A7 der 1,8, der 1.9, … steht.

Kann doch irgendwie nicht sein daß man da nicht mit Find allein hinkommt sondern ggfs. mit Hilfszeile o.ä. oder match oder sonstwas rangehen muß.

Erich hat mir Links zu langen Beitragsfolgen in einem Forum zu Find und Datum gegeben, die muß ich erst noch alles sichten, viel Stoff :smile:
Er war an den Diskussionen auch aktiv, hier mal ein Code von ihm, wie ersichtlich ging es da wohl um eine Anfrage die einen Tick anders ist als hier aber interessant ist das Ergebnis des Codes allemal.

Für interessierte Mitleser. So läuft der Code in XL 2007.
Für XL 2000 muß man den dreizeiligen Find-Befehl entfernen und den auskommentierten benutzen, denn XL 2000 kennt kein Searchformat.
In XL 2003 weiß ich das nicht, siejht man ja.

Option Explicit

Sub TestFind()
 Dim rngF As Range, lngZ As Long
 Columns(2).Clear

 Cells(5, 2).Formula = "=1.11/2"
 DoIt xlWhole, lngZ
 DoIt xlPart, lngZ

 Cells(5, 2).NumberFormat = "0"
 DoIt xlWhole, lngZ
 DoIt xlPart, lngZ

 Cells(5, 2).NumberFormat = "0.0"
 DoIt xlWhole, lngZ
 DoIt xlPart, lngZ

 Cells(5, 2).NumberFormat = "0.00"
 DoIt xlWhole, lngZ
 DoIt xlPart, lngZ

 Cells(5, 2).NumberFormat = "0.000"
 DoIt xlWhole, lngZ
 DoIt xlPart, lngZ

 Cells(5, 2).NumberFormat = "0.0000"
 DoIt xlWhole, lngZ
 DoIt xlPart, lngZ
End Sub

Sub DoIt(enuWhole As XlLookAt, zz As Long)
 Dim rngF As Range
' Set rngF = Columns(2).Find(What:=Cells(5, 2).Value, After:=Cells(1, 2), LookIn:=xlValues, \_
' LookAt:=enuWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, \_
' MatchCase:=False)
 Set rngF = Columns(2).Find(What:=Cells(5, 2).Value, After:=Cells(1, 2), LookIn:=xlValues, \_
 LookAt:=enuWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, \_
 MatchCase:=False, SearchFormat:=False)
 zz = zz + 1
 Cells(zz, 4) = "'" & Cells(5, 2).NumberFormat
 Cells(zz, 5) = IIf(enuWhole = xlWhole, "xlWhole", "xlPart")
 If rngF Is Nothing Then
 Cells(zz, 6) = "Nein"
 Else
 Cells(zz, 6) = rngF.Address
 End If
End Sub

Gruß
Reinhard

Grüezi Reinhard

da geschieht doch der gleiche Fehler wie bei Jens.
Es wird immer G1 gefunden, egal ob in A7 der 1,8, der 1.9, …
steht.

Jo, habe ich auch nicht anders behauptet… :wink:

Kann doch irgendwie nicht sein daß man da nicht mit Find
allein hinkommt sondern ggfs. mit Hilfszeile o.ä. oder match
oder sonstwas rangehen muß.

Ja, aber Datum ist halt ein wenig speziell, leider… :wink:

Erich hat mir …

Kennen wir Erich?

Hier aber ein Code, der das Format der ersten Zeile auf das Datumsformat der Such-Zelle umsetzt und dann die Zelle findet:

Sub tr\_test()
Dim dblFind As Double
Dim rngFund As Range
Dim strFormat As String

 With ThisWorkbook.Worksheets("Tabelle1")

 dblFind = Range("Anfangsdatum").Value - 6
 With .Range("1:1")
 strFormat = .Range("A1").NumberFormat
 .NumberFormat = "General"
 .Columns.AutoFit
 Set rngFund = .Find(dblFind, \_
 LookIn:=xlValues, \_
 SearchDirection:=xlNext)

 .NumberFormat = strFormat
 .Columns.ColumnWidth = 2.86
 .Columns(1).ColumnWidth = 11
 End With
 End With
 If Not rngFund Is Nothing Then
 MsgBox rngFund.Address
 End If
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Einzige Möglichkeit: Zellformat ändern? Echt?
Hallo Thomas,

Hier aber ein Code, der das Format der ersten Zeile auf das
Datumsformat der Such-Zelle umsetzt und dann die Zelle findet:

Sub tr_test()
Dim dblFind As Double
Dim rngFund As Range
Dim strFormat As String

With ThisWorkbook.Worksheets(„Tabelle1“)

dblFind = Range(„Anfangsdatum“).Value - 6
With .Range(„1:1“)
strFormat = .Range(„A1“).NumberFormat
.NumberFormat = „General“
.Columns.AutoFit
Set rngFund = .Find(dblFind, _
LookIn:=xlValues, _
SearchDirection:=xlNext)

.NumberFormat = strFormat
.Columns.ColumnWidth = 2.86
.Columns(1).ColumnWidth = 11
End With
End With
If Not rngFund Is Nothing Then
MsgBox rngFund.Address
End If
End Sub

Das ist aber eine sehr holprige Lösung, und ich könnte mir denken, daß das mit Spalte-breiter, Spalte-wieder-schmaler das ein oder andere Layout zerschießt (selbst wenn man die korrekte Spalte vorher ausliest, ablegt und hinterher fürs Schmalmachen verwendet).

Es muß doch eine Möglichkeit geben, mit .find direkt, also ohne Formatanpassung des Suchbereichs an die zugrundeliegenden Zahlenwerte heranzukommen?

viele grüße
JayKay

Salu Thomas, salu Jens,

Das ist aber eine sehr holprige Lösung, und ich könnte mir
denken, daß das mit Spalte-breiter, Spalte-wieder-schmaler das
ein oder andere Layout zerschießt (selbst wenn man die
korrekte Spalte vorher ausliest, ablegt und hinterher fürs
Schmalmachen verwendet).

Diese Bedenken habe ich auch. Aber ich werde es mal testen.

Es muß doch eine Möglichkeit geben, mit .find direkt, also
ohne Formatanpassung des Suchbereichs an die zugrundeliegenden
Zahlenwerte heranzukommen?

Na, wenn Thomas sich die Mühe macht, einen derartige Workaround als Script auszuformulieren habe ich die Befürchtung, daß es tatsächlich nicht direkt geht. Was allerdings einen absolut super-oberdringenden Handlungsbedarf für die Entwickler darstellt.

Danke Thomas, für Deine Hilfe. Aber auch wenn meine Testversuche erstmal keine Nachteile fürs Layout ergeben, ist mir das zu unsicher. Ich werde halt in VBA-Namen eine Hilfszeile mit 0,5 pt großem, vollausgeschriebenen Datum einfügen :o(

Viele Grüße und nochmals ganz lieben Dank für all Eure Hilfe. Es mag schwülstig klingen, aber ich bin wirklich froh, daß es Euch gibt :o)

-Rob.

Ich werde halt in VBA-Namen eine
Hilfszeile mit 0,5 pt großem, vollausgeschriebenen Datum
einfügen :o(

Hallo Rob,

probiers dann eher so:

Sub test2()
MsgBox Cells(1, DateDiff(„d“, Range(„A1“), Range(„Anfangsdatum“) - 6) + 1).Address(0, 0)
End Sub

oder

Sub test3()
MsgBox Cells(1, Application.Match(CDbl(Range(„Anfangsdatum“) - 6), Rows(1), 0)).Address(0, 0)
End Sub

Gruß
Reinhard

1 „Gefällt mir“

Grüezi Thomas,

da geschieht doch der gleiche Fehler wie bei Jens.
Es wird immer G1 gefunden, egal ob in A7 der 1,8, der 1.9, …
steht.

Jo, habe ich auch nicht anders behauptet… :wink:

Ui, vor dem Code hattest du noch was geschrieben? Sorry, nicht groß gelesen :smile:)
Ich war grad im/am Testen drin von Code von hier, von wo anders und eigenem Code da habe ich den schwupps erstmal getestet ohne da groß zu lesen was dabei stand *gg*

Kann doch irgendwie nicht sein daß man da nicht mit Find
allein hinkommt sondern ggfs. mit Hilfszeile o.ä. oder match
oder sonstwas rangehen muß.

Ja, aber Datum ist halt ein wenig speziell, leider… :wink:

Jaaa, so ist es.

Erich hat mir …

Kennen wir Erich?

Ja, nein, weiß nicht. Er war früher hier, ein netter hilfsbereiter wie Du und ich (und einige hier) und auch Wissensdurstiger in Vba und Excel.

Hier aber ein Code, der das Format der ersten Zeile auf das
Datumsformat der Such-Zelle umsetzt und dann die Zelle findet:

Gruß
Reinhard

Funktioniert: Application.Match - Danke!
Salu Reinhard,

Sub test2()
MsgBox Cells(1, DateDiff(„d“, Range(„A1“),
Range(„Anfangsdatum“) - 6) + 1).Address(0, 0)
End Sub

oder

Sub test3()
MsgBox Cells(1, Application.Match(CDbl(Range(„Anfangsdatum“) -
6), Rows(1), 0)).Address(0, 0)
End Sub

Na sowas… Besten Dank :o) Klappt so bestens.

Nochmals danke & bestliche Grüße
-Rob.