Excel - Hervorheben der aktiven Zeile

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Excel - Hervorheben der aktiven Zeile

Post by haichen » 11 Dec 2020, 03:08

Wenn man mit großen Exceltabellen arbeitet, kann man leicht den Überblick verlieren.
Eine Idee war das Hervorheben der gerade aktiven Zeile.

Eine Teilidee in Form eines VBA-Codes lag bereits vor, funktionierte aber noch nicht.

Ich habe dann ein VBA-Makro geschrieben.
Zuerst mit einfärben der Zeile, später mit einem Teilrahmen (nur unten), der wie eine Unterstreichung wirkt.
Beides ist mit VBA möglich und funktioniert auch sehr gut.

Mit einer sehr wichtigen Einschränkung:
Das UnDo (Rückgängigmachen) mit STRG+Z oder über das Icon funktioniert nicht.
Das soll und muss aber funktionieren.

Da ich VBA-Programmierung für mich neu ist, habe ich dann längere Zeit experimentiert und recherchiert.
Das Ergebnis: Es ist nicht möglich, über VBA Änderungen an den Tabellen vorzunehmen, ohne den UnDo-Stack zu löschen. Man kann für sein Makro eigene UnDo-Routinen schreiben. Aber der normale UnDo-Stack wird immer gelöscht.

Und das ist auch für AutoHotkey wichtig. Es betrifft auch den COM-Zugriff (Änderungen) auf Excel und wahrscheinlich alle Office-Programme. -- Nach halweg s. u. funktioniert es bei Word -- Das habe ich allerdings nicht getestet. Auch über den COM-Zugriff (auch Farben, Strichdicken u. a., es gibt kleine Ausnahmen) aus AutoHotkey wird der UnDo-Stack gelöscht. STRG-Z und der Klick auf das Rückgängigmachen-Icon funktioniert nur bis zum nächsten COM-Funktionsaufruf. Nur Auslesen von Daten löscht den Stack nicht.

=========================

Nach dieser langen Erklärung: Das folgende Skript liest die Koordinaten der aktiven Selektion in Excel und macht unter der Selektion über die ganze Zeile einen Strich. Farbe und Dicke lassen sich auswählen. Das Skript pausiert bei Doppelklick auf das Systray-Icon. UnDo bzw. Rückgängigmachen ist möglich. Bei Fensterwechsel wandert die "Unterstreichung" mit.

Einschränkung: Eine (1) "Unterstreichung" im aktiven Excelfenster.

Code: Select all

#Persistent
#SingleInstance


Tiptext =
(
Zieht eine Linie unter die Aktive Excelauswahl
im Menu kann Farbe, Liniendicke ausgewählt werden
Doppelklick = Pause
)


Hilfe =
(
Zieht eine Linie unter die Aktive Excelauswahl
im Menu kann Farbe, Liniendicke und ausgewählt werden
)



Menu, Tray, NoStandard
Menu, tray,add,  ExcelHilfsLinie
Menu, tray,Disable,ExcelHilfsLinie
Menu, tray, add
Menu, tray,add, Rot
Menu, tray,add, Gruen
Menu, tray,add, Gelb
Menu, tray,add, Blau
Menu, tray,add, Schwarz
Menu, tray, add
Menu, tray,add, H1
Menu, tray,add, H2

Menu, tray,add, H3
Menu, tray,add, H5
Menu, tray, add
Menu, Tray, Tip, %Tiptext%
Menu, tray, add, Hilfe
Menu, tray, add
Menu, tray,add, Pause
Menu, Tray, Default, Pause
Menu, tray, add, Beenden
Menu, tray, NoStandard

;=================
; Voreinstellung
color:="cc0000"
Menu, Tray, Disable,  rot
line:=2
Menu, Tray, Disable,  H2
;=================

SetTimer, rule ,100
return

rule:
ruler(color,line)
return

ruler(color,line){
static yold:=0, wold:=0, hold:=0, xold:=0, run:=0

if (r and !WinActive("ahk_class XLMAIN"))
{
	SplashImage, off
	run:=0
}
	
If !IsObject(xl)
{
try
		xl := ComObjActive("Excel.Application")
	catch
	{
		SplashImage, off
		wold:=-1
		return
	}
}

if hwnd:=WinActive("ahk_class XLMAIN")
{
	run:=1
	
	try
	{
		c:=xl.selection.rows.count  ; counts the lines of the selection
		y1:=xl.ActiveWindow.ActivePane.PointsToScreenPixelsY(xl.selection.offset(c,0).top) ; Screenposition der Selection um deren Zeilen verschoben
		WinGetPos, x, Cy, Width, Height, ahk_id %hwnd%
		ControlGetFocus, WhichControl, ahk_id %hwnd%
		;MouseGetPos, , , WhichWindow, WhichControl ; Alternativly
		
		if (WhichControl="NetUIHWND1")
		{
			SplashImage, off
			wold:=-1
			return
		}
			
		if (yold <> y1) or (xold <> x) or (hold <> height) or (wold <> width)
		{
			r:="a" round(xl.ActiveWindow.ActivePane.ScrollRow //1,0)
			yr:=xl.ActiveWindow.ActivePane.PointsToScreenPixelsY(xl.range(r).top)-10	
											
			if (y1<yr) or (y1>(cy+height-20))
			{
				SplashImage, off
				return
			}
			
			Splashimage,, B W%Width% H%line% Y%y1% X%x% CW%color% ; Linie nur bei Änderung erzeugen
			yold:=y1
			wold:=width
			hold:=height
			xold:= x
		
		}
	}
}

else
{
	SplashImage, off
	yold:=0, wold:=0, hold:=0, xold:=0, run:=0
}
return
}


ExitApp
return

rot:
color:="cc0000"
gosub Menuchange1
Menu, Tray, Disable,  rot
WinActivate, ahk_class XLMAIN
return

gruen:
color:="00cc00"
gosub Menuchange1
Menu, Tray, Disable,  gruen
WinActivate, ahk_class XLMAIN
return

gelb:
color:="efef00"
gosub Menuchange1
Menu, Tray, Disable,  gelb
WinActivate, ahk_class XLMAIN
return

blau:
color:="00cccc"
gosub Menuchange1
Menu, Tray, Disable,  blau
WinActivate, ahk_class XLMAIN
return

schwarz:
color:="000000"
gosub Menuchange1
Menu, Tray, Disable,  schwarz
WinActivate, ahk_class XLMAIN
return 


h1:
line:=1
gosub Menuchange2
Menu, Tray, Disable,  H1
WinActivate, ahk_class XLMAIN
return

h2:
line:=2
gosub Menuchange2
Menu, Tray, Disable,  H2
WinActivate, ahk_class XLMAIN
return

h3:
line:=3
gosub Menuchange2
Menu, Tray, Disable,  H3
WinActivate, ahk_class XLMAIN
return

h5:
line:=5
gosub Menuchange2
Menu, Tray, Disable,  H5
WinActivate, ahk_class XLMAIN
return


Menuchange1:
Gui, Submit , NoHide
Menu, Tray, Enable,  rot
Menu, Tray, Enable,  gruen
Menu, Tray, Enable,  gelb
Menu, Tray, Enable,  blau
Menu, Tray, Enable,  schwarz
return

Menuchange2:
Gui, Submit , NoHide
Menu, Tray, Enable,  H1
Menu, Tray, Enable,  H2
Menu, Tray, Enable,  H3
Menu, Tray, Enable,  H5

return

hilfe:
Msgbox, %Hilfe%
return

Beenden:
exitapp

ExcelHilfsLinie:
return

Farbe:
return

Liniendicke:
return

Pause:
Pause 
WinActivate, ahk_class XLMAIN
return
Edit 24.01.2021: Verbesserungen und Fehlerkorrektur von Daywalker:
Der Balken wurde vorher auch im Excelmenu Datei gezeigt.
Manchmal wurde die Hervorherbung nicht beendet.
Last edited by haichen on 24 Jan 2021, 05:22, edited 3 times in total.
halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Excel - Hervorheben der aktiven Zeile

Post by halweg » 11 Dec 2020, 04:13

Danke fürs Teilen!

Verstehe ich das richtig: Du erzeugst mit SplashImage eine Linie, die du über das Excel-Fenster an der richtigen Stelle positionierst? Damit hebst du die aktuelle Zeile hervor?

Ich kenne das Problem mit Rückgängig in Excel, wo anders als in Word Makros die Rückgängig-Funktion löschen.
Ich umgehe es, indem ich per AHK oder direkt per Excel-Makro mit SEND-Befehlen arbeite.
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Excel - Hervorheben der aktiven Zeile

Post by haichen » 11 Dec 2020, 04:47

Ja genau, eine Linie die genau den Tabellenbereich abdeckt. Sieh aus wie unterstrichen. Die Linie wandert mit, wenn man scrollt. Ist eigentlich etwas, was in Excel eingebaut sein sollte. Optisch sehr simple, aber war nicht ganz einfach zu erstellen.
Mir war das mit dem Rückgängigmachen bis jetzt nicht bekannt. Habe ich bisher immer übersehen. :( Für Formatänderungen und bedingte Formatierungen ist Send keine so schöne Lösung. Und für VBA finde ich das ehrlich gesagt ziemlich arm, das Makros den UnDo-Stack löschen.
Aah in Word funkioniert das? Gut zu wissen.
Attachments
2020-12-11_10h36_19.png
2020-12-11_10h36_19.png (93.34 KiB) Viewed 2652 times
halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Excel - Hervorheben der aktiven Zeile

Post by halweg » 11 Dec 2020, 05:25

Auf jeden Fall finde ich es eine interessante Anregung, auch ich habe manchmal das Problem, dass ich die aktive Zelle nicht finde. Meist dann, wenn das Excel-Fenster gerade nicht aktiv ist, denn dann wird die aktive Zelle nicht hervorgehoben.
Allerdings werde ich wohl per Send die aktive Zelle in einer knalligen Farbe darstellen und das dann wieder rückgängig machen. Send ist nicht schön aber funktioniert; mir ist hier der einfache Code wichtiger.
User avatar
haichen
Posts: 631
Joined: 09 Feb 2014, 08:24

Re: Excel - Hervorheben der aktiven Zeile

Post by haichen » 11 Dec 2020, 05:37

Schwierig war es den richtigen Code für die Koordinaten zu finden.
Post Reply

Return to “Skripte und Funktionen”