Всем доброго времени суток!
Примеры кода прокрутки списка ListBox колёсиком мыши для Excel 2003 взяты из форумов. Два файла с вариантами кода прокрутки списка ListBox приложены.
Каждый из этих примеров работают на ноутбуке с ОС Windows XP и настольном ПК с Windows Vista.
При усложнении кода формы. прокрутка списка ListBox колёсиком мыши на ноутбуке с ОС Windows XP работает частично.
Код на UserForm с ListBox - ом
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321.
Option Explicit
Option Compare Text '<-----!!!----
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) 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 WithEvents mMousewheel As clsMouseWheel
Private bMouseIn As Boolean
Public hWnd As Long
Dim ThisList As Variant
Dim lngCnt As Long
Dim StartW
Dim StartH
Dim arrZata() As String
Dim ListRng As Excel.Range
Dim objExcel As Excel.Workbook
Private Sub CheckBox1_Click()
Dim SCaption As String
Select Case CheckBox1.Value
Case True
SCaption = "Поиск по первой букве"
Case False
SCaption = "Поиск по букве"
End Select
Label2.Caption = SCaption
TextBox1.Text = ""
End Sub
Private Sub CloseButton_Click()
Unload Me
End Sub
Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
Dim intJ As Integer
Worksheets("Лист1").Cells(6, 5).Value = Me.ListBox1.Column(pvargColumn:=1)
Worksheets("Лист1").Cells(7, 8).ClearContents
Unload UserForm1
'Cells(7, 1).Activate
End Sub
Private Sub TextBox1_Change()
Dim InsMode As Boolean
Dim Txt As String, Criteria As String
Dim ListItem As Variant
Dim arrLata() As String
Dim arrSata() As String
Dim intT As Integer, intX As Integer, intU As Integer
If InsMode Then Exit Sub
Txt = TextBox1.Text
ListBox1.Clear
If Txt <> "" Then
'Criteria = "*" & TextBox1.Text & "*"
If CheckBox1.Value = False Then
Criteria = "*" & TextBox1.Text & "*"
Else
Criteria = Txt & "*"
End If
'Criteria = Txt
'Criteria = Txt & "*"
intT = 0
intX = 0
For Each ListItem In ThisList
intT = intT + 1
'If ListItem Like Criteria Then ListBox1.AddItem ListItem
If ListItem Like Criteria Then
intX = intX + 1
ReDim Preserve arrLata(1 To 2, 1 To intX) As String
arrLata(1, intX) = intT
arrLata(2, intX) = ListItem
End If
If intT < lngCnt Then GoTo 10
ReDim Preserve arrSata(1 To intX + 1, 1 To 2) As String
For intU = 1 To intX
arrSata(intU, 1) = arrLata(1, intU)
arrSata(intU, 2) = arrLata(2, intU)
Next intU
ListBox1.List = arrSata
10 Next
Else
ListBox1.List = arrZata
End If
If Txt = "" Then
Label1.Caption = ListBox1.ListCount & " из " & lngCnt
Exit Sub
End If
Label1.Caption = ListBox1.ListCount - 1 & " из " & lngCnt
End Sub
Private Sub UserForm_Terminate()
'Dim lngCnt As Long
'Dim ListRng As Excel.Range
Dim oSheet As Excel.Worksheet
Dim owb1 As Excel.Workbook
Dim intW As Integer
Set objExcel = GetObject("D:\Книга1.xls")
Set owb1 = GetObject("D:\Книга2.xls")
Set oSheet = objExcel.Worksheets("Лист1")
Set ListRng = Range(oSheet.Range("A2"), oSheet.Range("A2").End(xlDown))
lngCnt = ListRng.Rows.Count
If lngCnt = 65535 Then Let lngCnt = 1
intW = 2
Do While oSheet.Cells(intW, 1) <> owb1.Worksheets("Лист1").Cells(6, 5)
intW = intW + 1
If intW - 1 > lngCnt Then Exit Sub
Loop
owb1.Worksheets("Лист1").Cells(7, 8) = oSheet.Cells(intW, 18) & _
oSheet.Cells(intW, 19) & _
oSheet.Cells(intW, 20) & _
oSheet.Cells(intW, 21) & _
oSheet.Cells(intW, 22) & _
oSheet.Cells(intW, 23) & _
oSheet.Cells(intW, 24) & _
oSheet.Cells(intW, 25) & _
oSheet.Cells(intW, 26) & _
oSheet.Cells(intW, 27) & _
oSheet.Cells(intW, 28) & _
oSheet.Cells(intW, 29)
owb1.Worksheets("Лист2").Cells(10, 22) = oSheet.Cells(intW, 1)
If owb1.Worksheets("Лист1").Cells(7, 8) = "" Then _ owb1.Worksheets("Лист2").Cells(10, 22) = ""
owb1.Worksheets("Лист2").Cells(13, 26) = oSheet.Cells(intW, 18)
owb1.Worksheets("Лист2").Cells(13, 27) = oSheet.Cells(intW, 19)
owb1.Worksheets("Лист2").Cells(13, 28) = oSheet.Cells(intW, 20)
owb1.Worksheets("Лист2").Cells(13, 29) = oSheet.Cells(intW, 21)
owb1.Worksheets("Лист2").Cells(13, 30) = oSheet.Cells(intW, 22)
owb1.Worksheets("Лист2").Cells(13, 31) = oSheet.Cells(intW, 23)
owb1.Worksheets("Лист2").Cells(13, 32) = oSheet.Cells(intW, 24)
owb1.Worksheets("Лист2").Cells(13, 33) = oSheet.Cells(intW, 25)
owb1.Worksheets("Лист2").Cells(13, 34) = oSheet.Cells(intW, 26)
owb1.Worksheets("Лист2").Cells(13, 35) = oSheet.Cells(intW, 27)
owb1.Worksheets("Лист2").Cells(13, 36) = oSheet.Cells(intW, 28)
owb1.Worksheets("Лист2").Cells(13, 37) = oSheet.Cells(intW, 29)
owb1.Worksheets("Лист2").Cells(15, 20) = oSheet.Cells(intW, 17)
owb1.Worksheets("Лист2").Cells(17, 28) = oSheet.Cells(intW, 40)
owb1.Worksheets("Лист2").Cells(17, 29) = oSheet.Cells(intW, 41)
owb1.Worksheets("Лист2").Cells(17, 30) = oSheet.Cells(intW, 42)
owb1.Worksheets("Лист2").Cells(17, 31) = oSheet.Cells(intW, 43)
owb1.Worksheets("Лист2").Cells(17, 32) = oSheet.Cells(intW, 44)
owb1.Worksheets("Лист2").Cells(17, 33) = oSheet.Cells(intW, 45)
owb1.Worksheets("Лист2").Cells(17, 34) = oSheet.Cells(intW, 46)
owb1.Worksheets("Лист2").Cells(17, 35) = oSheet.Cells(intW, 47)
owb1.Worksheets("Лист2").Cells(17, 36) = oSheet.Cells(intW, 48)
owb1.Worksheets("Лист2").Cells(17, 37) = oSheet.Cells(intW, 49)
owb1.Worksheets("Лист2").Cells(19, 28) = oSheet.Cells(intW, 30)
owb1.Worksheets("Лист2").Cells(19, 29) = oSheet.Cells(intW, 31)
owb1.Worksheets("Лист2").Cells(19, 30) = oSheet.Cells(intW, 32)
owb1.Worksheets("Лист2").Cells(19, 31) = oSheet.Cells(intW, 33)
owb1.Worksheets("Лист2").Cells(19, 32) = oSheet.Cells(intW, 34)
owb1.Worksheets("Лист2").Cells(19, 33) = oSheet.Cells(intW, 35)
owb1.Worksheets("Лист2").Cells(19, 34) = oSheet.Cells(intW, 36)
owb1.Worksheets("Лист2").Cells(19, 35) = oSheet.Cells(intW, 37)
owb1.Worksheets("Лист2").Cells(19, 36) = oSheet.Cells(intW, 38)
owb1.Worksheets("Лист2").Cells(19, 37) = oSheet.Cells(intW, 39)
owb1.Worksheets("Лист2").Cells(21, 23) = oSheet.Cells(intW, 9)
owb1.Worksheets("Лист2").Cells(21, 24) = oSheet.Cells(intW, 10)
owb1.Worksheets("Лист2").Cells(21, 25) = oSheet.Cells(intW, 11)
owb1.Worksheets("Лист2").Cells(21, 26) = oSheet.Cells(intW, 12)
owb1.Worksheets("Лист2").Cells(21, 27) = oSheet.Cells(intW, 13)
owb1.Worksheets("Лист2").Cells(21, 28) = oSheet.Cells(intW, 14)
owb1.Worksheets("Лист2").Cells(21, 29) = oSheet.Cells(intW, 15)
owb1.Worksheets("Лист2").Cells(21, 30) = oSheet.Cells(intW, 16)
owb1.Worksheets("Лист2").Cells(21, 33) = oSheet.Cells(intW, 3) & _
oSheet.Cells(intW, 4) & _
oSheet.Cells(intW, 5) & _
oSheet.Cells(intW, 6) & _
oSheet.Cells(intW, 7) & _
oSheet.Cells(intW, 8)
owb1.Worksheets("Лист2").Cells(23, 17) = oSheet.Cells(intW, 50)
End Sub
Private Sub NormalButton_Click()
ScrollBar1.Value = 100
End Sub
Private Sub ScrollBar1_Change()
Me.Zoom = ScrollBar1.Value
Me.Width = StartW * (ScrollBar1.Value / 100)
Me.Height = StartH * (ScrollBar1.Value / 100)
LabelZoom.Caption = ScrollBar1.Value & "%"
End Sub
Private Sub UserForm_Initialize()
Dim intU As Integer, intH As Integer
'Dim ListRng As Excel.Range
'Dim ThisList As Variant
'Dim arrZata() As String
'Dim arrSata() As String
'Dim objExcel As Excel.Workbook
'Dim lngCnt As Long
hWnd = FindWindow("ThunderDFrame", Me.Caption)
Set MouseWheel = New clsMouseWheel
Set mMousewheel = MouseWheel
LocalPrevWndProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WindowProc)
StartW = Me.Width
StartH = Me.Height
Set objExcel = GetObject("D:\Книга1.xls")
Set ListRng = Range(objExcel.Worksheets("Лист1").Range("A2"), objExcel.Worksheets("Лист1").Range("A2").End(xlDown))
ThisList = ListRng.Value
lngCnt = ListRng.Rows.Count
If lngCnt = 65535 Then Let lngCnt = 1
ReDim arrZata(1 To lngCnt, 1 To 2) As String
For intH = 1 To lngCnt
arrZata(intH, 1) = intH
arrZata(intH, 2) = ThisList(intH, 1)
Next intH
'ReDim arrSata(1 To lngCnt, 1 To 2) As String
'For intU = 1 To lngCnt
'arrSata(intU, 1) = arrZata(intU, 1)
'arrSata(intU, 2) = arrZata(intU, 2)
'Next intU
ListBox1.List = arrZata
'ListBox1.List = arrSata
Label1.Caption = ListBox1.ListCount & " ³ç " & lngCnt
Label2.Caption = "Поиск по букве"
End Sub
Private Sub UserForm_Activate()
ListBox1.ListIndex = 0
End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
bMouseIn = False
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
WheelUnHook
End Sub
Private Sub UserForm_Deactivate()
WheelUnHook
End Sub
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
bMouseIn = True
End Sub
Private Sub ListBox1_Change()
Dim intR As Integer
For intR = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(intR) Then
Label3.Caption = ListBox1.List(intR) & " " & ThisList(intR + 1, 1)
End If
Next
End Sub
Private Sub mMousewheel_Rotation(bUp As Boolean)
If bMouseIn Then
With Me.ListBox1
If bUp Then
If .ListIndex > 0 Then .ListIndex = .ListIndex - 1
If .TopIndex > 0 Then
If .TopIndex > 1 Then
.TopIndex = .TopIndex - 1
Else
.TopIndex = 0
End If
End If
Else
.TopIndex = .TopIndex + 1
If .ListIndex >= 0 And .ListIndex < .ListCount - 1 Then .ListIndex = .ListIndex + 1
End If
End With
End If
End Sub
Private Sub WheelUnHook()
Dim WorkFlag As Long
On Error Resume Next
WorkFlag = SetWindowLong(Me.hWnd, GWL_WNDPROC, LocalPrevWndProc)
Set MouseWheel = Nothing
End Sub
Код модуля класса
Public Event Rotation(bUp As Boolean)
Public Sub RotateMouse(Rotation As Long)
If Rotation > 0 Then
RaiseEvent Rotation(True)
Else
RaiseEvent Rotation(False)
End If
End Sub
Код общего модуля
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
Public MouseWheel As clsMouseWheel
Public LocalPrevWndProc As Long
Public Const GWL_WNDPROC = -4
Public Const WM_MOUSEWHEEL = &H20A
Public Function WindowProc(ByVal Lwnd As Long, ByVal Lmsg As Long, ByVal Wparam As Long, ByVal Lparam As Long) As Long
Dim MouseKeys As Long
Dim Rotation As Long
If Lmsg = WM_MOUSEWHEEL Then
MouseKeys = Wparam And 65535
Rotation = Wparam / 65536
MouseWheel.RotateMouse Rotation
End If
WindowProc = CallWindowProc(LocalPrevWndProc, Lwnd, Lmsg, Wparam, Lparam)
End Function
'Public Sub ïïï()
'With UserForm1.ListBox1
'.List = Array("Ñëîí", "Ñòóë", "Äåðåâî", "Ïîãîäà", "Æåëåçî", "Âîäà", "Ãðèá")
'End With
'UserForm1.Show
'End Sub
работает на настольном ПК с Windows Vista.
На ноутбуке с Windows XP представленный код тоже работает, однако как только сделать клик по верхней панели формы (причём в любом месте), где расположен UserForm.Caption и кнопка (х) для закрытия формы, приложение Excel зависает. И ещё – если непосредственно после открытия формы курсор мыши расположен над верхней панелью формы, содержимое формы долго грузится. Если в такой момент сместить курсор с верхней панели формы, то форма быстро загружается.
Может есть решение – устранить зависание приложения Excel, при работе на ноутбуке, после клика по верхней панели формы? Заранее спасибо.
|