perle66
Goto Top

Excel In einer Zeile Anfangs und Enddatum ermitteln

Hallo Zusammen,
vielleicht kann mir jemand helfen.
Ich habe eine Excel Tabelle (Urlaubsplan) in der in Spalte A Namen (Herr x,y,..) stehen, in Zeile 1 das fortlaufende Datum (01.01...31.07.). In Zeile 2 beim Namen x steht in irgendeiner Zelle ein U manchmal eins und manchmal mehrere hintereinander und dann irgendwo wieder. Es ist ein Urlaubsplan.
Ist es möglich die Daten auszulesen in der Form, dass vorn der Name steht, in der nächsten Spalte das Datum des ersten Urlaubstags und danach des letzten Urlaubstags?
Hier ein Bsp.
Datum 04.03. 05.03. 06.03. ... 16.04. 17.04. 18.04. 19.04. ... 20.07. 21.07. 22.07. 23.07...
Herr x U U U U U U U U
Herr y U U
Herr z U

Die Ausgabe sollte so aussehen:
Herr x 04.03. 06.03. leer 16.04. 19.04. leer 20.07.
Herr y 21.07. 22.07 leer
Herr z 20.07 leer

Das leer soll eine leere Zelle sein und zur Erkennung dienen, welche Urlaubstage zusammenhängen.

Ich hoffe, ich habe mich verständlich ausgedrückt. Erwähnen möchte ich auch, das ich von VBA und Makros so gut wie keine Ahnung habe.
Excel Version 2003 (11.0).
Vielen Dank schon jetzt für die Hilfe!

Content-Key: 195558

Url: https://administrator.de/contentid/195558

Printed on: April 20, 2024 at 01:04 o'clock

Member: bastla
bastla Dec 08, 2012 updated at 20:41:28 (UTC)
Goto Top
Hallo Perle66 und willkommen im Forum!

Wenn ich Deine etwas abenteuerliche Darstellung der Daten richtig interpretiere, sollte das etwa so gehen:
Sub Urlaubszusammenfassung()
Quelle = "Tabelle1" 'Name der Quelltabelle  
AbZeileQ = 1 'Zeile, in welcher die Datumswerte stehen  
AbSpalteQ = 1 'Spalte, in welcher die Mitarbeiternamen stehen  
Ziel = "Tabelle2" 'Name der Zieltabelle  
AbZeileZ = 1 'Zeile, ab welcher die Ergebnisdaten eingetragen werden sollen  
AbSpalteZ = 1 'Spalte, ab welcher die Ergebnisdaten eingetragen werden sollen  
Kennz = "U" 'Kennzeichen, nach welchem gesucht werden soll  

ZeileQ = AbZeileQ + 1 'Beginne in Quelltabelle in der Zeile mit erstem Mitarbeiter  
ZeileZ = AbZeileZ 'Beginne in der Zieltabelle in der ersten Ergebniszeile  
MA = Worksheets(Quelle).Cells(ZeileQ, AbSpalteQ).Value 'Mitarbeiternamen lesen  
Do While MA <> "" 'Solange ein Mitarbeitername gefunden wird, Schleife durchführen  
    SpalteQ = AbSpalteQ + 1 'Beginne in der Quelltabelle in der Spalte mit dem ersten Datumswert  
    SpalteZ = AbSpalteZ + 1 'Beginne in der Zieltabelle in der Spalte nach dem Mitarbeiternamen  
    Beginn = "" 'Beginndatum des Urlaubszeitraumes löschen  
    Worksheets(Ziel).Cells(ZeileZ, AbSpalteZ).Value = MA 'Mitarbeiternamen in vorgegebene Spalte der Zieltabelle übertragen  
    Dat = Worksheets(Quelle).Cells(AbZeileQ, SpalteQ).Value ' Datumswert aulsesen  
    Do While Dat <> "" 'Solange es noch Datumswerte gibt, Schleife wiederholen  
        If Worksheets(Quelle).Cells(ZeileQ, SpalteQ).Value = Kennz Then ' Wenn das Kennzeichen in der Zeile des MA gefunden wird ...  
            If Beginn = "" Then '... und nicht bereits ein Urlaubsbeginn voerher erkannt wurde ...  
                Worksheets(Ziel).Cells(ZeileZ, SpalteZ).Value = Dat ' ... Urlaubsbeginn in Zieltabelle eintragen und ...  
                Beginn = Dat ' ... Beginndatum zwischenspeichern  
                SpalteZ = SpalteZ + 1 'nächster Eintrag in Zieltabelle erfolgt in nächster Spalte  
            End If
        Else ' kein Urlaubstag  
            If Beginn <> "" Then ' Wenn laufender Urlaub ...  
                Ende = Worksheets(Quelle).Cells(AbZeileQ, SpalteQ - 1).Value ' ... als Enddatum den gestrigen Tag festlegen  
                If Beginn <> Ende Then ' Wenn Beginn und Ende unterschiedlich (mehrtätiger Urlaub) ...  
                    Worksheets(Ziel).Cells(ZeileZ, SpalteZ).Value = Ende ' ... Enddatum eintragen  
                    'SpalteZ = SpalteZ + 1 'nächster Eintrag in Zieltabelle erfolgt in nächster Spalte  
                End If
                Beginn = "" 'Beginndatum des Urlaubszeitraumes löschen  
                SpalteZ = SpalteZ + 2 'nächster Eintrag in Zieltabelle erfolgt in übernächster Spalte - dadurch leere Zelle(n) nach Urlaub  
            End If
        End If
        SpalteQ = SpalteQ + 1 'nächsten Tag des Jahres betrachten ...  
        Dat = Worksheets(Quelle).Cells(AbZeileQ, SpalteQ).Value '... und dessen Datumswert zwischenspeichern  
    Loop 'alle Datumswerte (des Jahres) durch  
    ZeileQ = ZeileQ + 1 'nächste Zeile für Mitarbeiter in Quelltabelle  
    ZeileZ = ZeileZ + 1 'nächste Zeile für Mitarbeiter in Quelltabelle  
    MA = Worksheets(Quelle).Cells(ZeileQ, AbSpalteQ).Value'Mitarbeiternamen lesen  
Loop 'alle Mitarbeiter durch  
MsgBox "Fertig."  
End Sub
Vorausgesetzt habe ich für die Quelltabelle, dass zwischen den Datumswerten und den Namen keine Zeile frei bleibt und zwischen den Namen und Datumswerten es auch keine leere Spalte gibt.

Für die Zieltabelle müsste ich ggf noch ein Löschen der bereits vorhandenen Einträge einbauen ...

Grüße
bastla

[Edit] Zeilen 31 und 34 angepasst, sodass für jeden Urlaub insgesamt 3 Zellen verwendet werden [/Edit]
Member: Perle66
Perle66 Dec 08, 2012 at 19:56:24 (UTC)
Goto Top
Hallo bastla,
Du hast meine abenteuerliche Darstellung super verstanden. Ich hatte die U auch unter dem jeweiligen Tag stehen, aber die Leerzeichen sind auf einmal alle verschwunden.
Hat Dir schon mal jemand gesagt, dass Du Spitze bist! Echt Klasse wie es funktioniert!
Eine Bitte hätte ich noch, kriegst Du es hin, das wenn nur ein Urlaubstag vorhanden ist, zwei leere Zellen eingefügt werden, damit der Urlaubsbeginn immer untereinander steht.
Ich kenne mich zwar mit Formeln in Excel aus, aber für VBA hatte ich bisher keine Zeit.
Schöne das Leute wie Dich gibt! Echt Spitze, wie Du das so schnell aus dem Ärmel geschüttelt hast!!!
Viele Grüße
Perle
Member: bastla
bastla Dec 08, 2012 at 20:42:27 (UTC)
Goto Top
Hallo Perle66!

Freut mich, wenn's soweit passt ... face-smile

Die gewünschte Änderung habe ich gleich oben vorgenommen.

Grüße
bastla
Member: Perle66
Perle66 Dec 08, 2012 at 21:11:25 (UTC)
Goto Top
Hallo bastla,
schade, das funktioniert leider nicht. Es werden jetzt bei einem Urlaubstag 2 leere Zellen eingefügt und auch bei einem Zeitraum 2 leere Zellen eingefügt. Bei einem Zeitraum dürfte jedoch nur eine leere Zelle eingefügt werden, damit der Beginn des Urlaubs immer untereinander steht.
Hast Du noch eine Idee? Vielleicht habe ich ja auch was übersehen. Hab nur Zeile 34 angepasst, statt +1 jetzt plus 2.
Viele Grüße
Perle
Member: bastla
bastla Dec 08, 2012 at 21:17:37 (UTC)
Goto Top
Hallo Perle66!

Die Zeile 31 musst Du auch noch entweder "auskommentieren" (durch einen vorangestellten Apostroph wird die Zeile zum Kommentar und daher nicht mehr ausgeführt - hatte ich oben so gemacht) oder gleich ganz löschen.

Grüße
bastla
Member: Perle66
Perle66 Dec 08, 2012 at 21:23:02 (UTC)
Goto Top
Hallo bastla,
super, funktioniert perfekt. Apostroph hatte ich nicht gesehen, mein Fehler.
Vielen, vielen Dank noch mal!!!
Ich wünsche Dir ein schönes Weihnachtsfest und einen guten Rutsch im Kreis Deiner Lieben.
Bis zum nächsten Mal, vielleicht kann ich dann auch schon dem ein oder anderen mal ein wenig helfen.
Viele Grüße
Perle
Member: bastla
bastla Dec 08, 2012 at 21:27:26 (UTC)
Goto Top
Hallo Perle66!

Die guten Wünsche erwidere ich gerne, und zum Vorsatz, hier auch helfen zu wollen, kann ich nur gratulieren ... face-smile

Grüße
bastla
Member: exitus27
exitus27 Jul 06, 2021 updated at 14:59:49 (UTC)
Goto Top
Zitat von @bastla:

Hallo Perle66 und willkommen im Forum!

Wenn ich Deine etwas abenteuerliche Darstellung der Daten richtig interpretiere, sollte das etwa so gehen:
Sub Urlaubszusammenfassung()
> Quelle = "Tabelle1" 'Name der Quelltabelle  
> AbZeileQ = 1 'Zeile, in welcher die Datumswerte stehen  
> AbSpalteQ = 1 'Spalte, in welcher die Mitarbeiternamen stehen  
> Ziel = "Tabelle2" 'Name der Zieltabelle  
> AbZeileZ = 1 'Zeile, ab welcher die Ergebnisdaten eingetragen werden sollen  
> AbSpalteZ = 1 'Spalte, ab welcher die Ergebnisdaten eingetragen werden sollen  
> Kennz = "U" 'Kennzeichen, nach welchem gesucht werden soll  
> 
> ZeileQ = AbZeileQ + 1 'Beginne in Quelltabelle in der Zeile mit erstem Mitarbeiter  
> ZeileZ = AbZeileZ 'Beginne in der Zieltabelle in der ersten Ergebniszeile  
> MA = Worksheets(Quelle).Cells(ZeileQ, AbSpalteQ).Value 'Mitarbeiternamen lesen  
> Do While MA <> "" 'Solange ein Mitarbeitername gefunden wird, Schleife durchführen  
>     SpalteQ = AbSpalteQ + 1 'Beginne in der Quelltabelle in der Spalte mit dem ersten Datumswert  
>     SpalteZ = AbSpalteZ + 1 'Beginne in der Zieltabelle in der Spalte nach dem Mitarbeiternamen  
>     Beginn = "" 'Beginndatum des Urlaubszeitraumes löschen  
>     Worksheets(Ziel).Cells(ZeileZ, AbSpalteZ).Value = MA 'Mitarbeiternamen in vorgegebene Spalte der Zieltabelle übertragen  
>     Dat = Worksheets(Quelle).Cells(AbZeileQ, SpalteQ).Value ' Datumswert aulsesen  
>     Do While Dat <> "" 'Solange es noch Datumswerte gibt, Schleife wiederholen  
>         If Worksheets(Quelle).Cells(ZeileQ, SpalteQ).Value = Kennz Then ' Wenn das Kennzeichen in der Zeile des MA gefunden wird ...  
>             If Beginn = "" Then '... und nicht bereits ein Urlaubsbeginn voerher erkannt wurde ...  
>                 Worksheets(Ziel).Cells(ZeileZ, SpalteZ).Value = Dat ' ... Urlaubsbeginn in Zieltabelle eintragen und ...  
>                 Beginn = Dat ' ... Beginndatum zwischenspeichern  
>                 SpalteZ = SpalteZ + 1 'nächster Eintrag in Zieltabelle erfolgt in nächster Spalte  
>             End If
>         Else ' kein Urlaubstag  
>             If Beginn <> "" Then ' Wenn laufender Urlaub ...  
>                 Ende = Worksheets(Quelle).Cells(AbZeileQ, SpalteQ - 1).Value ' ... als Enddatum den gestrigen Tag festlegen  
>                 If Beginn <> Ende Then ' Wenn Beginn und Ende unterschiedlich (mehrtätiger Urlaub) ...  
>                     Worksheets(Ziel).Cells(ZeileZ, SpalteZ).Value = Ende ' ... Enddatum eintragen  
>                     'SpalteZ = SpalteZ + 1 'nächster Eintrag in Zieltabelle erfolgt in nächster Spalte  
>                 End If
>                 Beginn = "" 'Beginndatum des Urlaubszeitraumes löschen  
>                 SpalteZ = SpalteZ + 2 'nächster Eintrag in Zieltabelle erfolgt in übernächster Spalte - dadurch leere Zelle(n) nach Urlaub  
>             End If
>         End If
>         SpalteQ = SpalteQ + 1 'nächsten Tag des Jahres betrachten ...  
>         Dat = Worksheets(Quelle).Cells(AbZeileQ, SpalteQ).Value '... und dessen Datumswert zwischenspeichern  
>     Loop 'alle Datumswerte (des Jahres) durch  
>     ZeileQ = ZeileQ + 1 'nächste Zeile für Mitarbeiter in Quelltabelle  
>     ZeileZ = ZeileZ + 1 'nächste Zeile für Mitarbeiter in Quelltabelle  
>     MA = Worksheets(Quelle).Cells(ZeileQ, AbSpalteQ).Value'Mitarbeiternamen lesen  
> Loop 'alle Mitarbeiter durch  
> MsgBox "Fertig."  
> End Sub
> 
Vorausgesetzt habe ich für die Quelltabelle, dass zwischen den Datumswerten und den Namen keine Zeile frei bleibt und zwischen den Namen und Datumswerten es auch keine leere Spalte gibt.

Für die Zieltabelle müsste ich ggf noch ein Löschen der bereits vorhandenen Einträge einbauen ...

Grüße
bastla

[Edit] Zeilen 31 und 34 angepasst, sodass für jeden Urlaub insgesamt 3 Zellen verwendet werden [/Edit]

Hallo
diese vba code Intressiert mich auch , könnte man diesen script so abändern das es auch klein geschriebene u auch übernimmt und mein dazu kommt es noch das unsere MA von Montag bis Freitag U eintragen und am Samstag und Sonntag steht eine X .
Die Urlaubstage sollten nicht durch die x Unterbrochen werden.
zb.
MO DI MI DO FR Sa So MO DI MI DO FR Sa So MO DI
01.01 02.01 03.01 04.01 03.01 04.01 05.01 06.01 07.01 08.01 09.01 10.01 11.01 12.01 13.01 14.01
u u u u x x u u u u u x x u

die ausgabe sollte so ausehen
von 02.01-13.01 10 TU

abgelaufene datum soll gelöscht werden oder ignoriert werden.
Es wäre toll wenn es möglich wäre wenn man die Urlaubstage der MA nach Monaten untereinander dargestellt werden.

würde mich freuen wenn jemand mir helfen würde
mfg