Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1524to1528
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Eigenschaften in einzelnen Zeilen ändern

Eigenschaften in einzelnen Zeilen ändern
22.11.2016 19:19:10
Ben
Hallo!
Ich bin neu hier, habe aber schon viel von euren Beiträgen profitiert. Dafür vorab schon mal VIELEN DANK!
Jetzt stehe ich vor einem Problem, dass ich mit meinen VBA-Kenntnissen und Foren-Suchen nicht gelöst bekomme:
Ich habe eine Tabelle erstellt, in der in der ersten Spalte die Mitarbeiter meiner Station aufgeführt sind und in der ersten Zeile die Tage des Jahres. Die Wochenenden und Feiertage werden automatisch farblich markiert und jeder Kollege kann über CommandButtons Tage oder ganze Blöcke als Fortbildung, Urlaub, Krankheit oder ähnliches farblich markieren.
Jetzt gibt es aber Mitarbeiter, die nicht an jedem Tag der Woche arbeiten. Ich möchte daher gerne folgende Funktion einfügen: Sobald in einer Zelle am Ende der Zeile (in Spalte 371) eine Ziffer als Wochentagscode eingegeben wird (1=Mo, 2=Di, usw.), soll automatisch jeder entsprechenden Wochentag des Jahres als frei markiert werden (zelle.Interior.ColorIndex = 6). Gleichzeitig sollen aber alle schon eingetragenen Farben in Ruhe gelassen werden.
Aktuell habe ich das für eine Zeile geschafft. Soweit ich meinen zusammengeklaubten VBA-Code verstehe, wird die Zelle NG13 beobachtet. Sobald sich dort etwas ändert, wird ein Bereich definiert, der dann Zelle für Zelle abgearbeitet wird. Es wird jeweils nach Farben gesucht, die in Ruhe gelassen werden sollen (15, 33, 43 und 14) und falls Farbe 6 vorliegt, wird diese gelöscht. Im letzten Schritt wird die in Spalte 371 (Zelle NG13) eingegebene Ziffer mit der in der gerade aktuellen Spalte in Zeile 6 eingetragenen verglichen (dort habe ich für jede Spalte die Wochentagscodes hinterlegt).
Wie kann ich nun erreichen, dass mehrere Zeilen unabhängig voneinender überwacht und dann bei Eintragung eines Wochentagscodes in Spalte 371 abgearbeitet werden?
Wenn ich die "If Target.Adress"-Abfrage einfach für jede Zeile darunter kopiere, dann bekomme ich die Fehlermeldung "Mehrfachdeklaration im aktuellen Gültigkeitsbereich". Erweitere ich dagegen den Target.Address-Bereich und den Range, dann bearbeitet er mir jede Zeile, obwohl nur in einer der Wochentagscode geändert wurde.
Vielen Dank für die Hilfe!
Gruß
Ben
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Address = "$NG$13" Then
Dim bereich13, zelle As Range
Set bereich13 = Range("f13:nf13")
For Each zelle In bereich13
If zelle.Interior.ColorIndex = 15 Then GoTo weiter
If zelle.Interior.ColorIndex = 33 Then GoTo weiter
If zelle.Interior.ColorIndex = 43 Then GoTo weiter
If zelle.Interior.ColorIndex = 14 Then GoTo weiter
If zelle.Interior.ColorIndex = 6 Then zelle.Interior.ColorIndex = x1None
If ActiveSheet.Cells(6, zelle.Column) = ActiveSheet.Cells(zelle.Row, 371) Then  _
zelle.Interior.ColorIndex = 6
weiter:
Next
End If
End Sub

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
So, wie das Pgm ist, wird jede Zelle in ...
22.11.2016 20:05:18
Luc:-?
Bereich13 bearbeitet, Ben,
wenn Zelle NG13 (und nur die!) geändert wurde. Außerdem wird jedesmal noch die Zelle von Zeile 6 in der jeweiligen Spalte mit der in der Target-Spalte (NG) der jeweiligen Zeile vgln. Folglich könnte man hierfür auch Target.Column schreiben.
Folgende Mängel bzw Fehler:
1. bereich13 ist nicht As Range, sondern As Variant deklariert; in VBA kann man keine Aufzählungen von Variablen gleicher Deklarierung formulieren (außer Variant) → jede muss entweder global oder generell per 1.Buchstaben bzw per Symbol oder Langtext einzeln deklariert wdn. Hat hier aber weiter keine Auswirkungen, da Variant auch Ranges beinhalten kann.
2. Die Xl-Konstante heißt nicht x1None, sondern xlNone (xl=Excel).
3. Kürzer wäre bspw …
Select Case zelle.Interior.ColorIndex
Case 14, 15, 33, 43 'nichts tun - einfach weiter ohne Sprung!
Case 6: zelle.Interior.ColorIndex = xlNone
Case Else '?
End Select

…oder einfach nur …
If zelle.Interior.ColorIndex = 6 Then zelle.Interior.ColorIndex = xlNone
If ActiveSheet.Cells(6, zelle.Column) = ActiveSheet.Cells(zelle.Row, 371) Then _
zelle.Interior.ColorIndex = 6
Die anderen Befehle wdn ja nicht wirklich benötigt, falls nicht doch noch andere FarbIndizes behandelt wdn sollen.
Empfehlung: Ab Xl12/2007 idR nicht mehr mit FarbIndizes arbeiten, weil sie mehrfach belegt sein können!
Was dein eigentliches Problem ist, hat sich mir allerdings nicht so recht erschlossen…
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Ok, Empfehlungen soweit ich sie kapiert...
23.11.2016 19:22:17
Ben
...habe umgesetzt. Das hat schon mal viel geholfen. Vielen Dank für die Tipps!
Das ist das aktuelle Ergebnis:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Address = "$NG$13" Then
Dim bereich13, zelle13 As Variant
Set bereich13 = Range("f13:nf13")
For Each zelle13 In bereich13
Select Case zelle13.Interior.ColorIndex
Case 3, 14, 15, 18, 23, 33, 40, 43, 45, 47
Case 6: zelle13.Interior.ColorIndex = xlNone
End Select
If ActiveSheet.Cells(6, zelle13.Column) = ActiveSheet.Cells(zelle13.Row, 371) And  _
ActiveSheet.Cells(8, zelle13.Column) = "0" Then zelle13.Interior.ColorIndex = 6 'habe noch ein "and" eingefügt, damit er mir dir Wochenenden in Ruhe lässt
Next
End If
End Sub
Mein eigentliches Problem war nun folgendes:
Ich will nicht nur Feld NG13 überwachen, sondern die Spalte NG von Zeile 13 bis 50. Es soll aber bei einer Änderung immer nur die Zeile bearbeitet werden, in der auch Spalte NG geändert wurde und nicht alle Zeilen von 13 bis 50 auf einmal.
Muss ich dazu den obigen Programmteil wirklich 38 mal kopieren und abändern? Da gibt es doch bestimmt eine geschicktere Variante? ;-)
Und was benutze ich denn statt der FarbIndizes?
Gruß
Ben
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige