PDA

Vollständige Version anzeigen : Fette Rahmenlinie nach Änderung des Zellenwertes


OberUbongo
17.07.2014, 09:26
Moin zusammen,

ich habe ein Makro, welches eine neue Datei mit Daten erstellt und die Daten nach Spalte A sortiert.
Nun würde ich gerne eine fette Rahmenlinie in der Zeile ziehen lassen, jedes Mal wenn sich der Wert in Spalte A ändert.

Wie würde dazu der VBA Code aussehen?

Vielen Dank für Eure Hilfe.

Mc Santa
17.07.2014, 09:47
Hallo,

schau mal ob dir dieser Code hilft, du musst ihn in das Tabellenblattmodul kopieren und der Code wirkt nur auf diesem Blatt:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng As Range
For Each rng In Target
Dim ber As Range
Set ber = Me.Range("A:H")
With Intersect(rng.EntireRow, ber)
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
With .Borders
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
End With
Next rng
End Sub

Hilft dir das?
Fragen und Feedback sehr gerne :)

VG

OberUbongo
17.07.2014, 11:30
Hallo Mc Santa,

vielen Dank für die schnelle Antwort.

So funktioniert es leider noch nicht.
Wie muss es denn aussehen, wenn ich es in bestehenden Code einbetten möchte?
Ich würde es gerne an der Stelle einbetten, nach der die Sortierung durch ist.

Kannst Du evtl. erläutern, was der Code Schritt für Schritt macht?
Bis einschließlich Zeile "With Intersect(rng.EntireRow, ber)" verstehe ich es nicht wirklich. Der Rest danach ist klar.

Vielen Dank.

Mc Santa
17.07.2014, 11:39
Hallo,

dazu müsste ich deinen bisherigen Code sehen. Insbesondere: Was geschieht nach der Sortierung noch? Eine Beispieldatei ist sicher hilfreich.

Anbei mein kommentierter und korrigierter Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng As Range

'wurden mehrere Zellen gleichzeitig bearbeitet?
'jede geänderte Zelle wird einzeln über die Variable rng angesprochen
For Each rng In Target

If rng.Column = 1 Then 'wenn die aktuelle Zelle in Spalte A ist

'ich definiere einen Wirkungsbereich: Die Spalten A-H
Dim ber As Range
Set ber = Me.Range("A:H") 'Me bezieht sich auf das Tabellenblatt. So vermeide ich den Namen und das Makro kann kopiert werden

'Finde den Schnittpunkt zwischen der gesamten Zeile, der aktuellen Zelle (rng.EntireRow) und dem Wirkungsbereich (das sind die zuvor definierten Spalten)
'Wenn ich also Gerade Zelle A10 habe, dann findet ich den Schnittpunkt zischen Zeile 10 und den Spalten A-H
' --> Der Bereich A10:H10 wird bearbeitet
With Intersect(rng.EntireRow, ber)


.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
With .Borders
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
End With
End If
Next rng
End Sub

VG

OberUbongo
17.07.2014, 14:32
Hallo nochmal,

ich habe leider nur minimale Grundkenntnisse von VBA und suche mir einiges zusammen. Einiges kann ich auch nachvollziehen, aber manche Sachen sind mir einfach leider unklar.

Auch der erste Teil Deines Codes:

"Worksheet_Change(ByVal Target As Range)"

Ich hätte vermutet, dass ich hier was ersetzen muss, z.B. Change, aber vielleicht kannst Du mir das auch kurz erläutern?
Vielen Dank.



Hier der Code für die Sortierung. Wie kann man es dort am besten einbetten? Bzw. macht das überhaupt Sinn?



ActiveWorkbook.Worksheets(G_S_NOM_FEUILLE_BF_AGRAVIS).AutoFilter.Sort.SortFields .Clear
ActiveWorkbook.Worksheets(G_S_NOM_FEUILLE_BF_AGRAVIS).AutoFilter.Sort.SortFields .Add Key:= _
Range("A5" & Range("A650").End(xlUp).Row), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
:=xlSortNormal
ActiveWorkbook.Worksheets(G_S_NOM_FEUILLE_BF_AGRAVIS).AutoFilter.Sort.SortFields .Add Key:= _
Range("B5" & Range("B650").End(xlUp).Row), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
:=xlSortNormal
With ActiveWorkbook.Worksheets(G_S_NOM_FEUILLE_BF_AGRAVIS).AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With


Vielen Dank.

Mc Santa
17.07.2014, 14:56
Hallo,

ehrlich gesagt verstehe ich die Aufgabe nicht mehr ganz. Wann genau sollte der Rahmen erscheinen?
Ständig, wenn die Mappe benutzt wird, und Spalte A geändert wird?
Nur innerhalb des Makros, dann unter welchen Bedingungen? Was hat die Sortierung damit zu tun?

Außerdem hab ich nach dem gesamten Code gefragt. Insbesondere, was NACH der Sortierung geschieht, ist interessant. (Zumindest dann, wenn jetzt die Zeilen markiert werden sollen.)

VG

OberUbongo
18.07.2014, 07:43
Moin Mc Santa,

mit dem Makro wird eine neue Excel-Datei erstellt, die tabellarisch Daten aus drei verschiedenen Tabellenblättern darstellt.
In der neuen Datei werden die Daten dann nach Spalte A sortiert.
Und nun würde ich ganz gerne jedes Mal eine fette Rahmenlinie bis zur letzten Spalte mit Daten ziehen lassen, wenn sich der Zellenwert in Spalte A ändert.

Ein Beispiel wie das aussehen soll, habe ich angehängt.

Danke für die Hilfe!

Mc Santa
18.07.2014, 08:46
Hallo,

zunächst einmal: in deiner Datei sind keine Makros vorhanden.

Außerdem versuche ich zu präzisieren:
Und nun würde ich ganz gerne jedes Mal eine fette Rahmenlinie bis zur letzten Spalte mit Daten ziehen lassen, wenn sich der Zellenwert in Spalte A ändert.
WAS genau ist eine Änderung?

Neuer Eintrag
Eintrag gelöscht
Reihenfolge ändert sich
Alles davon
Teile davon
Sonstiges?

WIE geschieht diese Änderung?

Makro ändert die Daten
User ändert die Daten
Beides
Sonstiges?


Um weitere Missverständnisse zu vermeiden, solltest du zusätzlich zu meinen Fragen eine Beispielmapp anlegen, die in einem Tabellenblatt den IST-Zustand zeigt und in einem anderen Tabellenblatt den (von Hand erstellten) SOLL-Zustand. Dazu eine Beschreibung, nach welchen Regeln du von Ist zu Soll gekommen bist.

VG