Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1844to1848
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

Scrollen in Listbox

Scrollen in Listbox
03.09.2021 18:16:46
oraculix
Hallo
In der Userform2 habe ich eine Listbox .
Leider funktioniert die Maus sehr eigenartig .
Wenn ich die Userform öffne und die Liste ist ganz oben kann ich überhaupt nicht scrollen
Wenn ich mit dem Balken rechts nach unten ziehe so ca. 40 Zeilen dann funktioniert das Scrollen schon etwas besser
aber in die verkehrte Richtung.
Eigenartiges ding so eine Listbox.
Der Code für die Maus Steht im Modul 1 und in der Userform
Seht Euch das mal an Bitte!! Und sagt mir warum die Maus nicht richtig funktioniert.
Danke
https://www.herber.de/bbs/user/147898.xlsm
Gruß
Oraculix

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Scrollen in Listbox
03.09.2021 18:37:07
onur
Das solltest du mal denjenigen Fragen, dessen Code du kopiert hast.
Du findest was im Internet zu Thema "wie man mit Mausrad eine Listbox steuern kann", fügst -zig Zeilen, Subs und Funktionen (inkl. APIs) in deinen Code ein und fragst hier, warum es nicht funktioniert ?
AW:Code ist von Nepomuk
03.09.2021 18:43:02
Nepomuk
Der Code Funktioniert in einer Anderen Arbemappe exact!
Trotzdem Danke für Deine nette Antwort.
Gruß
Oraculix
AW: AW:Code ist von Nepomuk
03.09.2021 18:44:07
Nepomuk
Frag doch mal Nepumuk.
AW: AW:Code ist von Nepomuk
03.09.2021 19:00:30
Nepomuk
Ich Verstehe nur nicht warum du So Sauer bist!
AW: AW:Code ist von Nepomuk
03.09.2021 19:13:24
Nepomuk
Ich bin nicht sauer, absolut nicht.
Aber du erwartest, dass sich hier Jemand die Mühe macht, den recht komplexen Code, der auch noch in den "Windows-Eingeweiden" herumhantiert, zu analysieren und rausfindet, warum das ganze nicht funktioniert. Selbst für den Originalautor eines solchen Codes ist es nicht unbedingt ein Klax, sich nach etlicher Zeit dran zu errinern, warum er z.B. ausgerechnet an dieser Stelle diese bestimmte Zeile programmiert hat oder wofür genau diese eine Sub/Funktion gedacht war.
Du solltest in den Betreff "@Nepumuk" schreiben, damit er auch drauf reagiert.
Anzeige
AW: @Nepumuk
03.09.2021 19:15:56
oraculix
Danke
AW: @Nepumuk
03.09.2021 20:10:41
Nepumuk
Hallo,
im UserForm:

Private Sub Lst_Treffer_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Call HookMouse(Me, Lst_Treffer)
End Sub
Im Modul:

Option Explicit
Option Private Module
Private Declare PtrSafe Function GetWindowLongPtrA Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function WindowFromPoint Lib "user32.dll" ( _
ByVal point As LongLong) As LongPtr
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32.dll" ( _
ByRef Destination As Any, _
ByRef Source As Any, _
ByVal Length As LongPtr)
Private Declare PtrSafe Function SetWindowsHookExA Lib "user32.dll" ( _
ByVal idHook As Long, _
ByVal lpfn As LongPtr, _
ByVal hmod As LongPtr, _
ByVal dwThreadId As Long) As LongPtr
Private Declare PtrSafe Function CallNextHookEx Lib "user32.dll" ( _
ByVal hHook As LongPtr, _
ByVal ncode As Long, _
ByVal wParam As LongPtr, _
ByRef lParam As Any) As LongPtr
Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32.dll" ( _
ByVal hHook As LongPtr) As Long
Private Declare PtrSafe Function GetCursorPos Lib "user32.dll" ( _
ByRef lpPoint As POINTAPI) As Long
Private Declare PtrSafe Function GetKeyState Lib "user32.dll" ( _
ByVal nVirtKey As Long) As Integer
Private Declare PtrSafe Function PostMessageA Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Type POINTAPI
XY As LongLong
End Type
Private Type MOUSEHOOKSTRUCT
pt As POINTAPI
hwnd As LongPtr
wHitTestCode As Long
dwExtraInfo As LongPtr
End Type
Private Const WH_MOUSE_LL As Long = 14&
Private Const WM_MOUSEWHEEL As LongPtr = &H20A
Private Const HC_ACTION As Long = 0&
Private Const GWL_HINSTANCE As Long = -6&
Private Const WM_KEYDOWN As Long = &H100
Private Const SCROLL_DOWN As LongPtr = &H780000
Private Const GC_CLASSNAMEUSERFORM As String = "ThunderDFrame"
Private llngptrMouseHook As LongPtr
Private llngptrControlHwnd As LongPtr
Private llngPage As Long
Private lblnHook As Boolean
Private lobjScrollObject As Object
Public Sub HookMouse(ByRef probjUserform As Object, ByRef probjScrollObject As Object, Optional ByVal opvlngPage As Long)
Dim lngptrHinstance As LongPtr
Dim lngptrFormHwnd As LongPtr
Dim lngptrHwndUnderCursor As LongPtr
Dim udtPoint As POINTAPI
llngPage = opvlngPage
Call GetCursorPos(udtPoint)
lngptrHwndUnderCursor = WindowFromPoint(udtPoint.XY)
If llngptrControlHwnd  lngptrHwndUnderCursor Then
Call UnhookMouse
Set lobjScrollObject = probjScrollObject
llngptrControlHwnd = lngptrHwndUnderCursor
lngptrFormHwnd = FindWindowA(GC_CLASSNAMEUSERFORM, probjUserform.Caption)
lngptrHinstance = GetWindowLongPtrA(lngptrFormHwnd, GWL_HINSTANCE)
If Not lblnHook Then
llngptrMouseHook = SetWindowsHookExA(WH_MOUSE_LL, AddressOf MouseProc, lngptrHinstance, 0&)
lblnHook = llngptrMouseHook  0
End If
End If
End Sub
Public Sub UnhookMouse()
If lblnHook Then
Call UnhookWindowsHookEx(llngptrMouseHook)
Set lobjScrollObject = Nothing
llngptrMouseHook = 0
llngptrControlHwnd = 0
lblnHook = False
End If
End Sub
Private Function MouseProc(ByVal pvlngCode As Long, ByVal pvlngptrParam As LongPtr, ByRef prudtParam As MOUSEHOOKSTRUCT) As LongPtr
Dim lngptrHwndUnderCursor As LongPtr
On Error GoTo err_exit
If pvlngCode = HC_ACTION Then
lngptrHwndUnderCursor = WindowFromPoint(prudtParam.pt.XY)
If lngptrHwndUnderCursor = llngptrControlHwnd Then
If pvlngptrParam = 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 = SCROLL_DOWN 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 = SCROLL_DOWN Then
Call PostMessageA(llngptrControlHwnd, WM_KEYDOWN, vbKeyLeft, 0)
Else
Call PostMessageA(llngptrControlHwnd, 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 = SCROLL_DOWN Then
If .ScrollTop > 0 Then
.ScrollTop = .ScrollTop - 30
Else
.ScrollTop = 0
End If
Else
.ScrollTop = .ScrollTop + 30
End If
Else
If prudtParam.hwnd = SCROLL_DOWN 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 = SCROLL_DOWN Then
If .ScrollTop > 0 Then
.ScrollTop = .ScrollTop - 30
Else
.ScrollTop = 0
End If
Else
.ScrollTop = .ScrollTop + 30
End If
Else
If prudtParam.hwnd = SCROLL_DOWN 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(llngptrMouseHook, pvlngCode, pvlngptrParam, ByVal prudtParam)
Exit Function
err_exit:
Call UnhookMouse
End Function
Gruß
Nepumuk
Anzeige
AW:Danke erledigt !
03.09.2021 20:46:45
oraculix
Vielen Dank genial wie immer!
Erstelle mir jetzt schon die dritte Arbeitsmappe. Diesmal gibt es mehrere Userformen nicht alles in eine das führt nur zur instabiliät.
Zumindest bei meinem Wissensstand.
Das Größte Problem habe ich wenn ich in der Userfom1 auf Image 24 Doppelklicke
da stürze ich immer ab!! Es gibt jetzt keine Textbox1 mehr nur noch Listbox und Image
daher habe ich das hier geändert
What:=Lst_Treffer.Value, LookIn:=xlValues, LookAt:=xlPart) hier wird der Fehler gezeigt!
vorher Textbox1.Text
Ersuche um Lösung Danke
Hier der Code
'

Private Sub Image24_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal DragState As MSForms.fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
Dim rngSuche As Range
Set rngSuche = Worksheets("FilmInfo").Columns(2).Find( _
What:=Lst_Treffer.Value, LookIn:=xlValues, LookAt:=xlPart)
If Not rngSuche Is Nothing Then
Application.Goto Reference:=rngSuche
ThisWorkbook.FollowHyperlink rngSuche.Hyperlinks(1).Address
Set rngSuche = Nothing
End If
Cancel = True
End Sub
Gruß
Oraculix
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige