AW: Verschiedene Darstellungen im Urlaubsplaner
02.10.2016 18:48:36
Michael
Hi Loddar,
bist Du aa Frangge? Man kommt ja nicht umhin, an den Maddäus zu denken...
Zum Wochenplaner: ich habe den nur rausgeworfen, um die Datei beim Upload nicht komprimieren zu müssen (sonst habe ich immer Dateileichen rumfliegen).
Ja, das mit dem Löschen hast Du klar erkannt: ich hatte gehofft, Du merkst es erst Mal nicht, hehe.
1. Array und Resize
Also, 1 nach dem anderen: beim Kopieren eines Bereichs, z.B. range("A1:A5").copy range ("B1"), genügt die Angabe der linken, oberen Zelle des Zielbereichs. Nicht so bei Arrays: damit ein Array ohne weiteren Code in einen Zellbereich geschrieben werden kann, muß der a) genauso groß sein wie das Array, und b) muß das Array 2-dimensional sein.
.resize(1,4) erweitert also den angegebenen Zell-"Bereich" (in dem Fall eine einzelne Zelle) auf 1 Zeile (man hätte auch schreiben können .resize(,4), weil die Anzahl der Zeilen nicht verändert wird) und 4 Spalten.
Teste einfach mal zur Veranschaulichung: range("A1").resize(3,5).interior.color=vbyellow
Der komplette Codeblock
With Sheets("Eingabe am")
.Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(1, 4) = a
End With
Bedeutet: schnapp das Blatt "Eingabe am", und zwar die (".", also dortige) Spalte A und davon die (".", also dortige) letzte Zeile (Zeilennummer) des Tabellenblatts; von dort aus springe nach oben (also zur untersten, beschriebenen Zeile) und gehe eine Zeile nach unten (also in die erste, unbeschriebene). Dann vergrößere diesen Bereich (die erste, leere Zelle in Spalte A) auf vier Spalten und schreibe das Array rein.
Spiel halt einfach mal mit ein paar Kombinationen von Offset und resize herum und färbe die jeweiligen Bereiche mit verschiedenen Farben. Vor ein paar Jahren mußte ich mir das auch immer wieder mühsam vergegenwärtigen, aber mit etwas Übung wird's schon.
2. Finden bei Löschen/Überschreiben
Das Suchen nach Datum UND Name ist etwas aufwendig, läßt sich aber dadurch vermeiden, daß man die Zelladresse auch mit abspeichert: dann muß man nur DIE suchen.
Das geht erst Mal so:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a(0, 1 To 5)
Dim c As Range
If Target.Row > 11 And Target.Column > 3 Then
If Range("C" & Target.Row) "" And _
Target "" And _
Cells(9, Target.Column).Text "" Then
a(0, 3) = Range("C" & Target.Row)
a(0, 4) = Target
a(0, 5) = Target.Address(0, 0)
a(0, 2) = Cells(9, Target.Column)
a(0, 1) = Date
With Sheets("Eingabe am")
Set c = .Range("E:E").Find(a(0, 5), .Range("E1"), _
LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
c.Offset(, -4).Resize(1, 5) = a
'gef. Zelle in E vier nach links ist A
Else
.Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(1, 5) = a
End If
End With
End If
End If
End Sub
Allerdings wird hier erst mal nicht gelöscht, weil das Makro gar nicht anspringt, wenn die bearbeitete Zelle leer ist (Target ungleich ""): hier nochmal die Überlegung, ob Du "k" und "L" auch mit drin haben willst oder nicht (wahrscheinlich ja, oder? Denn wenn einer krank ist, soll ein anderer ja auch keinen Urlaub nehmen - wenn es eng ist).
Überleg es Dir halt mal...
Schöne Grüße,
Michael