erst noch einmal Dank an Peter Feustel für den VBA-Code.
Mit dem folgenden VBA-Code wird die Eingabe aus einer Userform in die unten Abgebildete Tabelle in das Arbeitsblatt "MA" eingefügt, so das die Tabelle immer, je Mitarbeiter, sortiert nach Datum ist.
Also immer Urlaub "von bis" mit dem Zusatz "U" dazwieschen für Urlaub, oder Zusatz "S" dazwieschen für Sonderurlaub...usw.
Leider funktioniert die ganze Sache nicht wenn Daten gelöscht oder geändert werden. Doppelte Eingabe wird auch übernommen, soll so aber nicht sein.
Kann da jemand helfen?
schon einmal Danke
sonja.ausHH
' die Eingaben in das Tabellenblatt MA eintragen
'
With Worksheets("MA").Range("A1:A500")
Set rZelle = .Find(ComboBox1.List(ComboBox1.ListIndex, 0), _
LookIn:=xlValues, LookAt:=xlWhole)
If rZelle Is Nothing Then
MsgBox "den Mitarbeiter " & ComboBox1.List(ComboBox1.ListIndex, 0) & _
" gibt es nicht im Tabellenblatt ""MA"".", _
48, " Hinweis für " & Application.UserName
Exit Sub
End If
iZeile_M = rZelle.Row ' Fundzeile des Mitarbeiters
iLSpalte = IIf(.Cells(iZeile_M, 256) <> "", 256, _
.Cells(iZeile_M, 256).End(xlToLeft).Column) ' letzte belegte Spalte
iAnzTerm = ((iLSpalte + 1 - 2) / 4) ' die Anzahl der Termine errechnen
ReDim aTermine(iAnzTerm) ' den Array entsprechend dimensionieren
If iLSpalte < 5 Then iLSpalte = 5 ' kein Termin eingetragen !
'
' die Termine des Mitarbeiters abarbeiten, dabei den neuen Termin
' sortiert nach Datum einfügen
'
For iSpalte = 3 To (iLSpalte + 1) Step 4
If IsDate(.Cells(iZeile_M, iSpalte).Value) Then
If CDate(TextBox1.Text) < .Cells(iZeile_M, iSpalte).Value Then
aTermine(iIndex).DatumV = CDate(TextBox1.Text)
aTermine(iIndex).Art = TextBox3.Value
aTermine(iIndex).DatumB = CDate(TextBox2.Text)
aTermine(iIndex + 1).DatumV = CDate(.Cells(iZeile_M, iSpalte).Value)
aTermine(iIndex + 1).Art = .Cells(iZeile_M, iSpalte + 1).Value
aTermine(iIndex + 1).DatumB = CDate(.Cells(iZeile_M, iSpalte + 2).Value)
Else
aTermine(iIndex).DatumV = CDate(.Cells(iZeile_M, iSpalte).Value)
aTermine(iIndex).Art = .Cells(iZeile_M, iSpalte + 1).Value
aTermine(iIndex).DatumB = CDate(.Cells(iZeile_M, iSpalte + 2).Value)
aTermine(iIndex + 1).DatumV = CDate(TextBox1.Text)
aTermine(iIndex + 1).Art = TextBox3.Value
aTermine(iIndex + 1).DatumB = CDate(TextBox2.Text)
End If
Else
aTermine(iIndex).DatumV = CDate(TextBox1.Text)
aTermine(iIndex).Art = TextBox3.Value
aTermine(iIndex).DatumB = CDate(TextBox2.Text)
End If
iIndex = iIndex + 1
Next iSpalte
' die alten Termine alle löschen
.Range(.Cells(iZeile_M, 3), .Cells(iZeile_M, iLSpalte)).ClearContents
iSpalte = 3 ' Start-Spalte ist C
'
' die Termine sortiert aus dem Array in das Tabellenblatt übernehmen
'
For iIndex = LBound(aTermine) To UBound(aTermine)
.Cells(iZeile_M, iSpalte + 0).Value = aTermine(iIndex).DatumV
.Cells(iZeile_M, iSpalte + 1).Value = aTermine(iIndex).Art
.Cells(iZeile_M, iSpalte + 2).Value = aTermine(iIndex).DatumB
iSpalte = iSpalte + 4
Next iIndex
End With
Exit Sub