Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Scroll-Rad-Funktion der Mouse in einer Listbox

Scroll-Rad-Funktion der Mouse in einer Listbox
31.12.2004 11:52:19
Peter
Hallo VBA-Freunde,
vielleicht kann mir einer Helfen, ich möchte gerne die Scroll-Rad-Funktion der Mouse in einer Listbox einsetzen, wie geht das oder geht das überhaupt ?
Gruß Peter und Danke im Voraus
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Scroll-Rad-Funktion der Mouse in einer Listbox
31.12.2004 12:15:55
Frank
Hi Peter,
geht schon, aber nur mit Windows API Funktionen (dann aber relativ einfach). Füge folgenden Code in ein neues Modul ein:
'---------------------------------------------------------------------------
' Created: November 2004
' Authors: Frank Kabel, Bob Phillips
'---------------------------------------------------------------------------
'Module: mListboxScrol
'Original author: Jim Rech
'Extended: Frank Kabel, Bob Phillips - test for XL97 and call custom callbac
'Purpose: Contains all code for enabling mosue wheel scrolling
'---------------------------------------------------------------------------
Option Explicit
Private Declare

Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal Wparam As Long, _
ByVal Lparam As Long) As Long
Private Declare 

Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare 

Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const GWL_WNDPROC = -4
Private Const WM_MOUSEWHEEL = &H20A
Dim collUF As New Collection
Dim collPrevHdl As New Collection
Dim collUFHdl As New Collection
Public 

Function WindowProc(ByVal Lwnd As Long, _
ByVal Lmsg As Long, _
ByVal Wparam As Long, _
ByVal Lparam As Long) As Long
Dim Rotation As Long
Dim Btn As Long
If Lmsg = WM_MOUSEWHEEL Then
Rotation = Wparam / 65536    ''High order word indicates direction
Btn = Abs(Wparam) And 15    ''Low order word indicates various virtual keys held down
MouseWheel collUF(CStr(Lwnd)), Rotation, Btn
WindowProc = 0    ''We handled event, no need to pass on (right?)
Else
WindowProc = CallWindowProc(collPrevHdl(CStr(Lwnd)), Lwnd, Lmsg, Wparam, Lparam)
End If
End Function

'---------------------------------------------------------------------------
' Need both userform and its caption because Userform1.Caption is empty for
' some reason
Public

Sub UserformHook(PassedForm As UserForm, _
Cap As String)
Dim LocalHwnd As Long
Dim LocalPrevWndProc As Long
Dim cError As Long
Dim i As Long
LocalHwnd = FindWindow("ThunderDFrame", Cap)
'if Excel2000 or above use the built-in AddressOf operator to
'get a pointer to the callback function
If Val(Application.Version) > 8 Then
LocalPrevWndProc = SetWindowLong(hWnd:=LocalHwnd, _
nIndex:=GWL_WNDPROC, _
dwNewLong:=AddrOf_Callback_Routine)
Else    'use K.Getz & M.Kaplan 

Function to get a pointer
LocalPrevWndProc = SetWindowLong(hWnd:=LocalHwnd, _
nIndex:=GWL_WNDPROC, _
dwNewLong:=AddrOf("WindowProc"))
End If
On Error GoTo DupKey    'In case Windows assigns the same handle to a
'subsequent userform (altho it doesn't seem to do this)...
TryAgain:
collUF.Add PassedForm, CStr(LocalHwnd)
collPrevHdl.Add LocalPrevWndProc, CStr(LocalHwnd)
collUFHdl.Add LocalHwnd
Exit Sub
DupKey:
If cError = 0 Then    ''Avoid infinite error loop
For i = 1 To collUFHdl.Count
If collUFHdl(i) = LocalHwnd Then
collUFHdl.Remove i
collUF.Remove i
collPrevHdl.Remove i
End If
Next
cError = 1
Resume TryAgain
End If
End Sub

'---------------------------------------------------------------------------
Public

Sub UserformUnHook(UF As UserForm)
Dim i As Long
For i = 1 To collUF.Count
If UF Is collUF(i) Then Exit For
Next
''SetWindowLong LocalHwnd, GWL_WNDPROC, LocalPrevWndProc
SetWindowLong collUFHdl(i), GWL_WNDPROC, collPrevHdl(i)
collUF.Remove i
collPrevHdl.Remove i
collUFHdl.Remove i
End Sub

'---------------------------------------------------------------------------
Public

Sub MouseWheel(UF As UserForm, _
ByVal Rotation As Long, _
ByVal Btn As Long)
' Function:     Scrolls listbox 1 row or a full page if Ctrl is down
Dim LinesToScroll As Long
Dim ListRows As Long
Dim Idx As Long
With UF
If TypeName(.ActiveControl) = "ListBox" Then
ListRows = .ActiveControl.ListCount
If Btn = 8 Then    ''Ctrl
LinesToScroll = Int(.ActiveControl.Height / 10)    ''Seems to work for font size 8
Else
LinesToScroll = 1
End If
If Rotation > 0 Then
'Scroll up
Idx = .ActiveControl.TopIndex - LinesToScroll
If Idx < 0 Then Idx = 0
.ActiveControl.TopIndex = Idx
Else
'Scroll down
Idx = .ActiveControl.TopIndex + LinesToScroll
If Idx > ListRows Then Idx = ListRows
.ActiveControl.TopIndex = Idx
End If
End If
End With
End Sub

'---------------------------------------------------------------------------
' END OF CODE
'---------------------------------------------------------------------------
So und nun kannst Du einfach in der Initialisierung Deiner Uerform folgende Zeile ergänzen:
UserformHook Me, Me.Caption
das wars dann schon :-)
Gruß
Frank
Anzeige
AW: Scroll-Rad-Funktion der Mouse in einer Listbox
31.12.2004 13:20:08
Peter
hallo frank,
geht leider noch nicht.
bekomme fehlermeldungen,
mache nächste woche nach dem 4. jan. weiter
danke trotzdem und ein frohes neues :-)
gruß peter
AW: Scroll-Rad-Funktion der Mouse in einer Listbox
31.12.2004 13:23:16
Frank
Hi
was für eine Fehlermeldung bekommst Du denn genau und in welcher Zeile? Eventuell sind beim Kopieren die Zeilenumbrüche etwas durcheinander geraten
Frank
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Scroll-Rad-Funktion der Mouse in einer Listbox


Schritt-für-Schritt-Anleitung

Um die Scroll-Rad-Funktion der Maus in einer VBA Listbox zu aktivieren, kannst du den folgenden Code verwenden. Dieser Code setzt Windows API-Funktionen ein, um das Scrollen zu ermöglichen.

  1. Öffne den VBA-Editor in Excel (Alt + F11).

  2. Füge ein neues Modul hinzu (Rechtsklick auf "VBAProject" > Einfügen > Modul).

  3. Kopiere den nachstehenden Code in das Modul:

    Option Explicit
    Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
       (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal Wparam As Long, ByVal Lparam As Long) As Long
    Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
       (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
       (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Const GWL_WNDPROC = -4
    Private Const WM_MOUSEWHEEL = &H20A
    
    ' Weitere Funktionen hier...
  4. Ergänze in der Initialisierung deiner Userform die folgende Zeile:

    UserformHook Me, Me.Caption
  5. Schließe den VBA-Editor und teste die Listbox in deiner Userform.


Häufige Fehler und Lösungen

  • Fehler: "Excel VBA Listbox scrollbar not working"

    • Lösung: Stelle sicher, dass der Code korrekt kopiert wurde und keine Zeilenumbrüche fehlen. Überprüfe auch, ob die Listbox korrekt konfiguriert ist.
  • Fehler: "Excel mouse scroll not working"

    • Lösung: Vergewissere dich, dass die Userform aktiv ist und die Listbox das aktive Steuerelement ist.

Alternative Methoden

Falls du keine Windows API-Funktionen verwenden möchtest, kannst du auch die integrierte Scrollbar-Funktion der Listbox nutzen. Diese ist jedoch nicht so komfortabel wie das Scrollen mit dem Mausrad.

  1. Füge eine Scrollbar neben der Listbox hinzu.
  2. Verknüpfe die Scrollbar mit der Listbox, um die Elemente zu scrollen.

Praktische Beispiele

Hier ist ein Beispiel, wie du die Listbox mit Daten füllen kannst:

Private Sub UserForm_Initialize()
    Dim i As Integer
    For i = 1 To 100
        ListBox1.AddItem "Item " & i
    Next i
    UserformHook Me, Me.Caption
End Sub

Dieser Code füllt die Listbox mit 100 Einträgen und aktiviert das Scrollen mit der Maus.


Tipps für Profis

  • Verwende vba listbox scroll wheel, um den Code in verschiedenen Projekten wiederverwendbar zu gestalten.
  • Optimiere die Scrollgeschwindigkeit, indem du die Anzahl der Zeilen, die pro Scroll-Event gescrollt werden, anpasst.
  • Teste den Code in verschiedenen Excel-Versionen, um sicherzustellen, dass er überall funktioniert.

FAQ: Häufige Fragen

1. Wie kann ich die Scrollgeschwindigkeit anpassen?
Du kannst die Variable LinesToScroll im MouseWheel-Sub anpassen. Erhöhe oder verringere den Wert, um die Scrollgeschwindigkeit zu ändern.

2. Funktioniert der Code in Excel Online?
Nein, der Code funktioniert nur in der Desktop-Version von Excel, da er Windows API-Funktionen verwendet.

3. Was mache ich, wenn ich eine Fehlermeldung bekomme?
Überprüfe den Code auf fehlende Zeilen oder falsche Deklarationen. Kopiere den Code sorgfältig und achte auf die Syntax.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige