Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Scrollen in CB mit Mausrad

Scrollen in CB mit Mausrad
28.05.2021 17:28:59
reiner
Hallo Leute,
https://www.herber.de/bbs/user/146414.xlsb
in der Beispieldatei wird eine CB 2-spaltig befüllt.
Ich will in der aufgeklappten Dropdown-Liste der CB mit dem Mausrad scrollen.
Diese Thema wurde bereits mehrfach in den Fachforen behandelt, allerdings fand ich nirgends eine für mich passende Lösung.
Ich weiß das ist mit Excel-Bordmitteln nur mit einigem Aufwand möglich.
Nach Recherche im Nettz fand ich ein Beispiel bezgl Scrollen in Listbox und Combobox: http://www.office-loesung.de/ftopic174250_0_0_asc.php
Trotz Anpassung der Namen von UF und CB funktioniert das Scrollen mit Mausrad (unter Excel 2007 und Excel 2019) nicht.
Ich habe testweise an allen hierfür erforderlichen Prozeduren einen Haltepunkt gesetzt, aber keine Prozedur wurde bei Betätigung des Mausrads -bei aufgeklappter Dropdownliste- aktiviert; erkennt jemand einen Fehler?
mfG
reiner
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Scrollen in CB mit Mausrad
28.05.2021 17:48:17
Mister
Moin,
der Debugger zeigt einen Fehler in der Function WinProc
In der UF gibt es keinen "MouseWheel"
Gruß Martin
AW: Scrollen in CB mit Mausrad
28.05.2021 17:55:24
reiner
hallo Martin,
danke für die Rückmeldung
hast du eine Idee wie eine Prozedur mit "MouseWheel" in der UF aufgebaut sein muss?
reiner
AW: Scrollen in CB mit Mausrad
28.05.2021 19:37:03
reiner
Userbild
Userbild
Hallo Nepumuk leider gibt es sowohl unter Excel 2007 als auch unter Excel 2019 Probleme.
Ich vermute dass die ApI-Programmierung nur unter Excel 2019 lauffähig ist; ist das richtig? Wenn es nur unter Excel 2019 funktioniert ist OK
Beim Befüllen der CB erscheint die Fehlermeldung "Laufzeitfehler 1004"; kannst du bitte noch einmal schauen wo das Problem liegt
danke
reiner
Anzeige
AW: Scrollen in CB mit Mausrad
28.05.2021 19:41:41
Nepumuk
Hallo reiner,
für 2007 habe ich keine Lösung.
Die Mappe läuft bei mir unter Office 365.
Gruß
Nepumuk
AW: Scrollen in CB mit Mausrad
28.05.2021 19:44:48
reiner
scheinbar gibt es Unterschiede zwischen Office 365 und Excel 2019
ich denke wir brechen hier ab, es erscheint mir doch zu aufwändig
Vielen Dank für deine Beiträge
reienr
Anzeige
AW: Scrollen in CB mit Mausrad
28.05.2021 19:59:16
Nepumuk
Hallo reiner,
hier eine Version die unter Excel 2007 laufen sollte, aber ohne Garantie:
Code:

[Cc][+][-]

Option Explicit Option Private Module Private Declare Function GetWindowLongA Lib "user32.dll" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long) As Long Private Declare Function WindowFromPoint Lib "user32.dll" ( _ ByVal xPoint As Long, _ ByVal yPoint As Long) As Long Private Declare Sub RtlMoveMemory Lib "kernel32.dll" ( _ ByRef Destination As Any, _ ByRef Source As Any, _ ByVal Length As Long) Private Declare Function SetWindowsHookExA Lib "user32.dll" ( _ ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare Function CallNextHookEx Lib "user32.dll" ( _ ByVal hHook As Long, _ ByVal ncode As Long, _ ByVal wParam As Long, _ ByRef lParam As Any) As Long Private Declare Function UnhookWindowsHookEx Lib "user32.dll" ( _ ByVal hHook As Long) As Long Private Declare Function GetCursorPos Lib "user32.dll" ( _ ByRef lpPoint As POINTAPI) As Long Private Declare Function GetKeyState Lib "user32.dll" ( _ ByVal nVirtKey As Long) As Integer Private Declare Function PostMessageA Lib "user32.dll" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Private Type POINTAPI X As Long Y As Long End Type Private Type MOUSEHOOKSTRUCT pt As POINTAPI hwnd As Long wHitTestCode As Long dwExtraInfo As Long End Type Private Const WH_MOUSE_LL As Long = 14& Private Const WM_MOUSEWHEEL As Long = &H20A Private Const HC_ACTION As Long = 0& Private Const GWL_HINSTANCE As Long = -6& Private Const WM_KEYDOWN As Long = &H100 Private llngMouseHook As Long Private llngControlHwnd As Long Private llngPage As Long Private lblnHook As Boolean Private lobjScrollObject As Object Public Sub HookMouse(ByRef probjScrollObject As Object, Optional ByVal opvlngPage As Long) Dim lngHinstance As Long Dim lngHwndUnderCursor As Long Dim udtPoint As POINTAPI llngPage = opvlngPage Call GetCursorPos(udtPoint) lngHwndUnderCursor = WindowFromPoint(udtPoint.X, udtPoint.Y) If llngControlHwnd <> lngHwndUnderCursor Then Call UnhookMouse Set lobjScrollObject = probjScrollObject llngControlHwnd = lngHwndUnderCursor lngHinstance = GetWindowLongA(llngControlHwnd, GWL_HINSTANCE) If Not lblnHook Then llngMouseHook = SetWindowsHookExA(WH_MOUSE_LL, AddressOf MouseProc, lngHinstance, 0&) lblnHook = llngMouseHook <> 0 End If End If End Sub Public Sub UnhookMouse() If lblnHook Then Call UnhookWindowsHookEx(llngMouseHook) Set lobjScrollObject = Nothing llngMouseHook = 0 llngControlHwnd = 0 lblnHook = False End If End Sub Private Function MouseProc(ByVal pvlngCode As Long, ByVal pvlngParam As Long, ByRef prudtParam As MOUSEHOOKSTRUCT) _ As Long Dim lngHwndUnderCursor As Long On Error GoTo err_exit If pvlngCode = HC_ACTION Then lngHwndUnderCursor = WindowFromPoint(prudtParam.pt.X, prudtParam.pt.Y) If lngHwndUnderCursor = llngControlHwnd Then If pvlngParam = WM_MOUSEWHEEL Then If TypeOf lobjScrollObject Is MSForms.ListBox Or TypeOf lobjScrollObject Is MSForms.ComboBox Then With lobjScrollObject If GetKeyState(vbKeyControl) >= 0 Then If prudtParam.hwnd > 0 Then If .TopIndex > 0 Then If .TopIndex > 3 Then .TopIndex = .TopIndex - 3 Else .TopIndex = 0 End If End If Else .TopIndex = .TopIndex + 3 End If Else If TypeOf lobjScrollObject Is MSForms.ListBox Then If prudtParam.hwnd > 0 Then Call PostMessageA(llngControlHwnd, WM_KEYDOWN, vbKeyLeft, 0) Else Call PostMessageA(llngControlHwnd, WM_KEYDOWN, vbKeyRight, 0) End If End If End If End With ElseIf TypeOf lobjScrollObject Is MSForms.MultiPage Then With lobjScrollObject.Pages(llngPage) If GetKeyState(vbKeyControl) >= 0 Then If prudtParam.hwnd > 0 Then If .ScrollTop > 0 Then .ScrollTop = .ScrollTop - 30 Else .ScrollTop = 0 End If Else .ScrollTop = .ScrollTop + 30 End If Else If prudtParam.hwnd > 0 Then If .ScrollLeft > 0 Then .ScrollLeft = .ScrollLeft - 30 Else .ScrollLeft = 0 End If Else .ScrollLeft = .ScrollLeft + 30 End If End If End With ElseIf TypeOf lobjScrollObject Is MSForms.UserForm Or TypeOf lobjScrollObject Is MSForms.Frame Then With lobjScrollObject If GetKeyState(vbKeyControl) >= 0 Then If prudtParam.hwnd > 0 Then If .ScrollTop > 0 Then .ScrollTop = .ScrollTop - 30 Else .ScrollTop = 0 End If Else .ScrollTop = .ScrollTop + 30 End If Else If prudtParam.hwnd > 0 Then If .ScrollLeft > 0 Then .ScrollLeft = .ScrollLeft - 30 Else .ScrollLeft = 0 End If Else .ScrollLeft = .ScrollLeft + 30 End If End If End With End If Exit Function End If Else Call UnhookMouse End If End If MouseProc = CallNextHookEx(llngMouseHook, pvlngCode, pvlngParam, ByVal prudtParam) Exit Function err_exit: Call UnhookMouse End Function

Gruß
Neoumuk
Anzeige
Bitte ein BIT (oder gleich ne ganze Kiste)
28.05.2021 20:07:56
Daniel
Spielt bei Verwendung von API nicht auch die Frage, ob 32- oder 64-Bit Version eine Rolle?
Habt ihr das mal abgecheckt?
Gruß Daniel
AW: Bitte ein BIT (oder gleich ne ganze Kiste)
28.05.2021 20:20:06
reiner
bei mir läuft Excel 2007 / 2019 jeweils als 32-bit-Version
AW: Scrollen in CB mit Mausrad
28.05.2021 20:18:52
reiner
ich habe den Code in ein Modul eingefügt aber leider funktioniert es unter Excel 2007 nicht, schade
lass gut sein
Nepumuk
Anzeige
AW: Scrollen in CB mit Mausrad
28.05.2021 19:40:00
reiner
Userbild
Diese Fehlermeldung habe vergessen hochzuladen
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Scrollen in der ComboBox mit dem Mausrad


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und erstelle ein neues UserForm.

  2. Füge eine ComboBox zu deinem UserForm hinzu.

  3. Füge die folgenden VBA-Deklarationen in dein Modul ein, um die Windows-API zu verwenden:

    Private Declare Function GetWindowLongA Lib "user32.dll" ( _
       ByVal hwnd As Long, _
       ByVal nIndex As Long) As Long
    Private Declare Function WindowFromPoint Lib "user32.dll" ( _
       ByVal xPoint As Long, _
       ByVal yPoint As Long) As Long
  4. Erstelle die MouseWheel-Prozedur, um das Scrollen im Dropdown zu ermöglichen. Hier ist ein Beispielcode:

    Private Function MouseProc(ByVal pvlngCode As Long, ByVal pvlngParam As Long, ByRef prudtParam As MOUSEHOOKSTRUCT) As Long
       ' Implementiere hier die Logik für das Scrollen mit dem Mausrad
    End Function
  5. Binde die Scroll-Prozedur an das MouseWheel-Ereignis in der ComboBox.

  6. Teste die Funktionalität, indem du das UserForm öffnest und das Dropdown mit dem Mausrad scrollst.


Häufige Fehler und Lösungen

  • Scrollen funktioniert nicht: Vergewissere dich, dass du die richtigen API-Funktionen deklariert hast und dass die Prozedur korrekt an das MouseWheel-Ereignis gebunden ist.
  • Laufzeitfehler 1004: Dieser Fehler tritt häufig auf, wenn die ComboBox nicht korrekt befüllt wurde. Überprüfe den Code zum Befüllen der Dropdown-Liste.
  • Probleme unter Excel 2007: Einige API-Funktionen sind in älteren Versionen möglicherweise nicht vollständig unterstützt. Überlege, ob du auf eine neuere Excel-Version umsteigst.

Alternative Methoden

Wenn du das Scrollen in der ComboBox nicht mit VBA lösen kannst, gibt es alternative Ansätze:

  • Verwendung einer ListBox: Eine ListBox hat von Haus aus Scrollbar-Funktionalitäten. Du kannst die ListBox anstelle der ComboBox verwenden.
  • Erstellen eines benutzerdefinierten Controls: Mit mehr Aufwand kannst du ein benutzerdefiniertes Steuerelement erstellen, das besser auf deinen Bedarf zugeschnitten ist.

Praktische Beispiele

Hier ist ein einfaches Beispiel, um das Scrollen in einer ComboBox zu ermöglichen:

Private Sub UserForm_Initialize()
    Dim i As Integer
    For i = 1 To 100
        ComboBox1.AddItem "Item " & i
    Next i
End Sub

Private Sub ComboBox1_Click()
    ' Hier kannst du zusätzliche Logik für die Auswahl implementieren
End Sub

Mit diesem Setup kannst du die ComboBox mit 100 Einträgen füllen und dann das Scrollen mit dem Mausrad aktivieren.


Tipps für Profis

  • Nutze die Windows-API effektiv: Wenn du die API-Funktionen richtig verstehst, kannst du viele benutzerdefinierte Interaktionen schaffen.
  • Debugging: Setze Haltepunkte im Code, um zu überprüfen, ob die MouseWheel-Prozedur ausgelöst wird. Dies hilft dir, Probleme schneller zu identifizieren.
  • Dokumentation: Halte eine Dokumentation für deine VBA-Codes bereit, damit du und andere Benutzer leichter nachvollziehen können, was jeder Abschnitt tut.

FAQ: Häufige Fragen

1. Warum funktioniert das Scrollen in der ComboBox nicht? Die häufigsten Ursachen sind falsche API-Deklarationen oder ein nicht korrekt gebundener MouseWheel-Ereignis-Handler.

2. Welche Excel-Version benötige ich? Die API-Programmierung funktioniert am besten mit Excel 2019 oder Office 365. Ältere Versionen wie Excel 2007 können Probleme bereiten.

3. Gibt es eine Möglichkeit, ohne VBA zu scrollen? In Excel gibt es standardmäßig keine Möglichkeit, in ComboBoxen ohne VBA zu scrollen. Eine ListBox könnte jedoch eine Alternative sein, da sie standardmäßig Scrollbar-Funktionalität bietet.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige