Freigeben über

Excel VBA Problem mit Find

Anonym
2019-08-12T11:59:16+00:00

Hallo, NG,

ich habe totale Probleme mit Find - Excel liefert einfach nicht die richtigen Ergebnisse, hier mein gekürzter Code:

Function IstArbeitsTag(rngDatum as Range) as Integer

Set rngFeiertage = Range("Holidays").Resize(,1)

IstArbeitsTag = 1

set rngIstFeiertag = rngFeiertage.Find(What:=rngDatum.Value, LookIn:=xlValues)

If not rngIstFeiertag Is Nothing then

   IstArbeitsTag = 0

End If

End Function

Ich bekomme keine Fehlermeldung, sondern das Teil rechnet einfach falsch. Mit rngFeiertage greife ich auf die Spalte der Holidays-Tabelle zu, in der die Feiertagsdaten stehen (Spalte 1).  Wenn ich die Function teste, reagiert sie überhaupt nicht auf irgendwelche Feiertage, also wenn in rngDatum (immer nur eine Zelle) der 3.10.2019 steht, müsste die Function doch eigentlich ins If-Statement springen und IstArbeitsTag auf 0 setzen. Das passiert aber nicht. 

Sieht jemand von euch den Grund, warum das nicht funktioniert? VBA Find sieht eigentlich nicht so schwierig aus.

Gruß

Susanne

Microsoft 365 und Office | Excel | Für Zuhause | Windows

Gesperrte Frage. Diese Frage wurde aus der Microsoft-Support-Community migriert. Sie können darüber abstimmen, ob sie hilfreich ist, aber Sie können keine Kommentare oder Antworten hinzufügen oder der Frage folgen.

0 Kommentare Keine Kommentare
{count} Stimmen

5 Antworten

Sortieren nach: Am hilfreichsten
  1. Anonym
    2019-08-12T14:59:26+00:00

    Hallo Susanne,

    es hängt nicht an der Excel-Version.

    Kann es sein, dass im Bereich Holidays die Datumswerte aus Formeln bestehen? Kann es sein, dass entweder bei den Arbeitstagen oder bei den Feiertagen das Format nicht übereinstimmt?

    Bei mir und mit festen Werten funktionieren beide Versionen.

    Claus

    0 Kommentare Keine Kommentare
  2. Anonym
    2019-08-12T14:40:05+00:00

    Nachtrag:

    ich glaube, es liegt tatsächlich an meinem Firmenrechner, habe das Ganze jetzt an meinem PC versucht, indem ich einfach eine Datumsreihe eingegeben und eine kleine Tabelle Holidays dazugepackt habe, da funktioniert es einwand frei. Allerdings habe ich Excel 365 auf meinem PC, während der Arbeits-PC 2010 hat.

    0 Kommentare Keine Kommentare
  3. Anonym
    2019-08-12T14:02:17+00:00

    Hallo, Claus,

    leider hilft mir das nicht weiter. Die Feiertagsnamen sind eigentlich völlig wurscht, nur wenn ein Anwender neue Feiertage eingeben muss, hilft denen das. Daher ist Resize richtig, in der ersten Spalte stehen die Feiertags-Datumswerte, mehr brauche ich nicht für mein Find. Und Zählenwenn hilft hier auch nicht weiter, es geht nicht um die Anzahl der Feiertage, sondern es muss für jeden Tag im Jahr geklärt werden, ob Feiertag oder nicht. Vielleicht dazu zur Info - es handelt sich um einen Produktionsplan für verschiedene Standorte, je nach Standort wird 5, 6 oder 7 Tage gearbeitet (glücklicherweise planen die keine Kurzarbeit ;-)). Wenn 5 Tage pro Woche gearbeitet wird, wird natürlich auch nur an diesen 5 Tagen produziert, wenn 7 Tage pro Woche, dann gibt es keinen freien Tag, es sei denn, es handelt sich um einen gesetzlichen Feiertag... Also abhängig davon, wo die jeweilige Maschine steht, muss berechnet werden, ob sie produziert oder nicht.

    Du schreibst, ich solle If so machen: 

    If Not rngistfeiertag Is Nothing Then

       IstArbeitsTag = 0

    Else

        IstArbeitsTag = 1

    End If

    Das Else verstehe ich nicht, ich habe gleich zu Anfang IstArbeitsTag auf 1 gesetzt, von daher soll die Function den Wert ja nur ändern, wenn es ein Feiertag ist, d. h. wenn er über If hinweggeht, weil die Bedingung nicht erfüllt ist, bleibt der Wert doch auf 1.

    Wenn ich mit F8 durch den Code gehe, bleibt rngIstFeiertag auf Nothing stehen, obwohl ich beim Testen explizt auf den 3.10. verweise, der auch in der Tabelle steht. Habe jetzt sogar eine weitere Spalte eingefügt, die aus dem Datum einen formatierten Text macht. Auch erfolglos.

    Das Problem ist

    Set rngIstFeiertag = rngfeiertage.Find(rngDatum.Text)

    Wenn ich da mit F8 drübergehe, bleibt der Wert von rngIstFeiertag

    auf Nothing, obwohl der 3.10. eingestellt ist. 

    Gruß 

    Susanne

    0 Kommentare Keine Kommentare
  4. Anonym
    2019-08-12T13:16:22+00:00

    Hallo Susanne,

    hier noch ein Nachtrag:

    Was du in der Datumszelle siehst, ist rngDatum.Text. rngDatum.Value wäre für den 03.10.2019 die Zahl 43741.

    Du kannst dann auch über die Find-Methode den Feiertag finden. musst dann nur rngDatum.Text verwenden:

    Function IstArbeitsTag(rngDatum As Range) As Integer

    Set rngfeiertage = Range("Holidays").Offset(, 1)

    Set rngistfeiertag = rngfeiertage.Find(rngDatum.Text)

    If Not rngistfeiertag Is Nothing Then

       IstArbeitsTag = 0

    Else

        IstArbeitsTag = 1

    End If

    End Function

    Claus

    0 Kommentare Keine Kommentare
  5. Anonym
    2019-08-12T12:18:32+00:00

    Hallo Susanne,

    die Feiertagsnamen stehen in Spalte A und das zugehörige Datum in Spalte B?

    Dann ist das nicht RESIZE sondern OFFSET.

    Probiere es doch einfach mit ZÄHLENWENN:

    Function IstArbeitsTag(rngDatum As Range) As Integer

    Set rngfeiertage = Range("Holidays").Offset(, 1)

    If Application.CountIf(rngfeiertage, rngDatum) > 0 Then

       IstArbeitsTag = 0

    Else

        IstArbeitsTag = 1

    End If

    End Function

    Claus

    0 Kommentare Keine Kommentare