Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Скроллинг мышью в комбобоксах на листе. - Мир MS Excel

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_, DrMini  
Скроллинг мышью в комбобоксах на листе.
votangi59 Дата: Понедельник, 20.01.2025, 12:50 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Задача: осуществить скроллинг мышью в комбобоксах на листе.
Имеется энное количество комбобоксов, строк около двухсот, выбор по первым символам не эффективен- много данных с повторяющимися первыми символами, скролл посредством полосы прокрутки и кнопками "вверх"/"вниз" крайне неудобен.
Начал работать с VBA недавно, знаний мало.
Знатоки, помогите пожалуйста, подскажите код или где есть что-нибудь на эту тему.
Буду весьма признателен за науку.


Сообщение отредактировал votangi59 - Понедельник, 20.01.2025, 14:09
 
Ответить
СообщениеЗадача: осуществить скроллинг мышью в комбобоксах на листе.
Имеется энное количество комбобоксов, строк около двухсот, выбор по первым символам не эффективен- много данных с повторяющимися первыми символами, скролл посредством полосы прокрутки и кнопками "вверх"/"вниз" крайне неудобен.
Начал работать с VBA недавно, знаний мало.
Знатоки, помогите пожалуйста, подскажите код или где есть что-нибудь на эту тему.
Буду весьма признателен за науку.

Автор - votangi59
Дата добавления - 20.01.2025 в 12:50
votangi59 Дата: Понедельник, 27.01.2025, 10:32 | Сообщение № 2
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Всех приветствую!
Не поверю, что ни кто не знает, здесь такие грамотные люди.
Может код длинный? Ответ нашёл на другом импортном ресурсе, но для меня не внятно, не понимаю что куда прикрутить, уровень знаний оставляет желать.
Подскажите, пожалуйста, что к чему здесь (для меня дремучий лес) )):

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

Const WH_MOUSE_LL = 14
Const WM_MOUSEWHEEL = &H20A
Const HC_ACTION = 0

Dim oComboBox As Object

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]


Сообщение отредактировал votangi59 - Понедельник, 27.01.2025, 10:38
 
Ответить
СообщениеВсех приветствую!
Не поверю, что ни кто не знает, здесь такие грамотные люди.
Может код длинный? Ответ нашёл на другом импортном ресурсе, но для меня не внятно, не понимаю что куда прикрутить, уровень знаний оставляет желать.
Подскажите, пожалуйста, что к чему здесь (для меня дремучий лес) )):

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

Const WH_MOUSE_LL = 14
Const WM_MOUSEWHEEL = &H20A
Const HC_ACTION = 0

Dim oComboBox As Object

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]

Автор - votangi59
Дата добавления - 27.01.2025 в 10:32
MikeVol Дата: Понедельник, 27.01.2025, 16:13 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
votangi59, Вот откуда вы взяли код там и спросите. Кстати, там и файл прилагается, вот его покрутите. А так без вашего файла примера тяжко будет вам чем-то помочь. Удачи.


Ученик.
Одесса - Украина
 
Ответить
Сообщениеvotangi59, Вот откуда вы взяли код там и спросите. Кстати, там и файл прилагается, вот его покрутите. А так без вашего файла примера тяжко будет вам чем-то помочь. Удачи.

Автор - MikeVol
Дата добавления - 27.01.2025 в 16:13
votangi59 Дата: Вторник, 28.01.2025, 09:06 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Приветствую, MikeVol. Благодарю за ответ.
Файла там я не увидел. https://stackoverflow.com/questio....h-mouse
С файлом примера сложновато будет, конфиденциальная информация, да и файл по объёму великоват. Но попробую удалить лишнее и выложить.
Попытаюсь сам, методом научного тыка, как-нибудь прикрутить.


Сообщение отредактировал votangi59 - Вторник, 28.01.2025, 09:13
 
Ответить
СообщениеПриветствую, MikeVol. Благодарю за ответ.
Файла там я не увидел. https://stackoverflow.com/questio....h-mouse
С файлом примера сложновато будет, конфиденциальная информация, да и файл по объёму великоват. Но попробую удалить лишнее и выложить.
Попытаюсь сам, методом научного тыка, как-нибудь прикрутить.

Автор - votangi59
Дата добавления - 28.01.2025 в 09:06
MikeVol Дата: Вторник, 28.01.2025, 10:11 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
votangi59, Так вот же пример. Сама тема: ComboBox Scroll with Mouse wheel
Там много чего интересного найдёте для себя. Файл пример от вас не нужен уже. Сами разберётесь. Удачи.
К сообщению приложен файл: ComboMouseWheel.xls (70.5 Kb)


Ученик.
Одесса - Украина
 
Ответить
Сообщениеvotangi59, Так вот же пример. Сама тема: ComboBox Scroll with Mouse wheel
Там много чего интересного найдёте для себя. Файл пример от вас не нужен уже. Сами разберётесь. Удачи.

Автор - MikeVol
Дата добавления - 28.01.2025 в 10:11
votangi59 Дата: Вторник, 28.01.2025, 22:56 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Благодарю, MikeVol.
Буду пробовать. Много чего непонятного, мои познания весьма скудны, но как говорится, ещё не вечер.
Будем понемногу грызть гранит науки.
Желаю вам всего хорошего!
 
Ответить
СообщениеБлагодарю, MikeVol.
Буду пробовать. Много чего непонятного, мои познания весьма скудны, но как говорится, ещё не вечер.
Будем понемногу грызть гранит науки.
Желаю вам всего хорошего!

Автор - votangi59
Дата добавления - 28.01.2025 в 22:56
votangi59 Дата: Воскресенье, 06.04.2025, 17:50 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Приветствую, друзья!
Подскажите, пожалуйста, как можно короче записать такую конструкцию:
[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 - Воскресенье, 06.04.2025, 17:54
 
Ответить
СообщениеПриветствую, друзья!
Подскажите, пожалуйста, как можно короче записать такую конструкцию:
[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
Дата добавления - 06.04.2025 в 17:50
votangi59 Дата: Понедельник, 07.04.2025, 05:09 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Уважаемый MikeVol, с кодом скроллинга в комбо разобрался, благодарю.
Есть ещё один вопрос, к тому же, что выше постом. В приложенном ниже файле, почему-то некоторые строки редактор выделяет красным шрифтом.
Судя по всему, что-то ему не нравится, но при этом скроллинг мышью во всех комбо функционирует нормально. Добавил ещё пару комбобоксов, норма.
Может найдёте время посмотреть, в связи с чем VBA редактор выделяет часть кода красным шрифтом. Выделенный красным код в файле закомментировал, обозначив то место, где что-то не так. Юзаю Excel 2016. Может какая-нибудь несовместимость версий?
Уважаемые форумчане, возможно кто-нибудь ещё может заглянуть в код и объяснить, в чём там дело, что не так.
К сообщению приложен файл: na_forum.xls (92.0 Kb)


Сообщение отредактировал votangi59 - Понедельник, 07.04.2025, 05:11
 
Ответить
СообщениеУважаемый MikeVol, с кодом скроллинга в комбо разобрался, благодарю.
Есть ещё один вопрос, к тому же, что выше постом. В приложенном ниже файле, почему-то некоторые строки редактор выделяет красным шрифтом.
Судя по всему, что-то ему не нравится, но при этом скроллинг мышью во всех комбо функционирует нормально. Добавил ещё пару комбобоксов, норма.
Может найдёте время посмотреть, в связи с чем VBA редактор выделяет часть кода красным шрифтом. Выделенный красным код в файле закомментировал, обозначив то место, где что-то не так. Юзаю Excel 2016. Может какая-нибудь несовместимость версий?
Уважаемые форумчане, возможно кто-нибудь ещё может заглянуть в код и объяснить, в чём там дело, что не так.

Автор - votangi59
Дата добавления - 07.04.2025 в 05:09
MikeVol Дата: Понедельник, 07.04.2025, 09:56 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
votangi59, А в Справку (тут должна быть ссылка) вы пытались залезьте и почитать почему так подсвечивается красным шрифтом? Ещё статья есть, Различие в вызовах функций WinAPI в зависимости от версий Windows и Office Google всегда поможет или вас забанили?
Что-то ссылка на Справку не хочет прикрепится. Но ничего, в статьи есть ссылка на Справку.
А по вопросу смотрите файл.
К сообщению приложен файл: 07_04_2025_exw_skrolling_myshj.xls (93.0 Kb)


Ученик.
Одесса - Украина


Сообщение отредактировал MikeVol - Понедельник, 07.04.2025, 10:25
 
Ответить
Сообщениеvotangi59, А в Справку (тут должна быть ссылка) вы пытались залезьте и почитать почему так подсвечивается красным шрифтом? Ещё статья есть, Различие в вызовах функций WinAPI в зависимости от версий Windows и Office Google всегда поможет или вас забанили?
Что-то ссылка на Справку не хочет прикрепится. Но ничего, в статьи есть ссылка на Справку.
А по вопросу смотрите файл.

Автор - MikeVol
Дата добавления - 07.04.2025 в 09:56
votangi59 Дата: Понедельник, 07.04.2025, 10:18 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

MikeVol, к сожалению, я от таких высоких материй, как WinAPI, очень далёк )). Моих познаний, в этом деле, хватило только на то, что бы поменять количество строк при скроллинге. Редактор ошибки не выдаёт и, соответственно, что искать мне не известно. Прислушаюсь к вашему совету, как говорится - Гугл вам в помощь, кто ищет, тот всегда... Будем искать "выделение красным шрифтом...". Флаг мне в руки и удачи.
Благодарю, бум дальше копать.
Как насчёт первого вопроса? Есть какие-либо варианты упростить конструкцию?


Сообщение отредактировал votangi59 - Понедельник, 07.04.2025, 10:19
 
Ответить
СообщениеMikeVol, к сожалению, я от таких высоких материй, как WinAPI, очень далёк )). Моих познаний, в этом деле, хватило только на то, что бы поменять количество строк при скроллинге. Редактор ошибки не выдаёт и, соответственно, что искать мне не известно. Прислушаюсь к вашему совету, как говорится - Гугл вам в помощь, кто ищет, тот всегда... Будем искать "выделение красным шрифтом...". Флаг мне в руки и удачи.
Благодарю, бум дальше копать.
Как насчёт первого вопроса? Есть какие-либо варианты упростить конструкцию?

Автор - votangi59
Дата добавления - 07.04.2025 в 10:18
MikeVol Дата: Понедельник, 07.04.2025, 10:31 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
Будем искать "выделение красным шрифтом

А ничего и не надо искать, тем более, это нормально! Для разных версии VBA и офиса предусмотрена API декларация, подробнее в Справке описано. Но оно вам и ненадо знать, голову себе только забивать... Работает - да и хорошо.
Флаг мне в руки и удачи
я этого не писал.
По первому вопросу прикрепил файл выше, дополнил свой пост.


Ученик.
Одесса - Украина
 
Ответить
Сообщение
Будем искать "выделение красным шрифтом

А ничего и не надо искать, тем более, это нормально! Для разных версии VBA и офиса предусмотрена API декларация, подробнее в Справке описано. Но оно вам и ненадо знать, голову себе только забивать... Работает - да и хорошо.
Флаг мне в руки и удачи
я этого не писал.
По первому вопросу прикрепил файл выше, дополнил свой пост.

Автор - MikeVol
Дата добавления - 07.04.2025 в 10:31
votangi59 Дата: Понедельник, 07.04.2025, 10:42 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Да, немного просветился, понял, код написан для разных версий VBA, 32 и 64 битных. Сомневаюсь, что сейчас кто-то юзает 32-х битные приложения, но код оставлю, на всякий.
Благодарю за помощь и разъяснение!
 
Ответить
СообщениеДа, немного просветился, понял, код написан для разных версий VBA, 32 и 64 битных. Сомневаюсь, что сейчас кто-то юзает 32-х битные приложения, но код оставлю, на всякий.
Благодарю за помощь и разъяснение!

Автор - votangi59
Дата добавления - 07.04.2025 в 10:42
MikeVol Дата: Понедельник, 07.04.2025, 10:46 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
Сомневаюсь, что сейчас кто-то юзает 32-х битные приложения
Ещё как используются 32-х битные приложениея...


Ученик.
Одесса - Украина
 
Ответить
Сообщение
Сомневаюсь, что сейчас кто-то юзает 32-х битные приложения
Ещё как используются 32-х битные приложениея...

Автор - MikeVol
Дата добавления - 07.04.2025 в 10:46
votangi59 Дата: Понедельник, 07.04.2025, 11:05 | Сообщение № 14
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Открыл ваш файл, вероятно в коде и ответ на первый вопрос. Жаль, что без комментариев.
Я уже прикрутил конструкцию:
[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
Дата добавления - 07.04.2025 в 11:05
MikeVol Дата: Понедельник, 07.04.2025, 14:55 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
Так, что ві сосвем не туда смотрите. Создаёте 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] Ну и в модуль вашего листа где у вас находятся
Всего комбобоксов 32 штуки
вставляете следуйщий код: [vba]
Код
Option Explicit
Dim ComboColl       As Collection

Public Sub InitComboEvents()
    Dim c           As clsComboEvents
    Dim ctrl        As OLEObject

    Set ComboColl = New Collection

    For Each ctrl In Me.OLEObjects

        If TypeOf ctrl.Object Is MSForms.ComboBox Then
            Set c = New clsComboEvents
            Set c.cBox = ctrl.Object
            ComboColl.Add c
        End If

    Next ctrl

End Sub
[/vba] и будет вам счастье и не надо городить код для всех
32 штуки
Для этого и мы и создали (создают) 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] Ну и в модуль вашего листа где у вас находятся
Всего комбобоксов 32 штуки
вставляете следуйщий код: [vba]
Код
Option Explicit
Dim ComboColl       As Collection

Public Sub InitComboEvents()
    Dim c           As clsComboEvents
    Dim ctrl        As OLEObject

    Set ComboColl = New Collection

    For Each ctrl In Me.OLEObjects

        If TypeOf ctrl.Object Is MSForms.ComboBox Then
            Set c = New clsComboEvents
            Set c.cBox = ctrl.Object
            ComboColl.Add c
        End If

    Next ctrl

End Sub
[/vba] и будет вам счастье и не надо городить код для всех
32 штуки
Для этого и мы и создали (создают) Class чтоб меньше было кода а не писать для каждого контрола отдельные свои процедуры.

Автор - MikeVol
Дата добавления - 07.04.2025 в 14:55
votangi59 Дата: Вторник, 08.04.2025, 04:17 | Сообщение № 16
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

Всем удачного дня!
Уважаемый 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 - Вторник, 08.04.2025, 05:03
 
Ответить
СообщениеВсем удачного дня!
Уважаемый 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
Дата добавления - 08.04.2025 в 04:17
MikeVol Дата: Вторник, 08.04.2025, 08:43 | Сообщение № 17
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
votangi59, А в моём файле разве
комбобокса на форме
???


Ученик.
Одесса - Украина
 
Ответить
Сообщениеvotangi59, А в моём файле разве
комбобокса на форме
???

Автор - MikeVol
Дата добавления - 08.04.2025 в 08:43
votangi59 Дата: Вторник, 08.04.2025, 11:52 | Сообщение № 18
Группа: Пользователи
Ранг: Участник
Сообщений: 65
Репутация: 3 ±
Замечаний: 0% ±

"MSForms" - это не про форму? Я малограмотен в этих вопросах - предположил.
Так в чём дело, что не так в коде?
 
Ответить
Сообщение"MSForms" - это не про форму? Я малограмотен в этих вопросах - предположил.
Так в чём дело, что не так в коде?

Автор - votangi59
Дата добавления - 08.04.2025 в 11:52
MikeVol Дата: Вторник, 08.04.2025, 20:18 | Сообщение № 19
Группа: Проверенные
Ранг: Обитатель
Сообщений: 425
Репутация: 98 ±
Замечаний: 0% ±

MSO LTSC 2021 EN
Так в чём дело, что не так в коде?
В каком коде? У меня всё прекрасно работает!


Ученик.
Одесса - Украина
 
Ответить
Сообщение
Так в чём дело, что не так в коде?
В каком коде? У меня всё прекрасно работает!

Автор - MikeVol
Дата добавления - 08.04.2025 в 20:18
cmivadwot Дата: Среда, 09.04.2025, 00:46 | Сообщение № 20
Группа: Проверенные
Ранг: Ветеран
Сообщений: 599
Репутация: 115 ±
Замечаний: 0% ±

365
"Sheet1" на "Лист2", поскольку у меня комбобоксы на этом листе.

Sheet1 на Sheet2 или...
К сообщению приложен файл: 1897871.xls (167.0 Kb) · 4928666.jpg (18.9 Kb)


Сообщение отредактировал cmivadwot - Среда, 09.04.2025, 01:04
 
Ответить
Сообщение
"Sheet1" на "Лист2", поскольку у меня комбобоксы на этом листе.

Sheet1 на Sheet2 или...

Автор - cmivadwot
Дата добавления - 09.04.2025 в 00:46
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!