Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1760to1764
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

Zeile zwischen zwei Werten färben

Zeile zwischen zwei Werten färben
02.06.2020 13:26:01
Vic
Hallo zusammen,
Meine Spalten sind in einen Zeitstrahl (jede Spalte 15 Min) für jeweils 24h aufgeteilt. Jeder Tag des Monats liegt in einer eigenen Zeile.
Ich habe in einer Zeile abhängig von der Zeit feste Werte ("B" oder "E") für Beginn und Ende stehen, wobei es auch mehrfach Beginn und Ende an einem Tag geben kann. Leider gibt es auch Konstellationen, in denen nur ein Beginn oder nur ein Ende eingetragen werden darf.
Problem: Gibt es die Möglichkeit, sofern B und E vorhanden sind, die Zellen zwischen den Textwerten "B" und "E" automatisiert einzufärben oder mit einem Textwert "z" zu füllen, um mit bedingter Formatierung die Färbung umzusetzen?
Ich habe dazu im Augenblick überhaupt keine Idee. Hat von euch schon mal jemand so etwas gemacht oder kann mir einen Hinweis geben, wie ich das umsetzen kann?
Grüße
Vic

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeile zwischen zwei Werten färben
02.06.2020 13:40:55
Martin
Hallo Vic,
zunächst solltest du uns eine Beispielmappe hochladen, denn keine möchte unnötig Zeit aufbringen deine Tabellenstruktur nachzubauen.
Wie die Bezeichnung Bedingte Formatierung beschreibt, kann nur die Formatierung der Zelle geändert werden, aber nicht der Inhalt bzw. Wert.
Ich würde diese Aufgabenstellung mit einem VBA-Makro lösen, das ereignisorientert bei Veränderung einer Zelle auslöst. Damit wäre es überhaupt kein Problem.
Viele Grüße
Martin
AW: Zeile zwischen zwei Werten färben
02.06.2020 14:05:43
Vic
Danke schon mal für die Richtung Martin. Die Mappe liegt im Intranet und ich kann sie mangels Office-Paket auf diesem Rechner auch nicht nachbauen. Deswegen habe ich versucht, es so genau wie möglich zu beschreiben.
Macht es wie folgt Sinn?:
Überwachungsbereich ist klar - alle Zeilen und Spalten (Zeiten/Tage des Monats), in denen Eingaben erfolgen können.
Und dann bei Änderung per if then else prüfen in Target Row, ob B und E vorhanden sind, Spalten in Variablen ausgeben und Zellbereich färben? Wie kann ich die Prüfung bei mehreren B und E in einer Zeile umsetzen, zumal diese leider auch einzeln stehen können? Per for/next Spalte in Zeile?
Das wird dann ziemlich verschachtelt und für mein VBA-Level eine harte Nuss vermute ich. Ist die Idee soweit richtig?
Anzeige
AW: Zeile zwischen zwei Werten färben
02.06.2020 14:21:40
Martin
Hey Vic,
ich bin beeindruckt, dass du den Lösung ja quasi selbst beschreibst. So "bescheiden" scheinen deine VBA-Kenntnisse ja doch nicht zu sein ;-)
Ich würde die Adresse des ersten Treffers von "B" suchen und in einer Variable ablegen. In der Schleife suchst du weiter sowohl nach "B" als auch nach "E". Solle das nächste "B" vor dem "E" kommen, dann überschreibst du die Adresse der Variable des ersten "B" wieder. Sollte ein "E" kommen, kannst du die Spalten dazwischen einfärben und mit "z" füllen.
Nach warte mal, ich schreibe mal ein Beispiel.
Viele Grüße
Martin
AW: Zeile zwischen zwei Werten färben
02.06.2020 14:40:47
Vic
Vielen Dank für die Blumen - aber von der Idee zum Code ist ja noch ein Stückchen. Insofern passt bescheiden schon ganz gut ;-)
Ein Beispiel nehme ich gern und dankend an.
Anzeige
AW: Zeile zwischen zwei Werten färben
02.06.2020 15:03:02
Martin
Hallo Vic,
hier mal ein grobes Makro, das du mit deinen VBA-Kenntnissen bestimmt an deine Bedürfnisse anpassen kannst:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngTimeCol As Range
Dim rngStart As Range
Dim rngEnd As Range
For Each rngTimeCol In ActiveSheet.UsedRange.EntireColumn.Rows(Target.Row).Cells
If rngTimeCol = "B" Then
Set rngStart = rngTimeCol
ElseIf rngTimeCol = "E" And Not rngStart Is Nothing Then
If rngTimeCol.Column - 1 > rngStart.Column Then
Application.EnableEvents = False
With Range(rngStart.Offset(0, 1), rngTimeCol.Offset(0, -1))
.Value = "x"
.Interior.Color = 65535
End With
Application.EnableEvents = True
End If
Set rngStart = Nothing
End If
Next
End Sub
Viele Grüße
Martin
Anzeige
Unnötige Variable "rngEnd" und "z" statt "x"
02.06.2020 15:27:17
Martin
Hi Vic,
du wolltest ja ein "z" als Füllwert statt des von mir eingesetzten "x".
Zudem hatte ich unnötiger Weise eine Variable rngEnd deklariert.
Hier eine leichte Optimierung des Makros:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngTimeCol  As Range
Dim rngStart    As Range
For Each rngTimeCol In ActiveSheet.UsedRange.EntireColumn.Rows(Target.Row).Cells
If rngTimeCol = "B" Then
Set rngStart = rngTimeCol
ElseIf rngTimeCol = "E" And Not rngStart Is Nothing Then
If rngTimeCol.Column - 1 > rngStart.Column Then
Application.EnableEvents = False
With Range(rngStart.Offset(, 1), rngTimeCol.Offset(, -1))
.Value = "z"
.Interior.Color = vbYellow
End With
Application.EnableEvents = True
End If
Set rngStart = Nothing
End If
Next
End Sub
Viele Grüße
Martin
Anzeige
Wow-Danke Martin...
02.06.2020 15:37:33
Vic
... mein bisheriges Konstrukt ist ungleich länger und funktioniert nicht wie gewünscht. Dein Beispiel klappt auf Anhieb und ich muss nur noch den Bereich festlegen und verstehen, was du da gemacht hast. Bekomme ich hin.
DANKE!
Vic
AW: Wow-Danke Martin...
02.06.2020 15:52:32
Martin
Hi Vic,
ich danke dir für das Feedback. Wie du es korrekt erkannt hast, solltest du den Bereich noch anpassen. Im Moment läuft das Makro wirklich alle Spalten im verwendeten Tabellenbereich durch.
Bei deinen Vorkenntnissen wirst du den Code schnell verstehen. Mir fiel es anfangs auch wesentlich leichter fremden Code nachzuvollziehen als selbst darauf zu kommen ;-)
Aber ich finde es toll, dass du selbst versucht hast ein passendes Makro zu schreiben!
Viele Grüße
Martin
Anzeige
Mit automatischer Korrektur...
02.06.2020 16:07:31
Martin
Hallo Vic,
ich habe dein Makro nochmals leicht modifiziert, damit bei Fehleingaben bzw. Änderungen falsch gekennzeichnete Zellen wieder zurückgesetzt werden:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngTimeCol  As Range
Dim rngStart    As Range
Application.EnableEvents = False
For Each rngTimeCol In ActiveSheet.UsedRange.EntireColumn.Rows(Target.Row).Cells
With rngTimeCol
.Interior.Pattern = xlNone
If .Value = "z" Then .Value = ""
End With
If rngTimeCol = "B" Then
Set rngStart = rngTimeCol
ElseIf rngTimeCol = "E" And Not rngStart Is Nothing Then
If rngTimeCol.Column - 1 > rngStart.Column Then
With Range(rngStart.Offset(, 1), rngTimeCol.Offset(, -1))
.Value = "z"
.Interior.Color = vbYellow
End With
End If
Set rngStart = Nothing
End If
Next
Application.EnableEvents = True
End Sub
Viele Grüße
Martin
Anzeige
Apropos automatischer Korrektur...
02.06.2020 16:19:46
Martin
...es wäre ja auch etwas einfacher, wenn man nur noch ein kleines "b" bwz. kleines "e" eingeben müsste:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngTimeCol  As Range
Dim rngStart    As Range
Application.EnableEvents = False
For Each rngTimeCol In ActiveSheet.UsedRange.EntireColumn.Rows(Target.Row).Cells
With rngTimeCol
.Interior.Pattern = xlNone
If .Value = "z" Then .Value = ""
End With
If UCase(rngTimeCol) = "B" Then
rngTimeCol = "B"
Set rngStart = rngTimeCol
ElseIf UCase(rngTimeCol) = "E" Then
rngTimeCol = "E"
If Not rngStart Is Nothing Then
If rngTimeCol.Column - 1 > rngStart.Column Then
With Range(rngStart.Offset(, 1), rngTimeCol.Offset(, -1))
.Value = "z"
.Interior.Color = vbYellow
End With
End If
Set rngStart = Nothing
End If
End If
Next
Application.EnableEvents = True
End Sub
Viele Grüße
Martin
Anzeige

329 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige