Find-Methode mit Datum

  • Excel

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Find-Methode mit Datum

    Hallo Zusammen,

    ich habe ein Problem mit der Find-Methode:
    in der Zelle( 20,14) hab ich ein Datum und eine Uhrzeit zusammen addiert. Da steht dann z.b. 31-10-14 15:30 (Zelle habe ich so formaritert)
    Nun möchte ich diesen Wert in der Zeile 8 suchen (auch dort wurden Datum und Uhrzeit addiert, beide haben das gleiche Format).
    Nachdem der Wert in der Spalte gefunden wurde brauche ich die Nummer der Spalte und muss diese dann einer Variable zuweisen.

    ich habe das ganze zuvor mit einer for 1 to ... Schleife. gemacht aber die Lauftzeit war dann irgenwann zu lange. Desshalb dachte ich es wäre schneller mit der Find-Methode zu arbeiten. Leider klappt das mit der Find-Methode mit dem Datum- Wert nicht...mit Wörtern oder Zahlen funktioniert das Programmm.


    Kann mir jemand weiterhelfen? Ich bin auch nicht aug die Find-Methode angewiesen aber mit For-Schleifen dauerte es einfach zu lange...
    Bisheriger Code oder besser noch eine Datei hier anhängen, wo man das testen kann. Mir fehlt immer die Motivation selbst erst sowas "stricken" zu müssen :)
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    ​Dim bereich As Range
    Set bereich = Sheets("Planung").Rows(8).Find(Cells(18, 14).Value, LookIn:=xlFormulas)
    If bereich Is Nothing Then
    MsgBox "Datum nicht gefunden"
    Else
    MsgBox "Spaltenummer" & bereich.Column & " !"
    End If


    so hab ich es jetzt mal probiert.
    Anbei auch noch die Datei.
    Dateien
    • Planung.zip

      (495,16 kB, 219 mal heruntergeladen, zuletzt: )
    Das folgende funzt bei mir:

    Quellcode

    1. Private Sub los()
    2. Dim sDate As Date
    3. Dim zDate As Date
    4. Dim sZeile As Long
    5. Dim sSpalte As Long
    6. If IsDate(Cells(18, 14).Value) Then
    7. sDate = CDate(Cells(18, 14).Value)
    8. sZeile = 8
    9. With Sheets("Planung")
    10. For sSpalte = 1 To .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    11. If IsDate(.Cells(sZeile, sSpalte).Value) Then
    12. zDate = CDate(.Cells(sZeile, sSpalte).Value)
    13. If sDate = zDate Then
    14. MsgBox "Spaltenummer: " & sSpalte & "!"
    15. Exit Sub
    16. End If
    17. End If
    18. Next
    19. End With
    20. MsgBox "Datum nicht gefunden"
    21. End If
    22. End Sub


    Edit:
    Code noch etwas "optimiert"
    Oben suchst Du mit Äpfel nach Birnen, bzw. Value in xlFormula. Ein cells().formula brachte aber auch kein Ergebnis. So lange dauert das Suchen bei mir nicht. Und wenn doch, ist doch egal auf der Arbeit. Geht in jedem Fall noch schneller als zu Fuss suchen ;)

    Es ging auch ohne das zweite cdate und ohne die Prüfung davor, ob der Wert ein Datum ist. Aber so finde ich es etwas sauberer. Das Weglassen würde die Abarbeitung des Codes etwas beschleunigen.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „peterfido“ ()

    peterfido schrieb:

    Oben suchst Du mit Äpfel nach Birnen, bzw. Value in xlFormula
    Klingt komisch, aber bei Datum funktioniert's, da bei xlFormulas wohl der echte numerische Datumswert ermittelt wird, während bei xlValues die Zelle nur gefunden wird, wenn der Suchstring im Systemformat angegeben wird(#mm/dd/yyyy#)

    Ich hab's auch nie verstanden, aber irgendwann habe ich mir gemerkt, dass man bei Datum in xlFormulas suchen muss.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Bei mir hatte er da nichts gefunden. (Excel 2007), deswegen habe ich mal weiterprobiert, bis ich es hatte. Möglich, dass da noch mehr Faktoren eine Rolle spielen.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Danke der Code funktioniert einwandfrei!
    ich hab jetzt etwas weitergebastelt, aber bin immer noch bei einer Laufzeit von 40 Sekunden +....

    Gibt es eine Möglichkeit den Programm-Ablauf zu beschleunigen?

    Visual Basic-Quellcode

    1. Dim sDate As Date
    2. Dim zDate As Date
    3. Dim sZeile As Long
    4. Dim sSpalte As Long
    5. Dim z As Integer
    6. Dim addiere As Integer
    7. For k = 18 To 30
    8. z = 0
    9. addiere = Cells(k, 18).Value '= Anzahl der Stunden(Stunden *2) weil in die Zeitrechnung mit halben Stunden rechnet
    10. sSpalte = 0
    11. If IsDate(Cells(k, 14).Value) Then
    12. sDate = CDate(Cells(k, 14).Value)
    13. sZeile = 8
    14. With Sheets("Planung")
    15. For sSpalte = 1 To .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    16. If IsDate(.Cells(sZeile, sSpalte).Value) Then
    17. zDate = CDate(.Cells(sZeile, sSpalte).Value)
    18. If sDate = zDate Then
    19. If Cells(k, 27).Value = "X" Then 'in welcher Schich soll gearbeitet werden
    20. For j = sSpalte To 10000
    21. If Cells(9, j) = "1" Then 'Suche nach dem nächsten Möglichen Starttermin in Schicht 1
    22. z = z + 1 'Anzahl der Schleifendurchläufe
    23. Cells(k, 15).Value = Cells(5, j).Value ' Schreibe die Startuhrzeit in Celle (k,15)
    24. If z > addiere + 1 Then GoTo ort2 ' Steige aus wenn die Anzahl der anzahl der schleifen > Stunden +1
    25. If Cells(k, 32) = "1" Then 'Auf welcher Maschine wird gearbeitet
    26. Cells(15, j).Select
    27. Cells(15, j).Value = Cells(k, 1).Value ' Schreibe Positionsnummer in markiete Zelle brauche ich für ein Diagramm
    28. With Selection.Interior 'Färbe die Zelle farbig
    29. .ColorIndex = 5
    30. End With
    31. Cells(k, 15).Value = Cells(7, j).Value ' Schreibe das EndDatum in die Celle (k,15)
    32. Cells(k, 16).Value = Cells(7, j).Value ' Schreibe die EndUhrzeit in die Celle(k,16)
    33. ' Kommentar in die Zelle einfügen
    34. strCom = Cells(8, j).Value & Cells(k, 4).Value
    35. With Cells(15, j)
    36. .ClearComments
    37. .AddComment strCom
    38. End With
    39. End If
    40. End If
    41. Next j
    42. End If
    43. End If
    44. End If
    45. Next
    46. End With
    47. 'MsgBox "Datum nicht gefunden"
    48. End If
    49. ort2:
    50. Next k
    51. Application.ScreenUpdating = True
    52. End Sub


    Die Problematik bei mir ist, dass sehr viele Kombinationsmöglichkeiteng gibt: z.B Schicht 1 mit Maschine 1-3, das gleiche mit Schicht zwei und drei und natürlich muss ich die Schichten zb 1 und 2 oder 2 und 3 oder 1 und 3 oder 1 und 2 und 3 auch kombinieren können.

    Ich bin nicht auf der Suche nach einem kompletten Programm mir wäre schon geholfen, wenn der gepostet Code keine Ewigkeit brauchen würde.
    Dateien
    • Planung.zip

      (563,77 kB, 216 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „saibot231“ ()

    Die 10000 evtl. auf den tatsächlich genutzten Bereich begrenzen. Dann ein Goto um zu einem Next zu springen. Also Nein, das geht auch besser. Mit

    Quellcode

    1. exit for
    brichst Du eine Schleife vorzeitig ab... Du kannst auch die automatische Berechnung während das Makro läuft abschalten. Hinterher wieder aktivieren nicht vergessen.

    Fehler abfangen kann auch nicht schaden.

    Quellcode

    1. On error goto Fehler


    Unten am Ende des Makros dann

    Quellcode

    1. Fehler:
    2. if err.number<>0 then
    3. ...Fehlerbehandlung
    4. err.clear
    5. end if
    6. application.screenupdating=true
    7. application.calculation = xlCalculationAutomatic
    8. end sub


    Edit:
    wenn bestimmte Bereiche immer wieder durchlaufen werden, dann ist die Ausführung aus dem RAM irgendwann schneller. Dazu z.B. alle Werte der Spalte 9 in Variablen abspeichern und diese dann abfragen. Wobei da dann auch wieder einiges zu beachten ist...
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „peterfido“ ()

    Danke schon mal!

    Die 10000 evtl. auf den tatsächlich genutzten Bereich begrenzen.

    ich ermittle unter anderm mit dem Makro den Termin der Fertigstellung, dh. ich weiss nicht wo mein Bereich endet. Hast du da eine besser Idee? Eigentlich láuft diese Schleife ja sowieso nur bis alle Stunden markiert sind und dann steige ich aus (so dachte ich funktioniert die schleife)?




    ... Du kannst auch die automatische Berechnung während das Makro läuft abschalten. Hinterher wieder aktivieren nicht vergessen.
    das mit der autmatischen Berechnung hilft mir unglaublich, das kannte ich bisher noch nicht!


    Fehler abfangen kann auch nicht schaden.

    Quellcode

    1. On error goto Fehler

    Da musst du mir erklären was Fehler abfangen heisst und ich das an welcher Stelle (ON error goto Fehler) einsetzen soll, damit es richtig positioniert ist


    Edit:
    wenn bestimmte Bereiche immer wieder durchlaufen werden, dann ist die Ausführung aus dem RAM irgendwann schneller. Dazu z.B. alle Werte der Spalte 9 in Variablen abspeichern und diese dann abfragen. Wobei da dann auch wieder einiges zu beachten ist...
    [/quote]
    hört sich interessant an, muss mich dazu aber erst noch einlesen!

    Schleifen lasse ich grundsätzlich nur bis zur letzten genutzten Zeile / Spalte (je nachdem) durchlaufen. Wenn er nichts findet, ackert er sonst die 10.000 Stück durch. (Siehe in meinem Code die Usedrange.coloumn). Die Schleife kann man natürlich auch erst später beginnen, wenn man weiß, dass die Daten eh erst ab Spalte 10 beginnen. Das würde bei 1.000 Zeilen wieder 10.000 vergleiche sparen.

    Wenn Fehler auftreten können, z.B. weil zwei ungleiche Werttypen addiert werden sollen oder so, dann kann man vorher sowas mit

    Quellcode

    1. on error goto ...
    abfangen. Der Vorteil ist, dass das Makro nicht mit Pauken und Trompeten mit einer hässlichen Fehlermeldung abschmiert und darüber hinaus die automatische Berechnung und Fensteraktualisierung nicht mehr zurückgestellt wird.

    Man kann auch

    Quellcode

    1. on error resume next
    nutzen, damit Fehler ignoriert werden. Da bekommt man aber evtl. Fehler nicht mit und die Ergebnisse passen unter Umständen nicht. Das nutze ich öfter bei Benutzereingaben wie z.B. Pfade oder so. Direkt nach der Eingabe prüfe ich, ob da ein Fehler aufgetreten ist, z.B. um das Makro abzubrechen

    Quellcode

    1. if err.number <>0 then err.clear: exit sub


    Mit dem RAM arbeiten ist relativ einfach. Einmal ein Array erstellen und dann alle Werte einmal darin ablegen. Danach nur noch mit dem Array arbeiten. Geht bei vielen Durchläufen viel schneller, als jedesmal die Zellen auszulesen.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hallo ihr Beiden,

    ich hab jetzt ein bisschen rumprobiert und mitlerweile funktioniert das Programm so wie ich es will.
    Jedoch habe ich noch folgendes Problem:
    wenn ich den Makro starte läuft dieser einwandfrei durch, jedoch muss ich >1 mal auf den makro clicken, dass er auch wirklich alles kalkuliert und in die Zellen einträgt. An was kann das liegen?
    Wenn ihr das ausprobieren wollt, einfach mal die Dauer der Stunden in der Excell-Datei verändern und den Makro starten.
    (ich weiss das ich das goto noch drin habe, aber ich weiss nicht wie ich das sonst anders löse.....)

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()
    2. Application.ScreenUpdating = False
    3. Application.Calculation = xlCalculationManual 'automat.Berechnung ausschalten
    4. Dim sDate As Date
    5. Dim zDate As Date
    6. Dim sZeile As Long
    7. Dim sSpalte As Long
    8. Dim z As Integer
    9. Dim addiere As Integer
    10. Dim t As Double
    11. t = Timer
    12. On Error GoTo Fehler
    13. letztezeile = ActiveSheet.Cells(1048576, 1).End(xlUp).Row 'letzte Zeile in Spalte 1 finden
    14. 'Sortieren der Reihenfolge
    15. Rows("18:" & letztezeile).Select
    16. ActiveWorkbook.Worksheets("Planung").Sort.SortFields.Clear
    17. ActiveWorkbook.Worksheets("Planung").Sort.SortFields.Add Key:=Range("A18:A40" _
    18. ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    19. With ActiveWorkbook.Worksheets("Planung").Sort
    20. .SetRange Range("18:" & letztezeile)
    21. .Header = xlGuess
    22. .MatchCase = False
    23. .Orientation = xlTopToBottom
    24. .SortMethod = xlPinYin
    25. .Apply
    26. End With
    27. For k = 18 To letztezeile
    28. If Cells(k, 1).Interior.ColorIndex = xlNone Then
    29. z = 0
    30. addiere = Cells(k, 18).Value '= Anzahl der Stunden(Stunden *2) weil in die Zeitrechnung mit halben Stunden rechnet
    31. sSpalte = 0
    32. If IsDate(Cells(k, 14).Value) Then
    33. sDate = CDate(Cells(k, 14).Value)
    34. sZeile = 8
    35. With Sheets("Planung")
    36. For sSpalte = 1 To .UsedRange.SpecialCells(xlCellTypeLastCell).Column
    37. If IsDate(.Cells(sZeile, sSpalte).Value) Then
    38. zDate = CDate(.Cells(sZeile, sSpalte).Value)
    39. If sDate = zDate Then
    40. Range(Cells(15, sSpalte), Cells(17, 16100)).Select ' Bereich Kommentarfrei und farbfrei machen
    41. Selection.ClearContents
    42. With Selection
    43. .ClearComments
    44. .Interior.Color = xlNone
    45. End With
    46. ' 1 und2 und 3 Schicht
    47. If Cells(k, 28).Value = "x" And Cells(k, 29).Value = "x" And Cells(k, 27).Value = "x" Then 'in welcher Schich soll gearbeitet werden
    48. For j = sSpalte To sSpalte + 300
    49. If Cells(11, j) = "5" Then 'Suche nach dem nächsten Möglichen Starttermin in Schicht 1
    50. z = z + 1 'Anzahl der Schleifendurchläufe
    51. Cells(k, 15).Value = Cells(5, j).Value ' Schreibe die Startuhrzeit in Celle (k,15)
    52. If z = addiere + 1 Then
    53. Cells(k, 15).Value = Cells(5, j).Value
    54. Cells(k, 16).Value = Cells(7, j).Value
    55. If Cells(k + 1, 2) = "x" Then
    56. Cells(k + 1, 11) = Cells(k, 15)
    57. Cells(k + 1, 12) = Cells(k, 16).Value + TimeSerial(0, 30, 0)
    58. End If
    59. GoTo ort2
    60. End If
    61. If Cells(k, 32) = "1" Then 'Auf welcher Maschine wird gearbeitet
    62. Cells(15, j).Select
    63. Cells(15, j).Value = Cells(k, 1).Value ' Schreibe Positionsnummer in markiete Zelle brauche ich für ein Diagramm
    64. With Selection.Interior 'Färbe die Zelle farbig
    65. .ColorIndex = 5
    66. End With
    67. Cells(k, 15).Value = Cells(7, j).Value ' Schreibe das EndDatum in die Celle (k,15)
    68. Cells(k, 16).Value = Cells(7, j).Value ' Schreibe die EndUhrzeit in die Celle(k,16)
    69. ' Kommentar in die Zelle einfügen
    70. strCom = Cells(8, j).Value & Cells(k, 4).Value
    71. With Cells(15, j)
    72. .ClearComments
    73. .AddComment strCom
    74. End With
    75. End If
    76. End If
    77. Next j
    78. End If
    79. ' 2 und 3 Schicht
    80. If Cells(k, 28).Value = "x" And Cells(k, 29).Value = "x" Then 'in welcher Schich soll gearbeitet werden
    81. For j = sSpalte To sSpalte + 300
    82. If Cells(10, j) = "4" Then 'Suche nach dem nächsten Möglichen Starttermin in Schicht 1
    83. z = z + 1 'Anzahl der Schleifendurchläufe
    84. Cells(k, 15).Value = Cells(5, j).Value ' Schreibe die Startuhrzeit in Celle (k,15)
    85. If z = addiere + 1 Then
    86. Cells(k, 15).Value = Cells(5, j).Value
    87. Cells(k, 16).Value = Cells(7, j).Value
    88. If Cells(k + 1, 2) = "x" Then
    89. Cells(k + 1, 11) = Cells(k, 15)
    90. Cells(k + 1, 12) = Cells(k, 16).Value + TimeSerial(0, 30, 0)
    91. End If
    92. GoTo ort2 ' Steige aus wenn die Anzahl der anzahl der schleifen > Stunden +1
    93. End If
    94. If Cells(k, 32) = "2" Then 'Auf welcher Maschine wird gearbeitet
    95. Cells(16, j).Select
    96. Cells(16, j).Value = Cells(k, 1).Value ' Schreibe Positionsnummer in markiete Zelle brauche ich für ein Diagramm
    97. With Selection.Interior 'Färbe die Zelle farbig
    98. .ColorIndex = 5
    99. End With
    100. Cells(k, 15).Value = Cells(7, j).Value ' Schreibe das EndDatum in die Celle (k,15)
    101. Cells(k, 16).Value = Cells(7, j).Value ' Schreibe die EndUhrzeit in die Celle(k,16)
    102. ' Kommentar in die Zelle einfügen
    103. strCom = Cells(8, j).Value & Cells(k, 4).Value
    104. With Cells(16, j)
    105. .ClearComments
    106. .AddComment strCom
    107. End With
    108. End If
    109. End If
    110. Next j
    111. End If
    112. If Cells(k, 27).Value = "x" Then 'in welcher Schich soll gearbeitet werden
    113. For j = sSpalte To sSpalte + 300
    114. If Cells(9, j) = "1" Then 'Suche nach dem nächsten Möglichen Starttermin in Schicht 1
    115. z = z + 1 'Anzahl der Schleifendurchläufe
    116. Cells(k, 15).Value = Cells(5, j).Value ' Schreibe die Startuhrzeit in Celle (k,15)
    117. If z = addiere + 1 Then
    118. Cells(k, 15).Value = Cells(5, j).Value
    119. Cells(k, 16).Value = Cells(7, j).Value
    120. If Cells(k + 1, 2) = "x" Then
    121. Cells(k + 1, 11) = Cells(k, 15)
    122. Cells(k + 1, 12) = Cells(k, 16).Value + TimeSerial(0, 30, 0)
    123. End If
    124. GoTo ort2 ' Steige aus wenn die Anzahl der anzahl der schleifen > Stunden +1
    125. End If
    126. If Cells(k, 32) = "1" Then 'Auf welcher Maschine wird gearbeitet
    127. Cells(15, j).Select
    128. Cells(15, j).Value = Cells(k, 1).Value ' Schreibe Positionsnummer in markiete Zelle brauche ich für ein Diagramm
    129. With Selection.Interior 'Färbe die Zelle farbig
    130. .ColorIndex = 5
    131. End With
    132. Cells(k, 15).Value = Cells(7, j).Value ' Schreibe das EndDatum in die Celle (k,15)
    133. Cells(k, 16).Value = Cells(7, j).Value ' Schreibe die EndUhrzeit in die Celle(k,16)
    134. ' Kommentar in die Zelle einfügen
    135. strCom = Cells(8, j).Value & Cells(k, 4).Value
    136. With Cells(15, j)
    137. .ClearComments
    138. .AddComment strCom
    139. End With
    140. End If
    141. End If
    142. Next j
    143. End If
    144. End If
    145. End If
    146. Next
    147. End With
    148. ' MsgBox "Datum nicht gefunden"
    149. End If
    150. End If
    151. ort2:
    152. Next k
    153. Fehler:
    154. If Err.Number <> 0 Then
    155. Err.Clear
    156. End If
    157. Application.ScreenUpdating = True
    158. Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten
    159. MsgBox Timer - t & " sec", , "Makrolaufzeit"
    160. End Sub

    Dateien
    • Planung_neu.7z

      (1,09 MB, 174 mal heruntergeladen, zuletzt: )
    In Zeile 206 würde ich mal folgendes einsetzen:

    Visual Basic-Quellcode

    1. msgbox err.description, vbokonly+vbcritical, "Fehler:" & err.number


    Zwischendurch kannst Du Dir mittels debug.print Ausgaben in das Direktfenster geben lassen.

    Edit:
    Während der Entwicklung eines Makros schalte ich Fehler normal nicht ab. Wenn da einer auftaucht, kannst Du bequem in die entsprechende Zeile springen...
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „peterfido“ ()