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

Rahmen um einen Bereich wenn Monat=

Rahmen um einen Bereich wenn Monat=
11.10.2016 17:17:15
Kisska
Hallo zusammen,
leider kenne ich mich mit VBA nicht aus, darum bin ich auf eure Hilfe angewiesen.
Ich möchte in Abhängigkeit des in einer Zelle stehenden Monats einen roten dicken Rahmen um einen Bereich ziehen. Mit der bedingten Formatierung ist dies schnell getan, allerdings wird nur ein dünner Rahmen gezogen und dann noch um jede Zelle in dem gewünschten Bereich. Vermutlich lässt sich mein Fall nur durch VBA lösen?
Die Datei mit Veranschaulichung:
https://www.herber.de/bbs/user/108717.xlsx
Freue mich über eure Lösungsvorschläge :-)

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Rahmen um einen Bereich wenn Monat=
11.10.2016 17:31:58
ChrisL
hi
Muss ins Modul der betreffenden Tabelle d.h. Alt+F11, links Doppelklick auf Tabelle, Code einfügen
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "P2" Then
With Range("C1:N8")
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
.Borders(xlEdgeLeft).LineStyle = xlNone
.Borders(xlEdgeTop).LineStyle = xlNone
.Borders(xlEdgeBottom).LineStyle = xlNone
.Borders(xlEdgeRight).LineStyle = xlNone
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
End With
With Range("C2:N7")
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With .Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End With
With Range(Cells(1, Month(Range("P2")) + 2), Cells(8, Month(Range("P2")) + 2))
With .Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Color = -16776961
.TintAndShade = 0
.Weight = xlThick
End With
With .Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Color = -16776961
.TintAndShade = 0
.Weight = xlThick
End With
With .Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Color = -16776961
.TintAndShade = 0
.Weight = xlThick
End With
With .Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Color = -16776961
.TintAndShade = 0
.Weight = xlThick
End With
End With
End If
End Sub

cu
Chris
Anzeige
AW: Rahmen um einen Bereich wenn Monat=
11.10.2016 17:43:03
Daniel
Hi
wenn der dünne Rahmen ausreichen würde, dann brauchst du jeweils eine Bedinge Formatierung die die drei Bereiche:
C1:N1 mit Rahmen links, rechts, oben
C2:N7 mit Rahmen links, rechts
C8:N8 mit Rahmen links, rechts, unten
wenns ein Dicker Rahmen sein muss, nur mit Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
If Target.Address = "$P$2" Then
'--- Aussenbereich Rahmen löschen
For i = 7 To 12
Range("c1:N1,c8:n8").Borders(i).LineStyle = xlNone
Next
'--- Innenbereich Rahmen neu ziehen
For i = 7 To 12
With Range("c2:n7").Borders(i)
.LineStyle = xlContinuous
.Weight = xlThin
.Color = vbBlack
End With
Next
'--- Wenn Datum in Liste, dann Spalte mit Datum rot umranden
If WorksheetFunction.CountIf(Range("C2:N2"), Range("P2").Value) = 1 Then
For i = 7 To 10
With Range("C1:N8").Columns(WorksheetFunction.Match(Range("P2"), Range("C2:N2"), 0)) _
.Borders(i)
.LineStyle = xlContinuous
.Weight = xlThick
.Color = vbRed
End With
Next
End If
End If
End Sub

der Code muss ins modul des Tabellenblatts und wird ausgeführt, wenn du den Wert in P2 änderst
Gruß Daniel
Anzeige
AW: Rahmen um einen Bereich wenn Monat=
13.10.2016 11:19:55
Kisska
Hallo Chris, hallo Daniel,
lieben Dank für eure schnelle Lösungen!
Sind die beiden Lösungen in der Logik identisch, nur in der Code-Länge unterschiedlich?
@Daniel:
Die bedingte Formatierung funktioniert super, nur bei meiner Tabelle hebt sich der Rahmen schlecht ab.
https://www.herber.de/bbs/user/108748.xlsx
Außerdem sieht man durch die Gruppierung den linken Rand in Spalte F nicht.
Gibt es evtl. die Möglichkeit, nur die Dicke des Rahmens mit VBA zu lösen?
Danke übrigens für die Kommentierungen in deinem VBA-Code! Dürfte ich erfahren was i=7 to 12 und i=7 to 10 aussagen?
@Chris & Daniel:
Bei eurer VBA-Lösung wird die Tabelle neu mit dünnen schwarzen Linien gezeichnet.
Beispiel mit Daniels Code: https://www.herber.de/bbs/user/108749.xlsm
Gibt es die Option, meine Tabellenformatierung zu belassen?
Ist es eigentlich möglich, den VBA-Code größtenteils selbst mit Recorder aufzunehmen und nur die if then Bedingung später im Editor zu ergänzen?
Danke euch für die Unterstützung!
Gruß
Kisska
Anzeige
AW: Rahmen um einen Bereich wenn Monat=
13.10.2016 12:54:31
ChrisL
Hi
Sind die beiden Lösungen in der Logik identisch, nur in der Code-Länge unterschiedlich?
Ja, Daniels Vorschlag ist definitiv eleganter
Gibt es evtl. die Möglichkeit, nur die Dicke des Rahmens mit VBA zu lösen?
Nein
Danke übrigens für die Kommentierungen in deinem VBA-Code! Dürfte ich erfahren was i=7 to 12 und i=7 to 10 aussagen?
Index für Rahmen links, rechts, oben, unten, diagonal:
https://msdn.microsoft.com/en-us/library/office/ff835915.aspx
Anstatt wie in meinem Code, wo jede Linie einen einzelnen Codeblock hat, durchläuft er die unterschiedlichen Linien in einer Schleife
Gibt es die Option, meine Tabellenformatierung zu belassen?
Nein, der Rahmen muss zurück gesetzt werden. Du kannst aber xlThin in xlMedium ändern.
Ist es eigentlich möglich, den VBA-Code größtenteils selbst mit Recorder aufzunehmen und nur die if then Bedingung später im Editor zu ergänzen?
Ja. Die Aufzeichnung ergibt nicht immer einen besonders "schönen" Code, aber prinzipiell ja.
cu
Chris
Anzeige
AW: Rahmen um einen Bereich wenn Monat=
14.10.2016 16:14:03
Daniel

Sind die beiden Lösungen in der Logik identisch, nur in der Code-Länge unterschiedlich?
ich vermute mal ja.
ich habe nur irgenwann mal enteckt, dass die Rahmenpostionen (link, rechts, oben, unten usw) durchnummeriert sind und man daher eine Schleife verwenden kann, wenn alle Rahmenpositionen gleich formatiert werden sollen so dass man nicht jede Position einzeln formatieren muss.
Gruß Daniel
nur eine bedingte Formatierung
13.10.2016 16:34:43
KlausF
Moin,
man muss den Gaul von hinten aufzäumen ... :-)
Mit nur einer bedingten Formatierung:
https://www.herber.de/bbs/user/108765.xls
Gruß
Klaus
Anzeige
AW: nur eine bedingte Formatierung
14.10.2016 08:29:52
ChrisL
Hi Klaus
Super Idee...
I like :)
cu
Chris
AW: nur eine bedingte Formatierung
14.10.2016 09:32:58
Kisska
Hi Klaus,
danke die Variante ist echt klasse!
Allerdings wenn ich die vertikalen Linien formatiert haben möchte, dann muss ich die Bedingung für jede einzelne Spalte erstellen - leider nicht so praktisch. Oder vertue ich mich da?
Gruß
Kisska
verstehe nicht
14.10.2016 10:06:22
KlausF
Moin,
verstehe nicht was Du damit meinst.
Im Moment macht die bedingte Formatierung alle Linien in schwarz-dünn
und die eigentlichen Aussenlinien sind rot-dick. So war jedenfalls der Wunsch.
Wenn Du jetzt die dünnen schwarzen Linien einzeln unterschiedlich formatieren
willst bekommst Du natürlich ein Problem. Ansonsten kannst Du alles auswählen
und die bedingte Formatierung ändern. Evtl. musst Du dann noch die obere und
untere Zeile separat auswählen und extra formatieren, weil ja oben und unten
die Abschlusslinien sind. Ist doch aber kein großer Aufwand. Oder verstehe
ich Dich falsch?
Gruß
Klaus
Anzeige
AW: verstehe nicht
14.10.2016 10:26:44
Kisska
Ich wollte eigentlich einen kompletten roten Rahmen um eine Spalte haben, aber mir würden inzwischen nur die roten Linien links und rechts reichen.
Dies kann ich erreichen, wenn ich zwischen den einzelnen Spalten schmale Zwischenspalten einfüge.
Dann kann ich die Monatsspalten markieren und deine vorgeschlagene Lösung anwenden.
Ist leider umständlich, aber funktioniert zumindest. Großes Dankeschön dafür!
Schade, dass man den Rahmen bzw. die vertikalen Linien nicht eleganter mit VBA erreichen kann.
ist doch ganz leicht
14.10.2016 11:16:32
KlausF
Hi,
ich glaube, Du hast das Prinzip noch nicht verstanden :-)
Wenn dir die roten Linien links und rechts reichen dann wählst Du
ALLES aus und gehst auf Zellen formatieren. Jetzt siehst Du die
fetten roten Linien und wählst die waagrechten ab.
Danach wählst Du nur die obere Zeile als Ganzes aus, gehst wieder auf
Zellen formatieren und gibst der oberen Linie ein dünnes schwarz.
Analog die untere Zeile auswählen und die untere Linie ändern.
Hat also in diesem Fall nichts mit der bedingten Formatierung zu tun ...
Gruß
Klaus
Anzeige
AW: ist doch ganz leicht
14.10.2016 14:44:04
Kisska
Hi Klaus,
auch wenn ich bereits eine perfekte Lösung bekommen habe, interessiert mich dein Ansatz.
In deiner Excel-Datei, die du geschickt hast, wird nur die obere und untere Rahmenlinie rot. Ich wollte allerdings, dass entweder alle vier Rahmenlinien erscheinen oder wenigstens die senkrechten, also die linken und die rechten.
Probleme mit den Excelversionen!
14.10.2016 15:56:58
KlausF
Hi,
[ In deiner Excel-Datei, die du geschickt hast, wird nur die obere und untere Rahmenlinie rot. ]
Jetzt wird mir einiges klarer. Ich habe die Datei unter Excel X (Mac) hergestellt. Da funktioniert der
vollständige Rahmen! Als ich das bei mir hoch gespeichert habe auf Version 2011 habe ich auch nur
die Linie oben und unten gesehen. In der Version musste ich noch 2 weitere bedingte Formatierungen einfügen.
Leider habe ich keine Version 2007. Ich habe das dann noch einmal auf 2004 gespeichert (funktioniert) und
auf Excel 2008 (konnte ich nicht testen). Im angehängtem Archiv hast Du nun also 4 Versionen, von denen
3 bei mir funktionieren: X, 2004 und 2011.
@Alle. Vielleicht kann jemand auf dieser Basis ein funktionierendes 2007 mit bedingter Formatierung erstellen?
Nichts gegen die Makrolösungen aber sie sind m.V. überflüssig.
https://www.herber.de/bbs/user/108793.zip
Gruß
Klaus
Anzeige
AW: Probleme mit den Excelversionen!
14.10.2016 16:14:53
Kisska
Hi Klaus,
hab eben die 2011-Version ausprobiert. Die zwei bedingten Formatierungen für die Nachbar-Spalten waren entscheidend. Wenn man eine Tabelle mit einer einfachen bzw. einheitlichen Formatierung wie im Beispiel hat, dann ist dies die ideale Lösung :-)
Leider hat meine Tabelle einen fetten Rahmen außen und auch innerhalb der Tabelle einige fette horizontale und links und rechts von Monatsspalten fette vertikale Linien. Ich schätze in so einem Fall ist eine VBA-Lösung doch einfacher.
Gruß
Kisska
Sau-Billyboy
14.10.2016 16:46:23
KlausF
Hi Kisska,
beruhigend zu wissen, dass 2011 mit 2013 kompatibel ist.
Für mich ist das auch sehr lehrreich weil ich eigentlich
ständig mit der alten Excelversion arbeite. Hätte nicht
gedacht, dass Microsoft die bedingten Formatierungen
nicht kompatibel gestalten kann beim Hochspeichern.
Sau-Billyboy ...
In Deinem Fall ist dann natürlich die Makrolösung erste Wahl.
Gruß und danke für's Testen
Klaus
Anzeige
AW: verstehe nicht
14.10.2016 11:23:00
Daniel
Hi
das einfachste Lösung für dich ist wahrscheinlich folgende:
1. erstelle von Hand ein Rechteck in der gewünschten Formatierung, dh roter fetter Rahmen und ohne Füllung.
2. Schreibe ein Makro, welches dieses Reckteck bei Eingabe in P2 an die passende Stelle verschiebt.
Dazu nutze folgenden Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ÜB As Range
Set ÜB = Range("C2:N2")
Dim Zelle As Range
If Target.Address = "$P$2" Then
With Me.Shapes("Rechteck 1")
If WorksheetFunction.CountIf(ÜB, Target) > 0 Then
Set Zelle = ÜB.Cells(1, WorksheetFunction.Match(Target, ÜB, 0))
.Top = Zelle.Offset(-1, 0).Top
.Left = Zelle.Left
.Width = Zelle.Width
.Height = Range("B3").End(xlDown).Offset(2, 0).Top
.Visible = True
Else
.Visible = False
End If
End With
End If
End Sub
gruß Daniel
AW: verstehe nicht
14.10.2016 14:33:19
Kisska
Hi Daniel,
danke für die Lösung! Eine ähnliche hat Hansueli vorgeschlagen und die passt perfekt :-)
Nichtsdestotrotz würde ich gerne deinen Code ausprobieren an einer anderen Tabelle.
Wofür stehen die Ziffern in folgenden Code-Teilen?
Set Zelle = ÜB.Cells(1, WorksheetFunction.Match(Target, ÜB, 0))
.Top = Zelle.Offset(-1, 0).Top
.Height = Range("B3").End(xlDown).Offset(2, 0).Top
Gruß
Kisska
AW: verstehe nicht
14.10.2016 16:09:47
Daniel
Hi
welche Ziffern meinst du?
das mit dem Offset sollte eigentlich klar sein, das verschiebt nur den Zellbezug um die entsprechende Zellenanzahl
die 0 im Match gibt an, dass nach einer genauen Übereinstimmung der Werte gesucht wird und eine Sortierung nicht zwingend erforderlich ist.
Gruß Daniel
AW: Rahmen um einen Bereich wenn Monat=
14.10.2016 11:19:08
EtoPHG
Hallo Kisska,
Noch ein etwas anderer Ansatz:
1. Zeichne irgendwo auf dein Tabellenblatt ein Rechteck - Keine Füllung - Rahmen, wie du die Markierung gerne dargestellt haben will. Die Grösse und Position spielt keine Rolle!
2. Merke dir den Namen des Objekts (solange Selektiert links oben im Namenfeld). Diesen Namen musst du ggf. im Code unten anpassen (in der Zeile Const matchedMarkName As... )
3. Füge den Code unten in das Tabellenblatt ein. Alt-F11 - Tabellenblatt im Navigator doppelklicken - Copy Paste des Codes:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
' Check this address for changes
Const targetAddress As String = "$P$2"
' search target-value in this row to determine...
Const matchRow As Long = 2
'... match with column
Dim matchedCol As Long
' name of shape to mark range
Const matchedMarkName As String = "Rechteck 1"
' Shape object
Dim matchedMark As Shape
' Offset of rows from matched cell to top
Const matchOffsetTop As Long = -1
' Offset of rows from matched cell to bottom
Const matchOffsetBottom As Long = 6
If Target.Address = "$P$2" Then
On Error Resume Next
Set matchedMark = Shapes(matchedMarkName)
If matchedMark Is Nothing Then
MsgBox "No corresponding shape for range marking found!", _
vbCritical, "Marking ranges"
On Error GoTo 0
Exit Sub
End If
matchedMark.Visible = msoFalse
matchedCol = Application.Match(Target, Rows(matchRow), 0)
On Error GoTo 0
If matchedCol > 0 And matchedCol 

Wenn du jetzt Werte in P2 (bzw. gemäss den Const(anten) Parametern im Code) änderst und diese mit einemm gesuchten Wert übereinstimmen, sollte die Markierung am richtigen Ort erscheinen. Die Markierung passt sich automatisch Spaltenbreiten und Zeilenhöhen an! Sie verschwindet, wenn der Wert in der überprüften Zelle nicht gefunden wird.
Gruess Hansueli
AW: Rahmen um einen Bereich wenn Monat=
14.10.2016 13:43:27
Kisska
Hi Hansueli,
WOW! Die Lösung ist perfekt für mich! 1000 mal danke dafür! :-)) Hätte niemals gedacht, dass man eine Form mittels VBA an die Spaltenform anpassen und unter einer Bedingung verschieben kann. Wahnsinn!
You've made my day :)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige