Per Makro eingefügte Zeilen abwechselnd einfärben

Hallo,

ich bin zum ersten Mal hier und hoffe sehr, dass mir jemand helfen kann. Ich habe eine Quelldatei (Excel 2003) mit Namen in Spalte A, einem True/False-Feld in Spalte C. Alle „True“-Namen lese ich per Makro in eine Zieltabelle ein, werden hier auch in Spalte A, Zeile i kopiert. Die Zieldatei ist eine Art Kalenderübersicht, d.h. die Kopfzeile hat eine fixe Breite.
Nach dem Einfügen der Bezeichnungen möchte ich die Zeilen abwechselnd hellgrau und dunkelgrau einfärben, ebenfalls automatisch - geht das?

Vielen Dank für Hilfe!!

Tina

Hi Tina,

Nach dem Einfügen der Bezeichnungen möchte ich die Zeilen
abwechselnd hellgrau und dunkelgrau einfärben, ebenfalls
automatisch - geht das?

ja, zeige mal den Code.

Gruß
Reinhard

Hallo, Tina!

ich bin zum ersten Mal hier und hoffe sehr, dass mir jemand
helfen kann. Ich habe eine Quelldatei (Excel 2003) mit Namen
in Spalte A, einem True/False-Feld in Spalte C. Alle
„True“-Namen lese ich per Makro in eine Zieltabelle ein,
werden hier auch in Spalte A, Zeile i kopiert. Die Zieldatei
ist eine Art Kalenderübersicht, d.h. die Kopfzeile hat eine
fixe Breite.
Nach dem Einfügen der Bezeichnungen möchte ich die Zeilen
abwechselnd hellgrau und dunkelgrau einfärben, ebenfalls
automatisch - geht das?

Das geht sogar ohne Makro und kann demzufolge immer so bleiben.
Markiere Deine erste Zeile, dann Menü „Format“-„Bedingte Formatierung“, im folgenden Dialog in der ersten Kombobox „Formel ist“ auswählen, in das Textfeld daneben

=REST(ZEILE();2)=1

schreiben und über die „Format…“-Schaltfläche die Farbe unter der Lasche „Muster“ einstellen.

Die „andere“ Farbe kannst Du entweder per Default in allen Zeilen einstellen oder über eine zusätzliche Formel analog zu der obigen, nur dass Du im „Formel ist“-Textfeld

=REST(ZEILE();2)=0

einträgst (0 hinten statt der 1!).

Falls Du die Farben genau andersrum haben willst: Entweder in der Formel/den Formeln 0 und 1 vertauschen oder eben die Farben vertauschen.

Gruß, Manfred

Hallo Reinhard,
entschuldige, hat etwas gedauert, hatte so viel zu tun. Anbei der Code:

Dim quelle As Worksheet
Dim ziel As Worksheet
Dim i, j As Integer
Set quelle = Workbooks(„quelldatei.xls“).Worksheets(„tabelle1“)
Set ziel = Workbooks(„zieldatei.xls“).Worksheets(„tabelle2“)

For i = 4 To quelle.Range(„c65536“).End(xlUp).Row
If Not IsEmpty(quelle.Cells(i, 3)) Then
Select Case quelle.Cells(i, 3).Offset(0, 3).Value
Case True
quelle.Cells(i, 3).Copy ziel.Range(„a65536“).End(xlUp).Offset(1, 0)
End Select
End If
Next i

Bin gerade dabei, noch eine Bedingung einzubauen, weil er mir so einfach nur alle Zeilen kopiert, wenn nicht leer. Habe aber in Spalte „B“ noch die Überbereiche, die er mir in eine Extra-Zeile schreiben soll, falls sich deren Bezeichnung ändert. Sozusagen als „Überschrift“. Diese Zeile soll dann blöderweise auch noch weiß bleiben.

Vielen Dank für Eure Hilfe!!

Tina

Hi Tina,

entschuldige, hat etwas gedauert, hatte so viel zu tun. Anbei
der Code:

bitte benutze Einrückungen im Code und wenn du hier Code postest so benutze den pre-Tag, wird unterhalb des Eingabefensters erläutert.
Dann kann man Code viel flüssiger lesen.

Beim Dim von i machst du den üblichen Fehler wie jeder der mit Vba anfängt, ich auch früher, du hast „i“ als Variant deklariert.

Bei Dim i, j As Integer ist „i“ variant, J „Integer“
Korrekt ist Dim i As Integer, j As Integer

Nja, in dem Fall ist das irgendwie wurscht, weil du „j“ sowieso nicht benutzt und Integer für „i“ sowieso falsch ist.

Da Zeilen bis 65536 oder 1 Mio gehen können ist für Zeilen sowieso Long zwingend angesagt, da Integer nur bis 32xxx geht.

Also gewöhn dir wie ich bitte an Zeilen immer als Long zu definieren.
Und Spalten auch.
Jetzt wirst du staunen und denken wieso soll ich meine max. 256 Spalten als Long deklarieren.
Ganz einfach, Cells(Z,S) benötigt Long-Werte, d.h egal wie du Z oder S deklariert hast, sie werden im Codeablauf sowieso in Long-Werte umgewandelt, was bei vielen Zellen Zeitverlust bedeutet.

Noch ein Hinweis, Range(„c65536“) ist korrekt für XL97-XL2003, bei XL2007 mit 1 Mio Zeilen könnte es Probleme geben.
Also gewöhn dir bitte gleich an, dies so zu schreiben:
Range(„C“ & Rows.count)
bzw.
cells(rows.count,3)
dann ist dein Code zukunftsoffen, naja solange bis XL2010 kommt :smile:

Nochwas, Select Case ist gut und übersichtlicher als viele Elseif, aber bei nur einer Überprüfung langt If.

Jetzt hau mich nicht daß ich dies alles sage und das ohne deine Code mal genauer angeschaut zu haben und was du da schriebst mit Bedingung einfügen usw.

Das kommt noch, aber ich muß da erst zu meinem Nikotindealer (Kiosk) gehen *Entzugserscheinungen hab*

Zumindest für mich sieht so dein Code besser aus:

Option Explicit
'
Sub tt()
Dim quelle As Worksheet
Dim ziel As Worksheet
Dim i As Long, j As Integer
Set quelle = Workbooks("quelldatei.xls").Worksheets("tabelle1")
Set ziel = Workbooks("zieldatei.xls").Worksheets("tabelle2")
For i = 4 To quelle.Range("c" & Rows.Count).End(xlUp).Row
 If Not IsEmpty(quelle.Cells(i, 3)) Then
 Select Case quelle.Cells(i, 3).Offset(0, 3).Value
 Case True
 quelle.Cells(i, 3).Copy ziel.Range("a" & Rows.Count).End(xlUp).Offset(1, 0)
 End Select
 End If
Next i
End Sub

Gruß
Reinhard

Hi Tina,

entschuldige, hat etwas gedauert, hatte so viel zu tun. Anbei
der Code:

bitte benutze Einrückungen im Code und wenn du hier Code
postest so benutze den pre-Tag, wird unterhalb des
Eingabefensters erläutert.
Dann kann man Code viel flüssiger lesen.

Jawohl, das habe ich nicht gewusst!

Beim Dim von i machst du den üblichen Fehler wie jeder der mit
Vba anfängt, ich auch früher, du hast „i“ als Variant
deklariert.

Bei Dim i, j As Integer ist „i“ variant, J „Integer“
Korrekt ist Dim i As Integer, j As Integer

Das war aber jetztmal ein Schreibfehler :wink:

Nja, in dem Fall ist das irgendwie wurscht, weil du „j“
sowieso nicht benutzt und Integer für „i“ sowieso falsch ist.

j habe ich schon definiert, weil es meine Zeilenzahl für die Zieldatei ist. Wenn ich die erste „Überschrift“ definiere, dann ist i nicht mehr gleich j…

Da Zeilen bis 65536 oder 1 Mio gehen können ist für Zeilen
sowieso Long zwingend angesagt, da Integer nur bis 32xxx geht.

Also gewöhn dir wie ich bitte an Zeilen immer als Long zu
definieren.
Und Spalten auch.
Jetzt wirst du staunen und denken wieso soll ich meine max.
256 Spalten als Long deklarieren.
Ganz einfach, Cells(Z,S) benötigt Long-Werte, d.h egal wie du
Z oder S deklariert hast, sie werden im Codeablauf sowieso in
Long-Werte umgewandelt, was bei vielen Zellen Zeitverlust
bedeutet.

Super, danke!

Noch ein Hinweis, Range(„c65536“) ist korrekt für XL97-XL2003,
bei XL2007 mit 1 Mio Zeilen könnte es Probleme geben.
Also gewöhn dir bitte gleich an, dies so zu schreiben:
Range(„C“ & Rows.count)
bzw.
cells(rows.count,3)
dann ist dein Code zukunftsoffen, naja solange bis XL2010
kommt :smile:

dauert hoffentlich noch!?

Nochwas, Select Case ist gut und übersichtlicher als viele
Elseif, aber bei nur einer Überprüfung langt If.

und wenn aber noch eine dazu kommt?

Jetzt hau mich nicht daß ich dies alles sage und das ohne
deine Code mal genauer angeschaut zu haben und was du da
schriebst mit Bedingung einfügen usw.

Bin gar kein Schlägertyp!

Das kommt noch, aber ich muß da erst zu meinem Nikotindealer
(Kiosk) gehen *Entzugserscheinungen hab*

Hab ich gottseidank vor 8 Jahren aufgehört, aber seitdem ich vor diesen VBA-Sachen sitze, könnte ich wieder anfangen!

Zumindest für mich sieht so dein Code besser aus:

Option Explicit

Sub tt()
Dim quelle As Worksheet
Dim ziel As Worksheet
Dim i As Long, j As Integer
Set quelle =
Workbooks(„quelldatei.xls“).Worksheets(„tabelle1“)
Set ziel = Workbooks(„zieldatei.xls“).Worksheets(„tabelle2“)
For i = 4 To quelle.Range(„c“ & Rows.Count).End(xlUp).Row
If Not IsEmpty(quelle.Cells(i, 3)) Then
Select Case quelle.Cells(i, 3).Offset(0, 3).Value
Case True
quelle.Cells(i, 3).Copy ziel.Range(„a“ &
Rows.Count).End(xlUp).Offset(1, 0)
End Select
End If
Next i
End Sub

Funktioniert perfekt, vielen Dank. Und für mich auch besser nachzuvollziehen als vorher!

Gruß
Reinhard

Darf ich Dich noch was fragen? In Quelldatei, Zeile 12 wechselt mein „Überbereich“ und ich möchte den Neuen quasi als Überschrift in die nächste freie Zeile der Zieldatei eingeben. Die kenne ich ja aber nicht, die ist abhängig von der vorher kopierten Zeilenanzahl. Da tu ich mir auch etwas hart. Da gebe ich jetzt für i = 12 und i = 15 (Bereich wechselt) einfach einen fixen Wert vor, aber das müsste er doch auch selbst erkennen können?!

Vielen Dank nöchmal und Grüße zurück
Tina

P.S. landei = monsterbacke
weil meine Tochter so gerne Monsterbacke-Joghurts isst