136 Aufrufe
Gefragt in Tabellenkalkulation von berpre Mitglied (452 Punkte)
Hallo Excel Freunde,

Nach langer Abwesenheit in diesem Forum, melde ich mich mit einem Fehler in meiner Excel 2019 Datei und bitte um Hilfestellung an die VBA Spezialisten.

Seit Jahren verwende ich diesen farblichen Zeilenbalken als Lineal, dies wurde noch mit Excel 2003 / 2007 erstelt, seit ca. 6 Wochen gibt es einen Fehler mit dem Lineal.

Nach schließen und beenden der Datei, soll der Cursor auf die Zelle "A1" beenden werden.

Bei einem Neustart der Datei, sollte desshalb der Cursor auf der Zelle "A1" stehen.

Zur Zeit sieht das so aus, dass bei Neustart der Datei, der Cursor in einer zufälligen Zelle z.B. "G8" steht und dadurch wird die Zeile "8" von "A bis V" farblich als Lineal darstellt.
bei einem Wechsel auf eine andere Zelle, sollte die farblich markierte Zeile "8"  im Beispiel dann gelöscht werden. Dies wird nicht ausgeführt.
Händisch kann dies zwar über:  Zellen im Beispiel "A8 bis V8", markiere Zellen formatieren, Ausfüllen, Hintergrundfarbe - keine Farbe, gelöscht werden, ist aber hinderlich.

Kann mir ein VBA Spezialist hier behilflich sein ?
Im Anschluss der VBA Code.

Für eine Hilfe wäre ich sehr dankbar.

Gruß  BerPre
 

Option Explicit

Private CellsColor() As Variant
Private objCells As Object
Private bol As Boolean
_________________________________________________________________________

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

Const minZ As Long = 1
Const maxZ As Long = 805
Const minSp As Long = 1
Const maxSp As Long = 25

Dim C As Range
Dim cellColor As Range
Dim WS As Worksheet

Set WS = Sh: Set C = WS.Cells

ReDim Preserve CellsColor(1 To maxSp)

If bol And Not objCells Is Nothing Then
    For Each cellColor In objCells.Cells
        With cellColor
            .Interior.ColorIndex = CellsColor(cellColor.Column)
        End With
    Next cellColor
    bol = False
End If

If Target.Row <= minZ Or Target.Row >= maxZ Or Target.Column < minSp Or Target.Column > maxSp Then
  WS.Range(C(Target.Row, minSp), C(Target.Row, maxSp)).Interior.Color = xlColorIndexNone
  Exit Sub
End If
If Target.Cells.Count > 1 Then Exit Sub

Set objCells = WS.Range(C(Target.Row, minSp), C(Target.Row, maxSp))
For Each cellColor In WS.Range(C(Target.Row, minSp), C(Target.Row, maxSp)).Cells
        With cellColor
            CellsColor(cellColor.Column) = .Interior.ColorIndex
        End With
Next cellColor
bol = True

WS.Range(C(Target.Row, minSp), C(Target.Row, maxSp)).Interior.Color = RGB(204, 255, 204)
End Sub
______________________________________________________________________________________

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveSheet.Range("A1").Select
ThisWorkbook.Save
End Sub

3 Antworten

0 Punkte
Beantwortet von xlking Experte (1.5k Punkte)

Hi BerPre,

funktioniert doch (wenn man die Striche zwischen den Prozeduren weglässt. Der Trennstrich wird vom VBA-Editor automatisch gesetzt.)

Auf Anhieb sehe ich aber tatsächlich 3 kleine Problemchen:

  • Du beendest die Datei mit Activsheet.Range("A1").Select. ActiveSheet muss nicht immer das gewünschte sein. Wenn du dich beim Beenden auf einem Anderen Tabellenblatt oder gar in einer anderen Datei befindest, wird dort die Zelle nach A1 verschoben. Nutze stattdessen einen eindeutigen Blattkennzeichner. z.B. Sheets("Tabelle1")
  • Damit ein durch das Lineal markierter Bereich entfernt bzw. wiederhergestellt wird, muss das Urprungsformat gespeichert sein. Das machst du aber erst mit Selection_Change. Dieses Ereignis musst du also mindestens einmal direkt nach dem Öffnen ausführen. z.B. über das Workbook_Open Ereignis.

Private Sub Workbook_Open()
  Workbook_SheetSelectionChange ActiveSheet, ActiveCell
End Sub
  • Damit das wie gewünscht funktioniert speicherst du zurzeit sämtliche Zellformate per Schleife einzeln in ein Array. Das kostet Zeit durch die die Arbeitsmappe beim Markieren größerer Bereiche ziemlich langsam wird. Ich hab sowas auch schon aufgebaut, nutze dabei aber nicht .Interior.Colorindex sondern .Interior.Pattern also das Muster. Dadurch ist das Selektionsformat vom tatsächlichen Format unabhängig und kann letzteres sogar durchscheinen lassen. Das Speichern entfällt dann auch. Ist vielleicht noch eine Überlegung wert.

Gruß Mr. K.

+1 Punkt
Beantwortet von
Hallo Mr.K.

Danke für Deine schnelle Antwort.

Habe seit 14 Jahren nicht mehr mit einem VBA  Code gearbeitet, bin nur noch ein so genannter Anwender.

Werde versuchen Deinen Vorschlag umzusetzen und später berichten.

Nochmals herzlichen Dank

Gruß BerPre
0 Punkte
Beantwortet von berpre Mitglied (452 Punkte)

Hallo Mr.K.

Danke für deine Info.

Der farbliche Zeilenbalken funktioniert wieder.

Nochmals herzlichen Dank

Gruß BerPre

...