Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Curserposition: Ganze Zeile farblich hervorheben!





Frage

Hallo! Folgendes Makro markiert die jeweils ganze Zeile der aktuellen Zelle. Also wenn der Curser im sheet bewegt wird, ist immer die aktuelle Zeile farblich hervorgehoben. Sinnvoll bei großen Tabellen. [code] Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range) Static Zelle As Range If Not Rows Is Nothing Then Cells.Interior.ColorIndex = xlNone End If Rows(Target.Row).Interior.ColorIndex = 35 Set cell = Target End Sub [/code] Wie kann ich jetzt diese Makro über eine Tastenkombination oder Schalter Ein- und Ausschalten??? Obrigadio Jones

Antwort 1 von Nostradamus

Hi JonesM

kopier folgene Zeilen in ein neues Modul


Public i As Integer


Private Sub an_aus()
If i = 0 Then
i = 1
ElseIf i = 1 Then
i = 0
End If

End Sub


Ausserdem kannst du in deiner Symbolleiste einen benutzerdefinierten Button einfügen und ihm das Makro zuweisen.


und dein Skript musst du dann nur noch in eine if-Abfrage einfügen


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If i = 1 Then
Static Zelle As Range
If Not Rows Is Nothing Then
  Cells.Interior.ColorIndex = xlNone
End If

Rows(Target.Row).Interior.ColorIndex = 35
Set cell = Target
End If
End Sub



Antwort 2 von JonesM

Hallo!
Bin leider erst heute dazu gekommen es zu testen...

Also, das funktioniert leider nicht. Das Prinzip ist mir klar, ich kann das Makro ausführen aber es passiert nichts.

Ich habe in dem Script auch das erste
End If
nach unten geschoben (vor das zweite), aber es tut nicht...
[B]
? ? ? ?


Antwort 3 von coros

Hallo Jones,

das selbe Anliegen hatte vorige Woche schon mal jemand. Ich habe dem Poster dann nachfolgende Code erarbeitet.

Die Anweisung muß in der VBA-Umgebung in Diese Arbeitsmappe kopiert werden.

Option Explicit
' Zelle A bis AZ markieren falls die Aktive Zelle in diesem Bereich
' alte Farbe wieder zurückstellen bei wechsel und schliessen
' farbveränderungen im markiertem Bereich werden nicht zurück gestellt, außer Rot

Private Sub Workbook_Activate()
On Error GoTo neu
If Application.CommandBars("Symbolleiste xyz").Visible = False Then
Application.CommandBars("Symbolleiste xyz").Visible = True
End If
Exit Sub
neu:
Workbook_Open
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Zurück
End Sub

Private Sub Workbook_Open()
'=========================================================================================
'Mit dem nachfolgenden Code wird beim Öffnen der Datei eine Symbolleiste mit dem Namen
'"Symbolleiste xyz" erstellt. Sie in diesem Beispiel zwei Funktionen: Zeilenmarkierung
'ein- und usschalten und eine Taste ohne Funktion
'=========================================================================================
Dim cb As CommandBar
Dim CBC As CommandBarButton
Dim I%
On Error Resume Next
Set cb = Application.CommandBars.Add(Name:="Symbolleiste xyz", _
temporary:=True, Position:=msoBarTop)
On Error GoTo 0
If Application.CommandBars("Symbolleiste xyz").Visible = False Then
cb.Visible = True
'=========================================================================================
'Hier wird die Anzahl der Schaltflächen (hier also 2) eingetragen. Bei drei
'Schaltflächen müsste eine 3 eingetragen werden usw.
'=========================================================================================
For I = 1 To 2
Set CBC = cb.Controls.Add(Type:=msoControlButton)
With CBC
.Width = 50 ' Breite der Schalter
.Style = msoButtonCaption ' Text auf Schaltfläche
Select Case I
Case 1
.Caption = "Zeilenmarkierung An/Aus"
.OnAction = "Zeilenmarkierung_an_aus"
.TooltipText = "Taste drücken Zeilenmarkierung zu aktivieren oder zu deaktivieren"
Case 2
'=========================================================================================
'In .Caption = wird der Text, den die Schaltfläche anzeigen soll eingegeben
'=========================================================================================
.Caption = "Ohne Funktion"
'=========================================================================================
'In .OnAction = wird der Makroname, des Makro das ausgeführt werden soll, eingetragen.
'Hier ist es das Makro an_aus, zu finden in Modul3
'=========================================================================================
.OnAction = ""
'=========================================================================================
'In .TooltipText = wird der Text eingegeben, der erscheinen soll, wenn man die
'Schaltfläche mit der Maus berührt, also ein Kommentartext
'=========================================================================================
.TooltipText = "Hier steht ein Text"
'=========================================================================================
'Mit dieser Anweisung wird die Gruppierung (der kleine senkrechte Strich hinter der
'Schaltfläche) begonnen. Der Eintrag muss nicht geändert werden, es sei denn es soll
'keine Gruppierung erstellt werden. Dazu muss nur Text True in False geändert werden.
'=========================================================================================
.BeginGroup = True
End Select
End With
Next I
End If
'=========================================================================================
'Hier gibt man die Länge an, bis wo die Zeile markiert werden soll. In diesem Beispiel wird
'bis zur Spalte AZ markiert. Es muss aber vorher die selbe Zahl noch unter Module in das
'Modul1 dieselbe Zahl eingetragen werden.
'=========================================================================================
If ActiveCell.Column < 53 Then Auslesen


End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
I = 0
On Error Resume Next
'=========================================================================================
'Mit dieser Anweisung wird beim Beenden der Datei die Symbolleiste xyz gelöscht und das
'Makro Zurück ausgeführt
'=========================================================================================
Application.CommandBars("Symbolleiste xyz").Delete
Zurück

End Sub



Private Sub Workbook_SheetActivate(ByVal Sh As Object)
'=========================================================================================
'Makro Zurück wird ausgeführt
'=========================================================================================
Zurück
'=========================================================================================
'Es werden nur bestimmte Zeilen markiert und zwar Zeile 1 bis Zeile 65000. Hier muss auch
'die Zahl, die unter Modul1 eingegeben wurde eingetragen werden.
'=========================================================================================
If (ActiveCell.Row >= 1 And ActiveCell.Row <= 65000) Then
If ActiveCell.Column < 53 Then Auslesen
End If
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
'=========================================================================================
'Makro Zurück wird ausgeführt
'=========================================================================================
Zurück
'=========================================================================================
'Die Variable, die in dem Modul2 in dem Makro Zeilenmarkierung_an_aus deklariert wird,
'wird auf 0 gesetzt
'=========================================================================================
I = 0
End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'=========================================================================================
'Makro Zurück wird ausgeführt
'=========================================================================================
Zurück
'=========================================================================================
'Es werden nur bestimmte Zeilen markiert und zwar Zeile 1 bis Zeile 65000. Hier muss auch
'die Zahl, die unter Modul1 eingegeben wurde eingetragen werden.
'=========================================================================================
If (ActiveCell.Row >= 1 And ActiveCell.Row <= 65000) Then
If ActiveCell.Column < 53 Then Auslesen
End If
On Error GoTo neu
If Application.CommandBars("Symbolleiste xyz").Visible = False Then
Application.CommandBars("Symbolleiste xyz").Visible = True
End If
Exit Sub
neu:
Workbook_Open
End Sub

Leider muß ich den Rest der Anweisungen in einer neuen Antwort schreiben, da es scheinbar eine Begrenzung für die Länge eines Postings gibt.

Antwort 4 von coros

So, hier kommt der Rest. Kopiere die nachfolgenden Anweisungen ebenfalls noch in Diese Arbeitsmappe.

Sub Zurück()
If I = 0 Then
If StWert(1, 1, 1) <> "" Then
For InI = 1 To 52
If Worksheets(StWert(InI, 3, 3)).Range(StWert(InI, 2, 2)).Interior.ColorIndex = 35 Then 'Hier muss die Farbe, die
'die Zeile annehmen soll geändert
'werden
Worksheets(StWert(InI, 3, 3)).Range(StWert(InI, 2, 2)).Interior.ColorIndex = CInt(StWert(InI, 1, 1))
End If
Next InI
End If
End If
End Sub

Sub Auslesen()
If I = 0 Then
For InI = 1 To 52
' Werte auslesen
StWert(InI, 1, 1) = Cells(ActiveCell.Row, InI).Interior.ColorIndex
StWert(InI, 2, 2) = Cells(ActiveCell.Row, InI).Address
StWert(InI, 3, 3) = ActiveSheet.Name
Cells(ActiveCell.Row, InI).Interior.ColorIndex = 35 'Hier muss die Farbe, die
'die Zeile annehmen soll geändert
'werden
Next InI
End If
End Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Zurück
End Sub


Für die nachfolgende Anweisung füge in der VBA-Umgeung unter Einfügen => Module ein Modul hinzu und kopiere das Makro hinein.

Option Explicit
'==========================================================================================
'Hier wird mit der ersten Zahl für die zu markierende Lange eingegeben. In diesem Beispiel
'wird die zeile bis zur Spalte AZ markiert.
'==========================================================================================
Public StWert(53, 3, 3) As String ' 1=Zellenlänge; 2=Zelle; 3= Register
Public InI As Integer

Für die nachfolgende Anweisung füge noch ein Modul hinzu und kopiere das Makro hinein.

Public I As Integer


Sub Zeilenmarkierung_an_aus()
Call Zurück
'==========================================================================================
'Hier wird die Variable, die oben deklariert wurde, auf 0 oder 1 gesetzt. Sie dient zum
'Ein- bzw. Ausschalten der Zeilenmarkierung.
'==========================================================================================
If I = 0 Then
I = 1
ElseIf I = 1 Then
I = 0
End If

End Sub




Sub Zurück()
If I = 0 Then
If StWert(1, 1, 1) <> "" Then
For InI = 1 To 52
If Worksheets(StWert(InI, 3, 3)).Range(StWert(InI, 2, 2)).Interior.ColorIndex = 35 Then 'Hier muss die Farbe, die
'die Zeile annehmen soll geändert
'werden
Worksheets(StWert(InI, 3, 3)).Range(StWert(InI, 2, 2)).Interior.ColorIndex = CInt(StWert(InI, 1, 1))
End If
Next InI
End If
End If
End Sub


Diese Anweisungen bewirken folgendes: Beim Öffnen wird eine neue Symbolleiste mit dem Namen Symbolleiste xyz erstellt, die eine Schaltfläche zum Ein-und Ausschalten der Zeilenmarkierung hat. Wird eine Zelle markiert, wird die zeile bis zur Spalte AZ markiert. Meine Anweisung funktioniert auch, wenn in der Tabelle eventuell schon Zellen farblich formatiert wurden. Die Zeile wird in der vorgegebenen Farbe markiert und wenn eine andere Zelle markeirt wird, wird die alte Farbe der vorigen Zelle wieder hergestellt.

Wenn es Probleme geben sollte, melde Dich noch mal.

Ich hoffe, ich konnte Dir weiterhelfen,
coros
Und nicht vergessen, hier noch einmal zu posten, ob Dich die Hilfe weitergebracht oder sogar Dein Problem gelöst hat.

Antwort 5 von JonesM

Hi Coros!

Super, vielen Dank! Funktioniert!
Versuche später auch mal, es auch zu verstehen! ;)

Vielleicht kannst du mir noch eine Frage beantworten. Ich habe versucht, es auch in die PERSONL.XLS zu kopieren, damit diese Funktion in jedem neuen Sheet zur Verfügung steht. Dies funktionert aber nicht. Es wird zwar die erste Zeile farblich hinterlegt, was auch logisch ist, weil in einer neuen Blatt A1 aktiv ist, kann aber die Farbe nicht ein-/ ausschalten.

Was muss ich verändern, dass diese Funktion in jedem neuen Blatt/ Datei zur Verfüng steht?

Vielen Dank noch eimal und Grüße
Jones

Antwort 6 von coros

Hi Jones,

ich will mich da nicht 100 %ig festlegen, aber das was Du vor hast, wird nicht funktionieren. Anders als bei Makros, die ohne Probleme in eine Exceldatei eingefügt werden können, die dann beim Öffnen diese Makros in allen anderen Exceldateien zur verfügung stellt, geht das mit dieser Anweisung nicht. Diese Anweisung wird nur in der Datei ausgeführt, in der die Anweisung eingetragen wurde. Grund hierfür ist, das die Anweisung in Diese Arbeitsmappe steht und dort auf gewisse Zustände des Workbooks oder Worksheet in dieser Datei reagiert. Das was Du möchtest wäre ja übergreifend auf Diese Arbeitsmappe in eienr anderen Datei und dort steht halt keine Anweisung.

Ich hoffe, ich konnte Dir weiterhelfen,
coros
Und nicht vergessen, hier noch einmal zu posten, ob Dich die Hilfe weitergebracht oder sogar Dein Problem gelöst hat.