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

Zellenfarbe übertragen

Zellenfarbe übertragen
19.05.2016 09:16:45
Markus

Guten Morgen,
ich habe eine Tabelle mit eingefärbten Zellen. Die Zellenfarben (A1:D10) sollen in ein anderes Feld (gleiches Tabellenblatt oder ein anderes) übertragen werden.
Ich habe den Befehl mit dem makrorecorder aufgenommen, möchte aber gerne eine elegante Lösung umsetzen.
Ich habe versucht das Makro abzuändern und den Code einem Tabellenblatt zuzuordnen, als private sub. Leider läuft das Makro nicht, die Zellenfarben werden nicht übernommen?
Könnt Ihr mir einen Lösungsvorschlag nennen?
Ich habe folgendes Makro versucht:


private sub fuellfarben()
application.enable.event=false
worksheets("Tabelle1").range(A1:A10").format = worksheets("Tabelle1").range("F1:F10").format
application.enable.event=true
end sub

Beispieldatei:
https://www.herber.de/bbs/user/105649.xlsm

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
.EnableEvents = ... , nicht .enable.event
19.05.2016 09:21:27
lupo1
Wenn Du ein manuell zu startendes Makro möchtest: Allgemeines Modul; .EnableEvents ist unzutreffend
Wenn das Makro aufgrund eines Ereignisses starten soll, wähle eines unter "Worksheet" im Fenster zu "Code Anzeigen" im Blattreitermenü aus (Klassenmodul).

Zellfarbe ist .Interior.Color nicht .Format owT
19.05.2016 10:01:11
RPP63

AW: Zellfarbe ist .Interior.Color nicht .Format owT
19.05.2016 10:44:54
Markus
Ich habe
.interior.color
eingefügt --> Tabellenblatt --> code anzeigen -->
Private Sub Worksheet_Change(ByVal Target As Range)
Worksheets("Tabelle1").Range("A1:D10").Interior.Color = Worksheets("Tabelle1").Range("F1:I10"). _
Interior.Color
End Sub
Nachdem die Zellenfarbe geändert oder eingefügt wird, werden diese nicht in das neue Feld übertragen.
Vielleicht könnt Ihr mal in die Datei schauen...
https://www.herber.de/bbs/user/105651.xlsm

Anzeige
Das geht auch nicht …
19.05.2016 11:08:04
RPP63
… denn die Änderung einer Farbe ist kein abfangbares Event!
Dazu brauche ich nicht in die Datei zu schauen ;-)
Nimm ein _Calculate, schreibe irgendwo =heute() in eine Zelle und starte das Makro durch Neuberechnung mittels F9.
Gruß Ralf

AW: Zellfarbe ist .Interior.Color nicht .Format owT
19.05.2016 12:57:37
Markus
...ich habe jetzt ein Lsg. gefunden. Wenn man im "Quellbereich" des ersten Tabellenblattes eine Zelle verfärbt und ein Zahl einträgt, wird die Zellfärbung auf eine andere, vorher definierte, Zelle übertragen.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim rngArea As Range
Dim rngZelle As Range
Set rngBereich = Intersect(Target, Range("A:D"))
If Not rngBereich Is Nothing Then
For Each rngArea In rngBereich.Areas
For Each rngZelle In rngArea
rngZelle.Offset(0, 5).Resize(1, 1).Interior.Color = rngZelle.Interior.Color
Next rngZelle
Next rngArea
End If
End Sub
Da ich mich ausschließung auf die Funktion des Makros konzentriert habe, wurde vernächlässigt, dass die Zellfärbung in einen Zellbereich eines anderes Tabellenblattes (Tabelle2) übertragen werden soll.
Vielleicht könnt Ihr mir noch eine Hilfestellung bezüglich meines Vorhabens gbeben.
Werte und Zelle in Tabellenblatt 1 eintragen und färben --> Zellfärbung in die gleiche Zelle eines anderen Tabellenblattes (Tabelle2) übertragen
https://www.herber.de/bbs/user/105657.xlsm

Anzeige
AW: Zellfarbe ist .Interior.Color nicht .Format owT
19.05.2016 14:12:46
Michael
Hi zusammen,
das wäre die Variante Deines Makros, um eine MsgBox zu Testzwecken ergänzt, damit Du nachvollziehen kannst, was passiert:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim rngArea As Range
Dim rngZelle As Range
Set rngBereich = Intersect(Target, Range("A1:D10"))
MsgBox "rngBereich: " & rngBereich.Address & vbLf & _
"Target:     " & Target.Address & vbLf & _
"Selection:  " & Selection.Address
If Not rngBereich Is Nothing Then
For Each rngArea In rngBereich.Areas
For Each rngZelle In rngArea
Sheets(2).Range(rngZelle.Address).Interior.Color = rngZelle.Interior.Color
Next rngZelle
Next
End If
End Sub

Dein Gedanke mit den Areas funktioniert so nämlich nicht: das Target gibt IMMER eine einzelne Zelle zurück, wenn Du einen Wert änderst (Du kannst nicht mehrere Werte gleichzeitig ändern), es sein denn, Du kopierst von woanders einen (zusammenhängenden) Bereich, z.B. von G2:G5 nach B2:B5.
Ich stelle gerade fest, daß der "Einzeiler" zickt, wenn der zu färbende Bereich mehrspaltig ist. Das führt dann zu folgendem, variablen Makro (wenn Du zuletzt eine 1 eingibst, wird A1:D10 übertragen, bei allen anderen Eingaben nur die Target-Zelle(n)):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngBereich As Range
Dim rngZelle As Range
Set rngBereich = Intersect(Target, Range("A1:D10"))
If Not rngBereich Is Nothing Then
If Target(1).Value = 1 Then Set rngBereich = Range("A1:D10") 'alles, wenn 1
If rngBereich.Columns.Count = 1 Then
Sheets(2).Range(rngBereich.Address).Interior.Color = rngBereich.Interior.Color
Else
For Each rngZelle In rngBereich
Sheets(2).Range(rngZelle.Address).Interior.Color = rngZelle.Interior.Color
Next rngZelle
End If
End If
End Sub
Schöne Grüße,
Michael

Anzeige
AW: Zellfarbe ist .Interior.Color nicht .Format owT
19.05.2016 14:42:06
Markus
Hi Markus,
vielen Dank für die super Erklärung und die Visualisierung im Makro.
Ich möchte dieses Makro in ein anderes intergrieren.
Ich werden mit einem bereits bestehenden Makro Werte und entsprechende Zellfärbungen in den definierten Bereich (A1:D10 in der Beispieldatei) schreiben. Ich gehe davon aud, dass Dein gerade veröffentlichtes Makro die Zellfärbungen nach jedem Eintrag überträgt.
Danke Dir ! ;)

Man sollte es meinen,
19.05.2016 14:56:15
Michael
aber warum machst Du das dann nicht gleich von dem anderen Makro aus?
Du kannst es ja auch mal posten...
Gruß,
Michael

AW: Man sollte es meinen,
19.05.2016 18:43:35
Markus
Ich bin davon ausgegangen, dass diese Variante die einfachste ist, für mich...
Im Anhang eine vereinfachte version des vorgeschalteten Makros.
Es werden Daten aus dem Tabellenblatt3 nacheinander auselesen und in Tabelle1 geschrieben, wenn der Kenner in Tabelle3 "blau" heisst, werden die entsprechenden Zellen in Tabelle1 blau eingefärbt.
Nachdem das Makro sollen die farbigen Zellen mit dem private sub auf dem Tabellenblatt1 die Werte an Tabelle2 übergeben.
In Wirklichkeit ist die Tabelle viel größer und es werden nicht nur Spalten sondern Bereiche z.. A2:IE1000 geschrieben
https://www.herber.de/bbs/user/105674.xlsm

Anzeige
AW: Man sollte es meinen,
20.05.2016 09:33:37
Markus
Ich habe gerade gesehen, dass mit dem vorgeschalteten Makro die Daten in den Quellbereich übertragen werden, der anschließende Farbübertrag aber nicht funktioniert (private sub). Es werden nur weiße Zelle in den Zielbereich der 2. Tabelle übertragen.
Liegt der Fehler darin, dass keine manuellen Eingaben getätigt werden?
https://www.herber.de/bbs/user/105682.xlsm
Grüße

AW: Man sollte es meinen,
20.05.2016 15:10:00
Michael
Hi Markus,
ich habe Dein Makro leicht abgeändert.
Der springende Punkt war, daß das Event zum Übertragen der Farbe in dem Moment ausgelöst wird, wo ein Wert in die Zelle geschrieben wird - die Farbe hattest Du aber erst NACH Auslösung des Events gesetzt.
Die Zeilen zur "Geschwindigkeitssteigerung" habe ich auskommentiert: bei 10 Werten braucht's das nicht, vielleicht bei ein paar 100 oder 1000.
Das geänderte Makro lautet:
Sub transfer()
Dim zeile As Long
' Application.Calculation = xlCalculationManual
' 'Screenupdate
' Application.ScreenUpdating = False
'For/Next-Schleife start
For zeile = 2 To 10
' zuerst Farbe setzen...
If Worksheets("Tabelle3").Cells(zeile, 3) Like "*blau*" Then
Worksheets("Tabelle1").Cells(zeile - 1, 1).Interior.ColorIndex = 33
End If
' dann Werte schreiben bzw. kopieren
Worksheets("Tabelle3").Cells(zeile, 2).Copy
Worksheets("Tabelle1").Cells(zeile - 1, 1).PasteSpecial Paste:=xlPasteValues
Next zeile
' Application.Calculation = xlCalculationAutomatic
' 'Screenupdate
' Application.ScreenUpdating = True
End Sub
Auf das ganze "Event" bzw. die Sub Worksheet_Change in Tabelle1 kannst Du verzichten, indem Du das so formulierst (vor dem Test bitte die worksheet_change umbenennen, damit sie nicht mehr ausgelöst wird):
Sub transfer()
Dim zeile As Long
For zeile = 2 To 10
If Worksheets("Tabelle3").Cells(zeile, 3) Like "*blau*" Then
Worksheets("Tabelle1").Cells(zeile - 1, 1).Interior.ColorIndex = 33
' hier gleich die Farbe in Tabelle2 gesetzt
Worksheets("Tabelle2").Cells(zeile - 1, 1).Interior.ColorIndex = 33
End If
' hier einfache Wertzuweisung, nur um es Dir zu zeigen
Worksheets("Tabelle1").Cells(zeile - 1, 1) = Worksheets("Tabelle3").Cells(zeile, 2)
Next zeile
End Sub
Übrigens kannst Du solche Logik-Sachen leicht selbst finden, indem Du ein Makro zeilenweise mit F8 durchgehst und dabei beobachtest, was passiert.
Schöne Grüße,
Michael

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige