Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1912to1916
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

scrollbar_change event

scrollbar_change event
04.01.2023 16:11:31
Morris
Guten Tag zusammen,
ich benötige Hilfe bei folgendem Problem.
In einem Arbeitsblatt soll das Verschieben der applikationseigenen horizontalen Scrollbar von Excel (kein eingefügtes Steuerelement) eine Prozedur / Event auslösen. Fenster ist bei Zelle F6 fixiert.

Sub ScrollBar1_Change()
'[B1].Value = ActiveWindow.ScrollColumn             'als Programmierhilfe Zwischenablage zum Prüfen der Position
If ActiveWindow.ScrollColumn = 186 Then
CB_ErstesHalbjahr.Visible = True
CB_ZweitesHalbjahr.Visible = False
End If
End Sub
Folgendes Ergebnis erhoffe ich mir:
Nach Verschieben der horizontalen Scrollbar auf meinem Arbeitsblatt und loslassen der Maustaste soll Excel die neue "ScrollBarPosition" erkennen (ganz links wäre Spalte 6) und CmdBtn (CB_Erstes...) sichtbar bzw. unsichtbar machen. Hintergrund ist, dass ich eine Datei habe, die nach rechts recht weit ausladend ist. Klicke ich auf den jeweiligen Button, selektiere ich eine bestimmte zuvor zugewiesene Zelle. Es sollen jeweils der Button für ganz links oder ganz rechts meiner Datentabelle angezeigt werden, je nachdem wo ich mich mit der Scrollbar befinde.
Problem bisher:
Verschiebe ich die Scrollbar und starte das Makro manuell, läuft es. Nun soll das Makro bei Veränderung der ScrollBarPosition aber automatisch starten und weitere Events auslösen. Ich würde es auch auch in nachfolgendes Makro einbauen...

option explicit
dim Jahr as Date
Sub Worksheet_Change(ByVal ZielAs Range)
'PerfEin                                                                 'Schaltet das Performance Makro ein
Jahr = "01.01." & Range("A1")
If Ziel = Range("A1") Then
If Jahr Mod 4  0 Then
Columns("BM:BM").EntireColumn.Hidden = True
Else:   Columns("BM:BM").EntireColumn.Hidden = False
End If
End If
'PerfAus                                                         'Schaltet das Performance Makro wieder aus
End Sub
...wenn ich denn nur wüsste wie.
Ich bin hier im Forum leider nicht fündig geworden und für jede Hilfe dankbar. Meine VBA Kenntnisse sind sehr dürftig, in Grundzügen jedoch vorhanden.
Gruß
Morris

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: scrollbar_change event
04.01.2023 16:40:25
Fennek
Hallo,
ein möglicher Ansatz wäre ein ActiveX-Frame einzufügen und dann

Private Sub Frame1_Layout()
Debug.Print "Layout"
End Sub
Wenn Du weitere Info's brauchts, frage nach.
mfg
AW: scrollbar_change event
04.01.2023 20:02:30
Morris
ActiveX-Frame? Uhhh, das sind böhmische Wälder und, obwohl ich Wälder liebe, fürchte ich, dass es meinen Horizont übersteigt. Vielleicht möchtest du den Versuch starten und es mir erklären. Ich bin gespannt. Vorab vielen Dank für deine Mühe.
AW: scrollbar_change event
04.01.2023 20:17:48
Fennek
Hallo,
hier ein Beispiel, das beim Scrollen immer den sichtbaren Range in A1 anzeigt. So ganz klar geworden ist mir dein Ziel nicht, deswegen nur der Ansatz.
https://www.herber.de/bbs/user/157090.xlsm
mfg
Anzeige
AW: scrollbar_change event
04.01.2023 17:10:54
onur
So ein Event bietet VBA nicht an, und es nützt auch nix, wenn du das Evernt selber schreibst.
AW: scrollbar_change event
04.01.2023 17:14:53
onur
Du könntest es aber über den Umweg mit "SelectionChange" erreichen. D.H.: Scrollen, irgend eine Zelle anklicken, fertig
AW: scrollbar_change event
04.01.2023 20:17:15
Morris
Das wäre ein Ansatz, wenn auch mit einem Zwischenschritt. Ich würde mich da mal ausprobieren, auf jeden Fall vielen Dank für den Vorschlag der SelectionChange, eine Idee, die es umzusetzen gilt. Sollte ich hierbei Hilfe benötigen, würde ich vertrauensvoll in diesen Thread schreiben.
Schade, dass ein direktes Ansprechen der Scrollbar nicht so ohne weiteres möglich ist. Ich gehe mal davon aus, dass auch ein "leerer" linker Mausclick kein makro aufrufen kann, oder?
Anzeige
AW: scrollbar_change event
04.01.2023 20:38:07
onur
Du brauchst doch nur deinen Code in das Selection_Change-Event hineinzukopieren.
AW: scrollbar_change event
05.01.2023 00:55:35
Yal
Hallo Morris,
am schnellsten kannst Du mit der Tastenkombination Alt+PgDwn nach rechts scrollen. Es verstezt die aktive Zelle und verursacht ein "SelectionChange"-Ereignis.
Wenn 2 Bedingungen sich ganzlich ergänzen, wie < 186 und >= 186, dann kannst Du das Ergebnis direkt als Setzung verwenden. Was nach dem ersten Gleichzeichen wird als ganzes wahrgenommen, also ist die Spalte der aktiven Zelle vor oder nach der Spalte 186, was True oder False liefert, was die Sichbarkeit der CN (ComboBox?) setzt.
Dito beim Verstecktsein vom Spalte BM (29. Feb?) Wobei es hier noch hackt.

Sub Worksheet_Change(ByVal Ziel As Range)
Dim Jahr As Date
Jahr = "01.01." & Range("A1") 'ergibt kein Jahr sondern ein Datum, z.B. 1.1.23: 44927, 2.1.23: 44928, usw
If Ziel.Value = Range("A1").Value Then
Columns("BM:BM").Hidden = CBool(Jahr Mod 4) 'also bei 3 von 4 Tage versteckt
'Columns("BM:BM").Hidden = CBool(Year(Jahr) Mod 4) 'bei 3 von 4 Jahren versteckt
End If
CB_ErstesHalbjahr.Visible = ActiveCell.Column >= 186
CB_ZweitesHalbjahr.Visible = ActiveCell.Column 
VG
Yal
Anzeige
AW: scrollbar_change event
05.01.2023 23:19:08
volti
Hallo zusammen,
ich greife das Thema noch mal auf.
Wie schon von den anderen angemerkt, gibt es für ein Worksheet in Excel kein Scrollchangeevent.
Neben den angeführten Alternativen findet man im Netz auch die Verwendung von Platzhalterobjekten, ähnlich wie es Fennek ja auch angeführt hat.
Eine weitere Alternative ist das Einhooken in die Excel-Fensterprozedur via API und das Abfangen der VM_SCROLL-Message.
Einfacher ist das WinEventHooking. Hierbei wird z.B. die Beendigung des Scrollvorgangs abgefangen. Leider ist dies nicht auf die gewünschte Scrollbar beschränkt,
so dass ich noch etwas Einschränkungscode miteinpflegen musste. Auch um die Belastung von Excel zu minimieren wird z.B. bei Verlasssen von Excel das Hooking abgeschaltet.
Beim Scrollen des Bildschirms wird ein Event ausgelöst.
Probiere es doch einfach mal aus, da ich nicht weiß ob Excel das in jeder Lebenslage zeitlich duerhaft handelt..
Bitte das Ausschalten des Events bei Blattwechsel bzw. spätenstens bei Mappenschließung sicherstellen.
Code:


Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" ( _ ByVal hHook As LongPtr) As Long Private Declare PtrSafe Function SetWinEventHook Lib "user32" ( _ ByVal eventMin As Long, ByVal eventMax As Long, _ ByVal hmodWinEventProc As LongPtr, _ ByVal lpfnWinEventProc As LongPtr, ByVal idProcess As Long, _ ByVal idThread As Long, ByVal dwflags As Long) As LongPtr Private Declare PtrSafe Function UnhookWinEvent Lib "user32" ( _ ByVal hWinEventHook As LongPtr) As Long Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr Dim hCurWin As LongPtr ' Handle de aktiven Fensters Dim hWinEvent As LongPtr, hScrollEvent As LongPtr ' Handle des Eventhooking Private Const tblTab As String = "Scrollhooking" ' Tabellenblatt, in dem Hooking stattf. Public Sub StartWinEvents() If ActiveSheet.Name <> tblTab Then Exit Sub ' Scrolltest nur auf gewünschtem Blatt hCurWin = GetActiveWindow If hWinEvent = 0 Then hWinEvent = SetWinEventHook(3, 3, 0, AddressOf WinEventProc, 0, 0, 0) Call StartScrollEvents ' Scrollhooking starten End If End Sub Public Sub StartScrollEvents() If hScrollEvent = 0 Then ' Baut den Scrollhook auf hScrollEvent = SetWinEventHook(19, 19, 0, AddressOf ScrollEventProc, 0, 0, 0) End If End Sub Sub StopAllEvents() UnhookWinEvent hWinEvent: hWinEvent = 0 ' Beendet den Win-Eventhook UnhookWinEvent hScrollEvent: hScrollEvent = 0 ' Beendet den Scroll-Eventhook End Sub Private Function WinEventProc(ByVal hWinEventHook As LongPtr, ByVal WinEvent As Long, _ ByVal hwnd As LongPtr, ByVal idObject As Long, ByVal idChild As Long, _ ByVal dwEventThread As Long, ByVal dwmsEventTime As Long) As Long If hwnd = Application.hwnd Then StartScrollEvents ' Excel wieder aktiv? Else If hCurWin = Application.hwnd Then UnhookWinEvent hScrollEvent: hScrollEvent = 0 ' Beendet den Scroll-Eventhook End If End If hCurWin = GetActiveWindow End Function Private Function ScrollEventProc(ByVal hWinEventHook As LongPtr, ByVal WinEvent As Long, _ ByVal hwnd As LongPtr, ByVal idObject As Long, ByVal idChild As Long, _ ByVal dwEventThread As Long, ByVal dwmsEventTime As Long) As Long If ActiveSheet.Name = tblTab Then MsgBox "Mach Dein Ding", vbExclamation, "Scrollalarm" End Function ' in Das Tabellenblattmodul Private Sub Worksheet_Activate() Call StartWinEvents End Sub Private Sub Worksheet_Deactivate() Call StopAllEvents End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige