Rahmen setzen

26/09/2007 - 09:40 von Tom | Report spam
Hallo,

ich habe innerhalb eines VBA Codes den folgenden Befehl für Rahmen
setzen eingestellt,
d.h. da die Liste immer lànger bzw. auch kürzer wird muss der Rahmen
stàndig angepasst
werden, deshalb lösche ich zunàchst den Rahmen und setze diesen dann
wieder.

Jetzt meine Fragen:
1. Mein eingestellter Code für die Rahmen macht den VBA sehr, sehr
langsam, gibt es einen
besseren, schnelleren Befehl.

2. wenn ich eine Datenreihe lösche (ich muss den Text entfernen, kann
nicht die gesamte Zeile entfernen,
da ich rechts von der Liste eine Auswahlliste habe, die über
Gültigkeit mit den Zellen der 1. Liste verknüpft ist,
löschen würde), und den VBA Code unten durchlaufen lasse, wird der
Rahmen trotzdem noch um 1 Zeile
erweitert, d.h. von dem gelöschten Satz wird immer noch der Rahmen
produziert. Bei einem 2. Durchlauf
verschwindet dann der Rahmen dieses Satzes.

Kann mir jemand vielleicht helfen.

Danke

Tom

hier mein VBA Code:

Cells.Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

Dim lauf As Long, laufGT As Long, laufvorher As Long
Dim letzteZeile As Long, letzteZeileGT As Long, letzteZeilevorher As
Long
Dim Tabelle As String, Tabellevorher As String
Dim MinGT As Long
Const letzteSpalte As String = "E"

Worksheets("Tabelle1").Select

With Worksheets("Tabelle1").Select
Activate
letzteZeile = Cells.Find(What:="*", After:=[C1],
SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Row

Range("A2:" & letzteSpalte & letzteZeile).Select
Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:= _
xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

End With
Application.ScreenUpdating = False




For lauf = 2 To letzteZeile

Range("A1:" & letzteSpalte & letzteZeile).Select
Range(letzteSpalte & letzteZeile).Activate
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
 

Lesen sie die antworten

#1 Robert Gelbmann
26/09/2007 - 11:29 | Warnen spam
Hallo Tom!

"Tom" schrieb ...
ich habe innerhalb eines VBA Codes den folgenden Befehl für Rahmen
setzen eingestellt,
d.h. da die Liste immer lànger bzw. auch kürzer wird muss der Rahmen
stàndig angepasst
werden, deshalb lösche ich zunàchst den Rahmen und setze diesen dann
wieder.

Jetzt meine Fragen:
1. Mein eingestellter Code für die Rahmen macht den VBA sehr, sehr
langsam, gibt es einen
besseren, schnelleren Befehl.



Ja, dazu einige Hinweise:

(1) Alle Zellen zu markieren, schließt vor allem auch alle unbenutzten
Zellen mit ein.
(Obwohl Excel wohl so schlau ist und erkennt, dass du ja das Format
derselben gar nicht wirklich ànderst.)

Du kannst alle Rahmen des benutzten Bereiches wie folgt effizient
entfernen:

'snip
With Worksheets("Tabelle1").UsedRange
.Borders.LineStyle = xlNone
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
End With
'snip

(2) Die "Bremse" in deinem Makro schlechthin ist aber das zeilenweise
"abklappern".
Zumal du jedesmal nochmals (?) die Rahmen entfernst und jedesmal auch
von A1 (?) weg neu formatierst.

Um Dir VBA-Code für eine effiziente Formatierung deiner Liste geben zu
können, müsstest du uns aber mehr über deine Liste verraten:
- Hàngt der Bereich komplett zusammen (dh., keine Leerzeilen oder
Leerspalten)?
- Falls nicht, gibt es irgendeine Spalte, die als Indikator im Sinne
von "die letzte beschriebene Zeile in dieser Spalte ist auch die letzte
Zeile insgesamt" dienen kann?
- usw.

Falls der Bereich komplett zusammenhàngt:
'snip
With Worksheets("Tabelle1").Range("A1").CurrentRegion.Borders
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
'snip


(3) Application.ScreenUpdating = False
... ist schon mal ein guter Ansatz, aber diese Zeile sollte gleich zu
Beginn stehen, damit auch das Entfernen der Rahmen und das Umsortieren
usw. nicht stàndig zu einer (zeitraubenden) Bildschirmaktualisierung
führt.
Zudem solltest du am Ende das Zurücksetzten auf True nicht vergessen.



2. wenn ich eine Datenreihe lösche (ich muss den Text entfernen, kann
nicht die gesamte Zeile entfernen,
da ich rechts von der Liste eine Auswahlliste habe, die über
Gültigkeit mit den Zellen der 1. Liste verknüpft ist,
löschen würde), und den VBA Code unten durchlaufen lasse, wird
der
Rahmen trotzdem noch um 1 Zeile
erweitert, d.h. von dem gelöschten Satz wird immer noch der
Rahmen
produziert. Bei einem 2. Durchlauf
verschwindet dann der Rahmen dieses Satzes.



Die Auswahlliste hat dort systematisch nichts verloren (wofür Du ja
gerade "büßen" musst).
Verschiebe (Ausschneiden & Einfügen) die Liste auf ein eigenes
Tabellenblatt.
Markiere die Liste (ohne etwaiger Überschrift) und definiere dafür
einen Bereichsnamen (Einfügen / Namen / Definieren); z. B.:
"Auswahlliste". In der Gültigkeitsdefinition ànderst du die Quelle dann
einfach auf "=Auswahlliste".
Und schon kannst du bequem die ganze Zeile löschen und deine Probleme
lösen sich dann in Luft auf.


Übrigens:
Du könntest auch die ganze Formatiererei Excel überlassen:
- Entferne zunàchst (manuell) alle Rahmen.
- Dann markiere alle betroffenen Spalten (A bis E soweit ich es dem
Code entnehmen konnte).
(Dadurch sollte die Zelle A1 aktiv sein.)
- Format / Bedingte Formatierung
- "Formel ist" "=ANZAHL2($A1:$E1)>0"
- Danach noch über die Schaltflàche "Format" die gewünschte
Formatierung (Rahmen) einstellen und
- mit OK bestàtigen.

Wann immer dann in einer Zeile zwischen (inklusive) den Spalten A und E
irgendetwas eingegeben ist (dh., irgendeine Zelle befüllt ist), wird
automatisch formatiert.

In der Hoffnung geholfen zu haben, verbleibe ich mit einem leisen


Servus aus Wien,
-Robert Gelbmann-

The world is quiet here.

Ähnliche fragen