Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
352to356
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
352to356
352to356
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Bereiche "subtrahieren"

Bereiche "subtrahieren"
22.12.2003 15:21:50
Galenzo
Hallo Excel.Freunde,

ich möchte bei der Auswahl von Zellen mit Farbwechsel reagieren.
Dazu nutze ich das WorkSheet_SelectionChange-Ereignis und wechsle für alle Zellen, die innerhalb des festgelegten Bereiches liegen die Farbe

Dim rng As Range
Set rng = [F5:Z3000]
Intersect(Target, rng).Interior.ColorIndex = 33

Soweitsogut - das geht.

Nun möchte ich vom vorgegebenen Bereich aber jede 10. Zeile abziehen.
Die Zellen jeder 10. Zeile soll praktisch nicht umgefärbt werden, auch wenn sie markiert sind.

Konkret: Wie definiere ich einen Bereich, der über Spalten F bis Z alle Zeilen - außer den jeweils 10. Zeilen enthält.
Gibt es eine Art "Gegenstück" zu UNION, welches Bereiche voneinander abzieht?

Ich danke Euch schonmal für's lesen und freue mich auf Tips.

mfg

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

Betreff
Datum
Anwender
Anzeige
AW: Bereiche "subtrahieren"
22.12.2003 16:04:50
Beni
Hallo Galenzo,
probiere diesen Code.
Gruss Beni


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Dim rng As Range
Set rng = [F5:Z3000]
For i = 10 To Target.Row Step 10
If Target.Row = i Then Exit Sub
Next i
If (Intersect(Target, rng) Is Nothing) Then Exit Sub
Intersect(Target, rng).Interior.ColorIndex = 33
End Sub

AW: Bereiche "subtrahieren"
22.12.2003 17:05:11
Boris
Hi Galenzo,

ich geh mal davon aus, dass du im Beispiel mit jeder 10. Zeile meinst:
Zeile 15,25,35 etc...

Dann vielleicht so (wobei Markierungen mit mehr als 10000 Zellen abgefangen werden, da es sonst zu lange dauert):

Option Explicit


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
On Error Resume Next
Dim rng As Range, lRow As Long
Set rng = [F5:Z3000]
If Target.Cells.Count > 10000 Then
MsgBox "Bitte nicht so große Bereiche markieren", , "Gebe bekannt..."
Exit Sub
End If
For lRow = Target.Row To Target.Rows.Count
If (lRow + 5) Mod 10 <> 0 Then
Intersect(Rows(lRow), rng).Interior.ColorIndex = 3
Else
Intersect(Rows(lRow), rng).Interior.ColorIndex = xlNone
End If
Next lRow
End Sub


Grüße Boris
Anzeige
Kommando zurück...
22.12.2003 17:11:58
Boris
Hi Galenzo,

wenn überhaupt müsste es heissen:

For lRow = Target.Row To Target.Row + Target.Rows.Count

aber so wird immer der ganze Zeilenbereich F bis Z markiert - auch wenn nur eine Zelle ausgewählt wurde...

Muss nochmals überlegen - im Sinne einer einigermaßen vernünftigen Performance möchte ich nämlich nicht jede einzelne Zelle aus Target abfragen (was theoretisch natürlich möglich wäre).

Grüße Boris
Dann mit Intersect(Intersect(...))
22.12.2003 17:21:55
Boris
Hi Galenzo,

so geht´s - aber inzwischen bin ich mir nicht mehr sicher, ob es auch nicht viel einfacher geht...

Option Explicit


Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
On Error Resume Next
Dim rng As Range, lRow As Long
Set rng = [F5:Z3000]
If Target.Cells.Count > 10000 Then
MsgBox "Bitte nicht so große Bereiche markieren", , "Gebe bekannt..."
Exit Sub
End If
For lRow = Target.Row To Target.Row + Target.Rows.Count
If (lRow + 5) Mod 10 <> 0 Then
Intersect(Intersect(Rows(lRow), Target), rng).Interior.ColorIndex = 3
Else
Intersect(Intersect(Rows(lRow), Target), rng).Interior.ColorIndex = xlNone
End If
Next lRow
End Sub


Grüße Boris
Anzeige
AW: werd' ich mal probieren
22.12.2003 19:05:27
Galenzo
Hallo,
das mit Intersect(Intersect(.. müßte ich mal ausprobieren. Da bin ich ja noch garnicht drauf gekommen.
Das Durchlaufen des Bereiches ist leider keine passende Variante - ich brauche eben den Bereich.
(Um die jeweils 10. Zeilen zu kriegen reicht ja auch eine Prüfung der ganzzahligen Division auf den Rest 0 - also nur 10, 20, 30 etc sind ganzzahlig durch 10 teilbar.)

Vielen Dank für die Anregungen!
Und was prüfst du auf den ganzzahligen Rest?
22.12.2003 19:56:32
Boris
Hi Galenzo,

...doch wohl die Zeile - und die steckt ja hinter lRow (Target.Row). Also irgendwie musst du ja die Zeilen auslesen - und dafür musst du sie imho auch alle durchlaufen.

Grüße Boris
Anzeige
AW: Danke Boris.
23.12.2003 13:24:34
Galenzo
Hallo,
also Intersect(Intersect(.. geht nicht.

Erstmal Danke für deine Hilfe Boris. Ich werd' mir das nochmal genau durch den Kopf gehen lassen. Es wird wohl wie's aussieht kein Weg dran vorbeiführen, den markierten Bereich zu durchlaufen und (richtig!) die Zeilennummern zu prüfen.

Ich dachte nur, es wäre möglich, analog zu UNION mit einer Art Subtraktion einen Bereich zu definieren :-(

mfg
AW: Danke Boris - aber ich versteh dich nicht...
23.12.2003 13:50:19
Boris
Hi Galenzo,

mir soll´s ja eigentlich egal sein - aber du hast bisher kein Wort zu dem von mir geposteten Code verloren - denn der macht genau das, was du beschrieben hast.
Natürlich bleiben die Zeilen 15,25,35 etc... und nicht 10,20,30 ohne Farbe - aber das ist ja nur ne Miniänderung im Code:
Anstatt

If (lRow + 5) Mod 10 <> 0 Then

dann halt

If lRow Mod 10 <> 0 Then

Und schon bleiben die Zeilen 10,20,30 etc... ohne Farbe.
Oder ich hab es doch am Ende noch falsch verstanden?

Grüße Boris
Anzeige
AW: Bereiche "subtrahieren"
22.12.2003 23:44:07
Reinhard
Hi Galenzo,
nachfolgende Makros funktionieren.
Allerdings traten 2 Dinge auf, von denen ich nur eins glattgebügelt habe.

1) Wenn exakt eine Zelle markiert wird, so werden in 10 Zellen Formate reinkopiert, deshalb ist im Code die Abfrage:
If Bereich.Cells.Count <> 1 Then

2) Noch nicht korrigiert ist das Phänomen, dass, wenn mehrere Zellen im Grenzbereich von F5:Z3000 markiert werden und davon liegt exakt eine im Bereich F5:Z3000 dann werden auch die Zellen außerhalb des Bereichs F5:Z3000 mit formatiert.
Müßtest du ggfs noch abfangen.

Gruß
Reinhard

Sub NurEinmalNötig()
Set WS3 = ThisWorkbook.Worksheets("Tabelle3")
Set WS1 = ThisWorkbook.Worksheets("Tabelle1")
WS3.Range("A1:A9").Interior.ColorIndex = 33
WS3.Range("A10").Interior.ColorIndex = xlNone
WS1.Activate
Set WS3 = Nothing
Set WS1 = Nothing
End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set Bereich = Application.Intersect(Target, Worksheets("Tabelle1").Range("F5:Z3000"))
If Bereich Is Nothing Then Exit Sub
If Bereich.Cells.Count <> 1 Then
ThisWorkbook.Worksheets("Tabelle3").Range("A1:A10").Copy
Bereich.PasteSpecial Paste:=xlFormats
Else
Target.Interior.ColorIndex = 33
End If
Set Bereich = Nothing
End Sub

Sub test()
ActiveSheet.Cells.Interior.ColorIndex = xlNone
End Sub


Anzeige
AW: Bereiche "subtrahieren"
23.12.2003 13:34:53
Galenzo
Danke Reinhard.

Das trifft's leider nicht ganz.
Ich habe mich in meiner Fragestellung vielleicht etwas ungenau ausgedrückt.

In meinem Worksheet_SelectionChange mache ich das:

Dim rng As Range
Set rng = [F5:Z3000]
Intersect(Target, rng).Interior.ColorIndex = 33

Ergebnis: ALLE Zellen meiner Auswahl, die IN dem Bereich rng liegen werden gefärbt.
Ich möchte aber, daß die Zeilen 10, 20, 30 usw. NICHT mit umgefärbt werden.
Ich dachte daran, dies gleich bei der Definition des "Prüf"-Bereiches rng zu berücksichtigen. Ich könnte ja schreiben:
set rng=([F5:Z9],[F11:Z19],[F21:Z24]..... usw.
Das würde es ja dann so tun. Problem: Tabelle nach unten offen.

Ich werde nun aber den umgekehrten Weg gehen: Erst färben, dann den Bereich durchlaufen und aus den 10er-Zeilen wieder die Farbe rausnehmen.

Danke - und ein Frohes Fest.
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige