Задача: осуществить скроллинг мышью в комбобоксах на листе. Имеется энное количество комбобоксов, строк около двухсот, выбор по первым символам не эффективен- много данных с повторяющимися первыми символами, скролл посредством полосы прокрутки и кнопками "вверх"/"вниз" крайне неудобен. Начал работать с VBA недавно, знаний мало. Знатоки, помогите пожалуйста, подскажите код или где есть что-нибудь на эту тему. Буду весьма признателен за науку.
Задача: осуществить скроллинг мышью в комбобоксах на листе. Имеется энное количество комбобоксов, строк около двухсот, выбор по первым символам не эффективен- много данных с повторяющимися первыми символами, скролл посредством полосы прокрутки и кнопками "вверх"/"вниз" крайне неудобен. Начал работать с VBA недавно, знаний мало. Знатоки, помогите пожалуйста, подскажите код или где есть что-нибудь на эту тему. Буду весьма признателен за науку.votangi59
Сообщение отредактировал votangi59 - Понедельник, 20.01.2025, 14:09
Всех приветствую! Не поверю, что ни кто не знает, здесь такие грамотные люди. Может код длинный? Ответ нашёл на другом импортном ресурсе, но для меня не внятно, не понимаю что куда прикрутить, уровень знаний оставляет желать. Подскажите, пожалуйста, что к чему здесь (для меня дремучий лес) )):
Solved, by Jaafar Tribak the code i use currently (place it in any module): Option Explicit
[vba]
Код
Type POINTAPI X As Long Y As Long End Type
Type MSLLHOOKSTRUCT pt As POINTAPI mouseData As Long flags As Long time As Long dwExtraInfo As Long End Type
#If VBA7 Then #If Win64 Then Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal Point As LongLong) As LongPtr #Else Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPtr #End If Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As LongPtr) As LongPtr Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr) Declare PtrSafe Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As LongPtr Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd As LongPtr) As LongPtr Declare PtrSafe Function IsWindow Lib "user32" (ByVal hwnd As LongPtr) As Long Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As LongPtr Dim hwnd As LongPtr, lMouseHook As LongPtr #Else Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetActiveWindow Lib "user32" () As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Long Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Dim hwnd As Long, lMouseHook As Long #End If
Sub SetComboBoxHook(ByVal Control As Object) Dim tPt As POINTAPI Dim sBuffer As String Dim lRet As Long
Set oComboBox = Control RemoveComboBoxHook GetCursorPos tPt #If Win64 Then Dim lPt As LongPtr CopyMemory lPt, tPt, LenB(tPt) hwnd = WindowFromPoint(lPt) #Else hwnd = WindowFromPoint(tPt.X, tPt.Y) #End If sBuffer = Space(256) lRet = GetClassName(GetParent(hwnd), sBuffer, 256) If InStr(Left(sBuffer, lRet), "MdcPopup") Then SetFocus hwnd #If Win64 Then lMouseHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProc, Application.HinstancePtr, 0) #Else lMouseHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProc, Application.Hinstance, 0) #End If End If End Sub
Sub RemoveComboBoxHook() UnhookWindowsHookEx lMouseHook End Sub
#If VBA7 Then Function MouseProc(ByVal nCode As Long, ByVal wParam As LongPtr, lParam As MSLLHOOKSTRUCT) As LongPtr #Else Function MouseProc(ByVal nCode As Long, ByVal wParam As Long, lParam As MSLLHOOKSTRUCT) As Long #End If
Dim sBuffer As String Dim lRet As Long
sBuffer = Space(256) lRet = GetClassName(GetActiveWindow, sBuffer, 256) If Left(sBuffer, lRet) = "wndclass_desked_gsk" Then Call RemoveComboBoxHook If IsWindow(hwnd) = 0 Then Call RemoveComboBoxHook
If (nCode = HC_ACTION) Then If wParam = WM_MOUSEWHEEL Then #If Win64 Then Dim lPt As LongPtr CopyMemory lPt, lParam.pt, LenB(lParam.pt) If WindowFromPoint(lPt) = hwnd Then #Else If WindowFromPoint(lParam.pt.X, lParam.pt.Y) = hwnd Then #End If On Error Resume Next If lParam.mouseData > 0 Then oComboBox.TopIndex = oComboBox.TopIndex - 1 '<---u can change this to change the scrolling speed upwards 'u can change "TopIndex" to "listIndex" if you want to change the value instead of hovering it, do not use the dynamic listFillrange if u do! Else oComboBox.TopIndex = oComboBox.TopIndex + 2 '<---u can change this to change the scrolling speed downwards 'u can change "TopIndex" to "listIndex" if you want to change the value instead of hovering it, do not use the dynamic listFillrange if u do! End If On Error GoTo 0 End If End If
MouseProc = CallNextHookEx(lMouseHook, nCode, wParam, ByVal lParam) End Function
he combobox code (view code to the combobox): Option Explicit
'optional Dim ComboBoxRange As Range Dim myRange As Range Dim NumRows 'optional Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call SetComboBoxHook(ComboBox1) End Sub
Private Sub ComboBox1_LostFocus() Call RemoveComboBoxHook End Sub
'optional, this code is for a dynamic list, do not use if u changed TopIndex to ListIndex! 'importent note...u need a dynamic list to begin with if u want to use it! Private Sub ComboBox1_Change() Set myRange = Range("Q:Q") 'the range of data NumRows = Application.WorksheetFunction.Count(myRange) '//////////////////////////////////////////////////////////////// Set ComboBoxRange = Range(Cells(4, 17), Cells(3 + NumRows, 17)) 'my data starts at range Q4, Q = 17, A=1, change this according to the range you want to change '//////////////////////////////////////////////////////////////// ComboBox1.ListFillRange = ComboBoxRange.Cells.Address ComboBox1.DropDown End Sub 'optional
[/vba]
Всех приветствую! Не поверю, что ни кто не знает, здесь такие грамотные люди. Может код длинный? Ответ нашёл на другом импортном ресурсе, но для меня не внятно, не понимаю что куда прикрутить, уровень знаний оставляет желать. Подскажите, пожалуйста, что к чему здесь (для меня дремучий лес) )):
Solved, by Jaafar Tribak the code i use currently (place it in any module): Option Explicit
[vba]
Код
Type POINTAPI X As Long Y As Long End Type
Type MSLLHOOKSTRUCT pt As POINTAPI mouseData As Long flags As Long time As Long dwExtraInfo As Long End Type
#If VBA7 Then #If Win64 Then Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal Point As LongLong) As LongPtr #Else Declare PtrSafe Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPtr #End If Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As LongPtr, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As LongPtr) As LongPtr Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr) Declare PtrSafe Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As LongPtr Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd As LongPtr) As LongPtr Declare PtrSafe Function IsWindow Lib "user32" (ByVal hwnd As LongPtr) As Long Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As LongPtr) As LongPtr Dim hwnd As LongPtr, lMouseHook As LongPtr #Else Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetActiveWindow Lib "user32" () As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Long Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Dim hwnd As Long, lMouseHook As Long #End If
Sub SetComboBoxHook(ByVal Control As Object) Dim tPt As POINTAPI Dim sBuffer As String Dim lRet As Long
Set oComboBox = Control RemoveComboBoxHook GetCursorPos tPt #If Win64 Then Dim lPt As LongPtr CopyMemory lPt, tPt, LenB(tPt) hwnd = WindowFromPoint(lPt) #Else hwnd = WindowFromPoint(tPt.X, tPt.Y) #End If sBuffer = Space(256) lRet = GetClassName(GetParent(hwnd), sBuffer, 256) If InStr(Left(sBuffer, lRet), "MdcPopup") Then SetFocus hwnd #If Win64 Then lMouseHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProc, Application.HinstancePtr, 0) #Else lMouseHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProc, Application.Hinstance, 0) #End If End If End Sub
Sub RemoveComboBoxHook() UnhookWindowsHookEx lMouseHook End Sub
#If VBA7 Then Function MouseProc(ByVal nCode As Long, ByVal wParam As LongPtr, lParam As MSLLHOOKSTRUCT) As LongPtr #Else Function MouseProc(ByVal nCode As Long, ByVal wParam As Long, lParam As MSLLHOOKSTRUCT) As Long #End If
Dim sBuffer As String Dim lRet As Long
sBuffer = Space(256) lRet = GetClassName(GetActiveWindow, sBuffer, 256) If Left(sBuffer, lRet) = "wndclass_desked_gsk" Then Call RemoveComboBoxHook If IsWindow(hwnd) = 0 Then Call RemoveComboBoxHook
If (nCode = HC_ACTION) Then If wParam = WM_MOUSEWHEEL Then #If Win64 Then Dim lPt As LongPtr CopyMemory lPt, lParam.pt, LenB(lParam.pt) If WindowFromPoint(lPt) = hwnd Then #Else If WindowFromPoint(lParam.pt.X, lParam.pt.Y) = hwnd Then #End If On Error Resume Next If lParam.mouseData > 0 Then oComboBox.TopIndex = oComboBox.TopIndex - 1 '<---u can change this to change the scrolling speed upwards 'u can change "TopIndex" to "listIndex" if you want to change the value instead of hovering it, do not use the dynamic listFillrange if u do! Else oComboBox.TopIndex = oComboBox.TopIndex + 2 '<---u can change this to change the scrolling speed downwards 'u can change "TopIndex" to "listIndex" if you want to change the value instead of hovering it, do not use the dynamic listFillrange if u do! End If On Error GoTo 0 End If End If
MouseProc = CallNextHookEx(lMouseHook, nCode, wParam, ByVal lParam) End Function
he combobox code (view code to the combobox): Option Explicit
'optional Dim ComboBoxRange As Range Dim myRange As Range Dim NumRows 'optional Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Call SetComboBoxHook(ComboBox1) End Sub
Private Sub ComboBox1_LostFocus() Call RemoveComboBoxHook End Sub
'optional, this code is for a dynamic list, do not use if u changed TopIndex to ListIndex! 'importent note...u need a dynamic list to begin with if u want to use it! Private Sub ComboBox1_Change() Set myRange = Range("Q:Q") 'the range of data NumRows = Application.WorksheetFunction.Count(myRange) '//////////////////////////////////////////////////////////////// Set ComboBoxRange = Range(Cells(4, 17), Cells(3 + NumRows, 17)) 'my data starts at range Q4, Q = 17, A=1, change this according to the range you want to change '//////////////////////////////////////////////////////////////// ComboBox1.ListFillRange = ComboBoxRange.Cells.Address ComboBox1.DropDown End Sub 'optional
votangi59, Вот откуда вы взяли код там и спросите. Кстати, там и файл прилагается, вот его покрутите. А так без вашего файла примера тяжко будет вам чем-то помочь. Удачи.
votangi59, Вот откуда вы взяли код там и спросите. Кстати, там и файл прилагается, вот его покрутите. А так без вашего файла примера тяжко будет вам чем-то помочь. Удачи.MikeVol
Приветствую, MikeVol. Благодарю за ответ. Файла там я не увидел. https://stackoverflow.com/questio....h-mouse С файлом примера сложновато будет, конфиденциальная информация, да и файл по объёму великоват. Но попробую удалить лишнее и выложить. Попытаюсь сам, методом научного тыка, как-нибудь прикрутить.
Приветствую, MikeVol. Благодарю за ответ. Файла там я не увидел. https://stackoverflow.com/questio....h-mouse С файлом примера сложновато будет, конфиденциальная информация, да и файл по объёму великоват. Но попробую удалить лишнее и выложить. Попытаюсь сам, методом научного тыка, как-нибудь прикрутить.votangi59
Сообщение отредактировал votangi59 - Вторник, 28.01.2025, 09:13
Благодарю, MikeVol. Буду пробовать. Много чего непонятного, мои познания весьма скудны, но как говорится, ещё не вечер. Будем понемногу грызть гранит науки. Желаю вам всего хорошего!
Благодарю, MikeVol. Буду пробовать. Много чего непонятного, мои познания весьма скудны, но как говорится, ещё не вечер. Будем понемногу грызть гранит науки. Желаю вам всего хорошего!votangi59
Приветствую, друзья! Подскажите, пожалуйста, как можно короче записать такую конструкцию: [vba]
Код
Option Explicit Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox1) = True End Sub Private Sub ComboBox1_LostFocus() EnableMouseScroll(ComboBox1) = False End Sub Private Sub ComboBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox2) = True End Sub Private Sub ComboBox2_LostFocus() EnableMouseScroll(ComboBox2) = False End Sub Private Sub ComboBox3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox3) = True End Sub Private Sub ComboBox3_LostFocus() EnableMouseScroll(ComboBox3) = False End Sub
[/vba] Всего комбобоксов 32 штуки, код работает, но возможно есть способ сократить этот код. Как-нибудь объявить переменную, которая будет номером бокса и через цикл сделать.
Приветствую, друзья! Подскажите, пожалуйста, как можно короче записать такую конструкцию: [vba]
Код
Option Explicit Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox1) = True End Sub Private Sub ComboBox1_LostFocus() EnableMouseScroll(ComboBox1) = False End Sub Private Sub ComboBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox2) = True End Sub Private Sub ComboBox2_LostFocus() EnableMouseScroll(ComboBox2) = False End Sub Private Sub ComboBox3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox3) = True End Sub Private Sub ComboBox3_LostFocus() EnableMouseScroll(ComboBox3) = False End Sub
[/vba] Всего комбобоксов 32 штуки, код работает, но возможно есть способ сократить этот код. Как-нибудь объявить переменную, которая будет номером бокса и через цикл сделать.votangi59
Сообщение отредактировал votangi59 - Воскресенье, 06.04.2025, 17:54
Уважаемый MikeVol, с кодом скроллинга в комбо разобрался, благодарю. Есть ещё один вопрос, к тому же, что выше постом. В приложенном ниже файле, почему-то некоторые строки редактор выделяет красным шрифтом. Судя по всему, что-то ему не нравится, но при этом скроллинг мышью во всех комбо функционирует нормально. Добавил ещё пару комбобоксов, норма. Может найдёте время посмотреть, в связи с чем VBA редактор выделяет часть кода красным шрифтом. Выделенный красным код в файле закомментировал, обозначив то место, где что-то не так. Юзаю Excel 2016. Может какая-нибудь несовместимость версий? Уважаемые форумчане, возможно кто-нибудь ещё может заглянуть в код и объяснить, в чём там дело, что не так.
Уважаемый MikeVol, с кодом скроллинга в комбо разобрался, благодарю. Есть ещё один вопрос, к тому же, что выше постом. В приложенном ниже файле, почему-то некоторые строки редактор выделяет красным шрифтом. Судя по всему, что-то ему не нравится, но при этом скроллинг мышью во всех комбо функционирует нормально. Добавил ещё пару комбобоксов, норма. Может найдёте время посмотреть, в связи с чем VBA редактор выделяет часть кода красным шрифтом. Выделенный красным код в файле закомментировал, обозначив то место, где что-то не так. Юзаю Excel 2016. Может какая-нибудь несовместимость версий? Уважаемые форумчане, возможно кто-нибудь ещё может заглянуть в код и объяснить, в чём там дело, что не так.votangi59
votangi59, А в Справку (тут должна быть ссылка) вы пытались залезьте и почитать почему так подсвечивается красным шрифтом? Ещё статья есть, Различие в вызовах функций WinAPI в зависимости от версий Windows и OfficeGoogle всегда поможет или вас забанили? Что-то ссылка на Справку не хочет прикрепится. Но ничего, в статьи есть ссылка на Справку. А по вопросу смотрите файл.
votangi59, А в Справку (тут должна быть ссылка) вы пытались залезьте и почитать почему так подсвечивается красным шрифтом? Ещё статья есть, Различие в вызовах функций WinAPI в зависимости от версий Windows и OfficeGoogle всегда поможет или вас забанили? Что-то ссылка на Справку не хочет прикрепится. Но ничего, в статьи есть ссылка на Справку. А по вопросу смотрите файл.MikeVol
MikeVol, к сожалению, я от таких высоких материй, как WinAPI, очень далёк )). Моих познаний, в этом деле, хватило только на то, что бы поменять количество строк при скроллинге. Редактор ошибки не выдаёт и, соответственно, что искать мне не известно. Прислушаюсь к вашему совету, как говорится - Гугл вам в помощь, кто ищет, тот всегда... Будем искать "выделение красным шрифтом...". Флаг мне в руки и удачи. Благодарю, бум дальше копать. Как насчёт первого вопроса? Есть какие-либо варианты упростить конструкцию?
MikeVol, к сожалению, я от таких высоких материй, как WinAPI, очень далёк )). Моих познаний, в этом деле, хватило только на то, что бы поменять количество строк при скроллинге. Редактор ошибки не выдаёт и, соответственно, что искать мне не известно. Прислушаюсь к вашему совету, как говорится - Гугл вам в помощь, кто ищет, тот всегда... Будем искать "выделение красным шрифтом...". Флаг мне в руки и удачи. Благодарю, бум дальше копать. Как насчёт первого вопроса? Есть какие-либо варианты упростить конструкцию?votangi59
Сообщение отредактировал votangi59 - Понедельник, 07.04.2025, 10:19
А ничего и не надо искать, тем более, это нормально! Для разных версии VBA и офиса предусмотрена API декларация, подробнее в Справке описано. Но оно вам и ненадо знать, голову себе только забивать... Работает - да и хорошо.
А ничего и не надо искать, тем более, это нормально! Для разных версии VBA и офиса предусмотрена API декларация, подробнее в Справке описано. Но оно вам и ненадо знать, голову себе только забивать... Работает - да и хорошо.
Да, немного просветился, понял, код написан для разных версий VBA, 32 и 64 битных. Сомневаюсь, что сейчас кто-то юзает 32-х битные приложения, но код оставлю, на всякий. Благодарю за помощь и разъяснение!
Да, немного просветился, понял, код написан для разных версий VBA, 32 и 64 битных. Сомневаюсь, что сейчас кто-то юзает 32-х битные приложения, но код оставлю, на всякий. Благодарю за помощь и разъяснение!votangi59
Открыл ваш файл, вероятно в коде и ответ на первый вопрос. Жаль, что без комментариев. Я уже прикрутил конструкцию: [vba]
Код
Option Explicit Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox1) = True End Sub Private Sub ComboBox1_LostFocus() EnableMouseScroll(ComboBox1) = False End Sub
[/vba] ... и так 32 раза )). Функционирует. В вашем файле, если я правильно догадываюсь, Лист1 - это лист, где находятся комбобоксы? В него и помещать приведённый вами код. В "Эта книга" у меня уже имеются коды, ваш код: [vba]
Код
Option Explicit Private Sub Workbook_Open() Sheet1.InitComboEvents End Sub
[/vba] я полагаю, нужно вставить в уже имеющуюся процедуру Private Sub Workbook_Open() ... End Sub. Далее создать отдельный модуль "bas_API" и в нём разместить код с одноимённого вашего модуля. Извините за мою безграмотность. Надеюсь я правильно понял?
Открыл ваш файл, вероятно в коде и ответ на первый вопрос. Жаль, что без комментариев. Я уже прикрутил конструкцию: [vba]
Код
Option Explicit Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(ComboBox1) = True End Sub Private Sub ComboBox1_LostFocus() EnableMouseScroll(ComboBox1) = False End Sub
[/vba] ... и так 32 раза )). Функционирует. В вашем файле, если я правильно догадываюсь, Лист1 - это лист, где находятся комбобоксы? В него и помещать приведённый вами код. В "Эта книга" у меня уже имеются коды, ваш код: [vba]
Код
Option Explicit Private Sub Workbook_Open() Sheet1.InitComboEvents End Sub
[/vba] я полагаю, нужно вставить в уже имеющуюся процедуру Private Sub Workbook_Open() ... End Sub. Далее создать отдельный модуль "bas_API" и в нём разместить код с одноимённого вашего модуля. Извините за мою безграмотность. Надеюсь я правильно понял?votangi59
Так, что ві сосвем не туда смотрите. Создаёте Class Module, даёте имя clsComboEvents и вставляете следуйщий код:[vba]
Код
Option Explicit Public WithEvents cBox As MSForms.ComboBox
Private Sub cBox_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(cBox) = True End Sub
Private Sub cBox_LostFocus() EnableMouseScroll(cBox) = False End Sub
[/vba] Далее в модуль ЭтаКнига вставляете следуйщий код: [vba]
Код
Option Explicit
Private Sub Workbook_Open() Sheet1.InitComboEvents End Sub
[/vba] Ну и в модуль вашего листа где у вас находятся
Для этого и мы и создали (создают) Class чтоб меньше было кода а не писать для каждого контрола отдельные свои процедуры.
Так, что ві сосвем не туда смотрите. Создаёте Class Module, даёте имя clsComboEvents и вставляете следуйщий код:[vba]
Код
Option Explicit Public WithEvents cBox As MSForms.ComboBox
Private Sub cBox_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(cBox) = True End Sub
Private Sub cBox_LostFocus() EnableMouseScroll(cBox) = False End Sub
[/vba] Далее в модуль ЭтаКнига вставляете следуйщий код: [vba]
Код
Option Explicit
Private Sub Workbook_Open() Sheet1.InitComboEvents End Sub
[/vba] Ну и в модуль вашего листа где у вас находятся
Всем удачного дня! Уважаемый MikeVol, всё сделал как изложено в "Сообщение № 15", только поменял здесь: [vba]
Код
Option Explicit Private Sub Workbook_Open() Sheet1.InitComboEvents End Sub
[/vba] "Sheet1" на "Лист2", поскольку у меня комбобоксы на этом листе. При запуске файла, в Class Modules - в созданом модуле clsComboEvents, здесь [vba]
Код
Private Sub cBox_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(cBox) = True End Sub
[/vba] выводится ошибка: "Sub or Function not defined" и "EnableMouseScroll(cBox) =" окрашивается синим цветом. Может подскажете что и где следует исправить? Возможно дело в "cBox As MSForms.ComboBox" - предполагаю, что это для комбобокса на форме. У меня комбо на листе.
Всем удачного дня! Уважаемый MikeVol, всё сделал как изложено в "Сообщение № 15", только поменял здесь: [vba]
Код
Option Explicit Private Sub Workbook_Open() Sheet1.InitComboEvents End Sub
[/vba] "Sheet1" на "Лист2", поскольку у меня комбобоксы на этом листе. При запуске файла, в Class Modules - в созданом модуле clsComboEvents, здесь [vba]
Код
Private Sub cBox_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) EnableMouseScroll(cBox) = True End Sub
[/vba] выводится ошибка: "Sub or Function not defined" и "EnableMouseScroll(cBox) =" окрашивается синим цветом. Может подскажете что и где следует исправить? Возможно дело в "cBox As MSForms.ComboBox" - предполагаю, что это для комбобокса на форме. У меня комбо на листе.votangi59
Сообщение отредактировал votangi59 - Вторник, 08.04.2025, 05:03