Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bereich mit Farbe füllen

Bereich mit Farbe füllen
29.11.2016 11:42:50
Ulf
Hallo Forum,
ich bin zwar kein direkter VBA-Anfänger, aber ich habe ab und zu meine Probleme. So auch hier wieder :
ich möchte einen frei definierbaren Bereich mit einer Hintergrundfarbe (hier : grau) füllen. _ Dazu habe ich folgende Routine geschrieben (intLastColumn und strWetter sind als Public vorher bereits definiert) :

Public Sub Bereich_Füllen(ByVal intRow, ByVal intColumn)
Dim intI As Integer        ' Schleifenzähler
Dim wksOne As Worksheet    ' aktuelles Arbeitsblatt
Dim rngZeile As Range      ' aktuelle Zeile
Set wksOne = ThisWorkbook.Sheets(strWetter)    ' Arbeitsblatt "Wetterlage"
With wksOne
intLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
If Cells(intRow - 1, 1).Interior.Color = RGB(217, 217, 217) Then
.Range(wksOne.Cells(intRow, 1), _
wksOne.Cells(intRow, intLastColumn)).Interior.Color = xlNone
intOffset = 1
Else
intOffset = 0
End If
For intI = intRow + intOffset To intLastRow Step 2
.Range(Cells(intI, 1), Cells(intRow, intLastColumn)) _
.Interior.Color = RGB(217, 217, 217) ' Zeile grau färben
.Range(Cells(intI + 1, 1), Cells(intRow, intLastColumn)) _
.Interior.Color = RGB(255, 255, 255) ' Zeile weiß färben
Next intI
End With
End Sub

Bei der Zuweisung der Farbe zum Bereich bekomme ich immer einen Laufzeitfehler 1004 : 'Anwendungs- oder objektdefinierter Fehler'. Leider hilft mir die Hilfe nicht wirklich weiter. Ich habe schon mehrere Varianten der Ansprache des Range-Objektes versucht, allerdings ohne Erfolg. Meine letzte Hoffnung ist daher dieses Forum...
MfG,
Ulf
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bereich mit Farbe füllen
29.11.2016 11:47:14
Rudi
Hallo,
Referenzierung mangelhaft!
Public Sub Bereich_Füllen(ByVal intRow, ByVal intColumn)
Dim intI As Integer        ' Schleifenzähler
Dim wksOne As Worksheet    ' aktuelles Arbeitsblatt
Dim rngZeile As Range      ' aktuelle Zeile
Set wksOne = ThisWorkbook.Sheets(strWetter)    ' Arbeitsblatt "Wetterlage"
With wksOne
intLastRow = .Cells(Rows.Count, 1).End(xlUp).Row
If .Cells(intRow - 1, 1).Interior.Color = RGB(217, 217, 217) Then
.Range(.Cells(intRow, 1), _
.Cells(intRow, intLastColumn)).Interior.Color = xlNone
intOffset = 1
Else
intOffset = 0
End If
For intI = intRow + intOffset To intLastRow Step 2
.Range(.Cells(intI, 1), .Cells(intRow, intLastColumn)) _
.Interior.Color = RGB(217, 217, 217) ' Zeile grau färben
.Range(.Cells(intI + 1, 1), .Cells(intRow, intLastColumn)) _
.Interior.Color = RGB(255, 255, 255) ' Zeile weiß färben
Next intI
End With
End Sub
Gruß
Rudi
Anzeige
AW: Bereich mit Farbe füllen
29.11.2016 12:10:19
Ulf
Hallo Rudi,
Danke für die schnelle Antwort. Leider bekomme ich auch nach der Einarbeitung Deiner Verbesserung den gleichen Fehler an der gleichen Stelle.
Noch irgendeine andere Idee (sonst müsste ich die Zeilen in einer Schleife zellenweise färben) ?
Gruß,
Ulf
AW: Bereich mit Farbe füllen -
29.11.2016 12:35:05
Daniel
Hi
was da so grundsätzlich falsch ist:
1. sollten Variablen für Zeilennummern immer als LONG deklariert werden.
Integer reicht nur bis c.a 32.000 und das kann für Zeilennummern zu wenig sein.
Außerdem verarbeitet der Rechner Integer und Long gleich schnell, dh die Verwendung von Integer hat keinen Vorteil (die paar gesparten Bytes sind bei Einzelvariablen irrelevant)
2. beim Range in der For-Schleife fehlt das Sheet vor den Cells innerhalb der Range.
Cells ohne Tabellenblattangabe beziehen sich idR auf das aktive Tabellenblatt und bei Range(Cells(), Cells()) muss man darauf achten, dass sich die beiden Cells auf das gleiche Tabellenblatt beziehen wie die Range, sonst gibt es einen Laufzeitfehler.
3. es ist generell ungünstig, jede 2. Zeile einzufärben. Excel speichert die Formatierungsinformation "Blockweise", und durch das einfärben jeder 2. Zeile entsteht die maximale Anzahl an Blöcken.
Besser wäre hier, die Bedingte Formatierung für alle Zellen einzusetzen mit der Regel: IstGerade(Zeile()), weil hier zwar auch jede 2. Zeile gefärbt wird, aber alle alle Zeilen die die gleiche Formatierung haben und damit einen Block bilden.
Oder man formatiert den ganzen Bereich als Tabelle (Einfügen-Tabellen-Tabelle), dann bekommt man auch eine Zeilenweise wechselnde Formatierung (welche dann auch beim Sortieren, Filtern, Löschen erhalten bleibt)
Gruß Daniel
Anzeige
AW: Bereich mit Farbe füllen -
29.11.2016 13:23:47
Ulf
Hallo Daniel,
vielen Dank für Deine grundsätzlichen Erklärungen. Long benötige ich hierbei zwar nicht, aber ich werde es in Zukunft berücksichtigen.
Die Idee mit der Bedingten Formatierung finde ich prinzipiell gut, aber es hapert bei mir an der Umsetzung. Wie muss ich was formatieren, damit Excel tatsächlich auch bei nachträglich eingefügten Zeilen diese Formatierung vornimmt ? Kann ich das ggfs. auch in VBA realisieren oder wäre der Aufwand dafür zu hoch ?
Ich habe das Ganze jetzt mal etwas zusammengefasst, aber es klappt immer noch nicht :
Public Sub Bereich_Färben(ByVal rngTarget As Range)
Dim intI As Integer        ' Schleifenzähler
Dim intOffset As Integer   ' Offset für Zeile
Dim wksOne As Worksheet    ' aktuelles Arbeitsblatt
Set wksOne = ThisWorkbook.Sheets(strWetter)  ' Arbeitsblatt "Wetterlage"
With wksOne
intLastRow = .Cells(Rows.Count, 1).End(xlUp).Row ' letzte beschriebene Zeile
If Cells(rngTarget.Row - 1, 1).Interior.Color = RGB(217, 217, 217) Then
rngTarget.Interior.Color = xlNone
intOffset = 1
Else
intOffset = 0
End If
For intI = rngTarget.Row + intOffset To intLastRow Step 2
rngTarget.Interior.Color = RGB(217, 217, 217)
rngTarget.Interior.Color = xlnone
Next intI
End With
End Sub

Er bemängelt immer noch die Anweisung
       rngTarget.Interior.Color = xlNone

mit dem Laufzeitfehler 1004.
Ich danke schon mal für die Antworten.
Gruß,
Ulf
Anzeige
AW: Bereich mit Farbe füllen -
29.11.2016 13:40:59
Daniel
Hi
der Code ansich ist zwar nicht dafür geeignet, jede zweite Zeile zu färben, aber er sollte eigentlich ohne Fehler funktionieren.
der Fehler dürfe daher kommen, dass das Blatt noch geschützt ist, und es daher nicht zulässig ist, die Formatierung zu ändern.
Gruß Daniel
AW: Bereich mit Farbe füllen -
29.11.2016 13:46:57
Ulf
Ja, Daniel,
genau dasselbe habe ich auch gerade herausgefunden, aber trotzdem noch einmal Danke an alle, die mir geholfen haben.
Gruß,
Ulf
Anzeige
AW: Bereich mit Farbe füllen -
29.11.2016 13:29:26
Ulf
Hallo Daniel,
vielen Dank für Deine grundsätzlichen Erklärungen. Long benötige ich hierbei zwar nicht, aber ich werde es in Zukunft berücksichtigen.
Die Idee mit der Bedingten Formatierung finde ich prinzipiell gut, aber es hapert bei mir an der Umsetzung. Wie muss ich was formatieren, damit Excel tatsächlich auch bei nachträglich eingefügten Zeilen diese Formatierung vornimmt ? Kann ich das ggfs. auch in VBA realisieren oder wäre der Aufwand dafür zu hoch ?
Ich habe das Ganze jetzt mal etwas zusammengefasst, aber es klappt immer noch nicht :
Public Sub Bereich_Färben(ByVal rngTarget As Range)
Dim intI As Integer        ' Schleifenzähler
Dim intOffset As Integer   ' Offset für Zeile
Dim wksOne As Worksheet    ' aktuelles Arbeitsblatt
Set wksOne = ThisWorkbook.Sheets(strWetter)  ' Arbeitsblatt "Wetterlage"
With wksOne
intLastRow = .Cells(Rows.Count, 1).End(xlUp).Row ' letzte beschriebene Zeile
If Cells(rngTarget.Row - 1, 1).Interior.Color = RGB(217, 217, 217) Then
rngTarget.Interior.Color = xlNone
intOffset = 1
Else
intOffset = 0
End If
For intI = rngTarget.Row + intOffset To intLastRow Step 2
rngTarget.Interior.Color = RGB(217, 217, 217)
rngTarget.Interior.Color = xlnone
Next intI
End With
End Sub

Er bemängelt immer noch die Anweisung
       rngTarget.Interior.Color = xlNone

mit dem Laufzeitfehler 1004.
Ich danke schon mal für die Antworten.
Gruß,
Ulf
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Bereich mit Farbe füllen in Excel


Schritt-für-Schritt-Anleitung

Um einen Bereich in Excel mit einer bestimmten Farbe zu füllen, kannst Du die folgende VBA-Routine verwenden. Hier ist eine angepasste Version, die die häufigsten Fehler vermeidet:

Public Sub Bereich_Füllen(ByVal intRow As Long, ByVal intColumn As Long)
    Dim intI As Long        ' Schleifenzähler
    Dim wksOne As Worksheet ' aktuelles Arbeitsblatt
    Set wksOne = ThisWorkbook.Sheets("Wetterlage") ' Arbeitsblatt "Wetterlage"

    With wksOne
        Dim intLastRow As Long
        intLastRow = .Cells(Rows.Count, 1).End(xlUp).Row ' letzte beschriebene Zeile

        If .Cells(intRow - 1, intColumn).Interior.Color = RGB(217, 217, 217) Then
            .Range(.Cells(intRow, intColumn), .Cells(intRow, intLastRow)).Interior.Color = xlNone
            intOffset = 1
        Else
            intOffset = 0
        End If

        For intI = intRow + intOffset To intLastRow Step 2
            .Range(.Cells(intI, intColumn), .Cells(intI, intColumn)).Interior.Color = RGB(217, 217, 217) ' Zeile grau färben
            .Range(.Cells(intI + 1, intColumn), .Cells(intI + 1, intColumn)).Interior.Color = RGB(255, 255, 255) ' Zeile weiß färben
        Next intI
    End With
End Sub

Diese Routine füllt die Zeilen ab intRow in einem definierten Bereich mit der Farbe Grau, wobei jede zweite Zeile weiß bleibt.


Häufige Fehler und Lösungen

  1. Laufzeitfehler 1004: Dieser Fehler tritt häufig auf, wenn das Arbeitsblatt geschützt ist. Stelle sicher, dass das Blatt nicht geschützt ist oder hebe den Schutz auf, bevor Du die Routine ausführst.

  2. Referenzierung: Achte darauf, dass Du wksOne.Cells(...) anstelle von Cells(...) verwendest, um sicherzustellen, dass Du auf das richtige Arbeitsblatt zugreifst.

  3. Datentypen: Verwende Long anstelle von Integer für Zeilen- und Spaltennummern, um mögliche Überlaufprobleme zu vermeiden.


Alternative Methoden

Wenn Du nicht mit VBA arbeiten möchtest, kannst Du auch Excel-Shortcuts verwenden, um Zellen mit Farbe zu füllen:

  • Mit Farbe füllen: Markiere den gewünschten Bereich, klicke mit der rechten Maustaste und wähle „Zellen formatieren“. Unter der Registerkarte „Ausfüllen“ kannst Du die gewünschte Farbe auswählen.

  • Bedingte Formatierung: Nutze die bedingte Formatierung, um automatisch jede zweite Zeile zu färben. Gehe zu „Start“ -> „Bedingte Formatierung“ -> „Neue Regel“ und verwende die Formel =ISTGERADE(ZEILE()).


Praktische Beispiele

  1. Färben von Wochenenden: Wenn Du eine Liste von Daten hast und die Wochenenden farblich hervorheben möchtest, kannst Du die bedingte Formatierung verwenden und die Regel so einstellen, dass sie für Samstage und Sonntage gilt.

  2. Visualisierung von Daten: Verwende die VBA-Routine, um einen bestimmten Datenbereich in Deinem Arbeitsblatt basierend auf bestimmten Bedingungen zu färben, z.B. alle Verkaufszahlen über einem bestimmten Betrag.


Tipps für Profis

  • Excel VBA Zelle farbig füllen: Nutze die .Interior.Color-Eigenschaft, um Zellen dynamisch zu färben, basierend auf Datenbedingungen.
  • Schleifen optimieren: Verwende Application.ScreenUpdating = False, um die Bildschirmaktualisierung während der Ausführung Deines Codes zu deaktivieren, was die Verarbeitungsgeschwindigkeit erhöhen kann.
  • Modularität: Baue Deine VBA-Routinen modular auf, sodass Du spezifische Füllmethoden leicht anpassen oder wiederverwenden kannst.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass die Formatierung bei neuen Zeilen erhalten bleibt? Verwende die bedingte Formatierung, um Regeln festzulegen, die auch für nachträglich eingefügte Zeilen gelten.

2. Was kann ich tun, wenn mein Code nicht funktioniert? Überprüfe die Referenzen auf Zellen und sicherstelle, dass alle Variablen korrekt deklariert sind. Auch ein geschütztes Blatt kann die Funktionalität beeinträchtigen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige