Удобный автофильтр работает только с текстом. Просто мне ни разу не было нужно фильтровать числа К тому же при фильтрации чисел надо ещё как-то критерий выборки (больше, больше-равно, равно, меньше-равно, меньше) задавать, а это лишние навороты на интерфейс. Для работы с цифрами надо модернизировать процедуру FLTR_by_Box К сожалению, у меня сейчас завал на работе и посидеть, подумать над чем-то кроме текущих дел совсем нет времени. И аврал закончится, похоже, не раньше августа-сентября... Может, кто-то из местных гуру что-нибудь придумает?
Как временное решение могу на вскидку предложить Вам попробовать придать фильтруемым строкам текстовый формат вместо цифрового/общего. Но тогда придётся и формулы листа немного подправить чтобы они могли с такими данными работать.
Удобный автофильтр работает только с текстом. Просто мне ни разу не было нужно фильтровать числа К тому же при фильтрации чисел надо ещё как-то критерий выборки (больше, больше-равно, равно, меньше-равно, меньше) задавать, а это лишние навороты на интерфейс. Для работы с цифрами надо модернизировать процедуру FLTR_by_Box К сожалению, у меня сейчас завал на работе и посидеть, подумать над чем-то кроме текущих дел совсем нет времени. И аврал закончится, похоже, не раньше августа-сентября... Может, кто-то из местных гуру что-нибудь придумает?
Как временное решение могу на вскидку предложить Вам попробовать придать фильтруемым строкам текстовый формат вместо цифрового/общего. Но тогда придётся и формулы листа немного подправить чтобы они могли с такими данными работать.Alex_ST
Alex_ST, ентот вопрос с цифрами решил топорным способом, приписал буковки к цифрам и теперь ищет) но теперь другой вопрос, можно ли сделать так чтобы вводимые символы в голубые поля (смешно звучит)) дублировались в обычные ячейки, так как я планирую использовать эти данные в расчетах обычных формул
Alex_ST, ентот вопрос с цифрами решил топорным способом, приписал буковки к цифрам и теперь ищет) но теперь другой вопрос, можно ли сделать так чтобы вводимые символы в голубые поля (смешно звучит)) дублировались в обычные ячейки, так как я планирую использовать эти данные в расчетах обычных формулmasterlii
Можно. Не сложно. Но времени на то, чтобы делать файл-пример катастрофически нет... Там ничего сложного. Вы уж сами поправьте. Нужно всего лишь заменить процедуру Private Sub FLTR_by_Box на такую:
[vba]
Код
Private Sub FLTR_by_Box(oBj As Object, Optional СТОЛБЕЦ, Optional LTWH As String = "ltw", Optional SP_Star As Boolean = False) '--------------------------------------------------------------------------------------- ' Purpose : п/пр. фильтрации по значению аргумента oBj.Value ' Notes1 : Опциональный аргумент СТОЛБЕЦ задаёт номер столбца, по которому нужно фильтровать. Если СТОЛБЕЦ = 0, то столбец определися автоматически ' Notes2 : Опциональный аргумент LTWH = "ltw" задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
If IsMissing(СТОЛБЕЦ) Then СТОЛБЕЦ = oBj.TopLeftCell.Column 'если СТОЛБЕЦ не задан, то фильтруем по столбцу ячейки, в которой расположен верхний левый угол oBj-фильтра If СТОЛБЕЦ < 0 Or СТОЛБЕЦ > Me.Columns.Count Then MsgBox "Столбца с номером " & СТОЛБЕЦ & " на листе нет!" & vbCrLf & _ "Исправьте код обработки события " & oBj.Name & "_Change": Exit Sub '===== выравниваем размеры и позицию oBj-фильтра по размерам и позиции ячейки в соответствии с аргументом LTWH With Cells(oBj.TopLeftCell.Row, oBj.TopLeftCell.Column) If UCase(LTWH) Like "*L*" Then oBj.Left = .Left + 1 ' сдвинуть левый край oBj к левому краю ячейки If UCase(LTWH) Like "*T*" Then oBj.Top = .Top + 1 ' сдвинуть верхний край oBj к верхнему краю ячейки If UCase(LTWH) Like "*W*" Then oBj.Width = .Width - 1 ' сделать ширину oBj = ширине ячейки If UCase(LTWH) Like "*H*" Then oBj.Height = .Height - 1 ' сделать высоту oBj = высоте ячейки If UCase(LTWH) Like "*R*" Then oBj.Left = .Left + .Width - oBj.Width ' сдвинуть правый край oBj к правому краю ячейки If UCase(LTWH) Like "*B*" Then oBj.Top = .Top + .Height - oBj.Height ' сдвинуть нижний край oBj к нижнему краю ячейки '.Select ' выбираем ячейку под текстбоксом (чтобы появились значки фильтров, если используется не автофильтр, а список) '===== проверяем, включен ли автофильтр на ЛИСТЕ If Me.AutoFilterMode = False Then MsgBox "Фильтр на листе не включен!": Exit Sub '===== проверяем, включен ли автофильтр в СТОЛБЦЕ If Intersect(ActiveSheet.Columns(СТОЛБЕЦ), ActiveSheet.AutoFilter.Range.Columns) Is Nothing Then _ MsgBox "Фильтр в столбце " & ColumnLetter(СТОЛБЕЦ) & " не включен!": Exit Sub '===== фильтруем в столбце СТОЛБЕЦ по содержимому oBj If SP_Star Then oBj.Value = Replace(oBj.Value, " ", "*") If oBj.Value <> "" Then Selection.AutoFilter Field:=СТОЛБЕЦ, Criteria1:="*" & oBj.Value & "*" ', Operator:=xlAnd Else Selection.AutoFilter Field:=СТОЛБЕЦ Range(ActiveCell.Address).Activate ' сдвинуть экран к выделенной ячейке End If .Value = oBj.Value ' поместить значение из текст-бокса в ячейку, в которой расположен его левый верхний угол End With oBj.Activate ' вернуть курсор в текстбокс End Sub
[/vba]
Можно. Не сложно. Но времени на то, чтобы делать файл-пример катастрофически нет... Там ничего сложного. Вы уж сами поправьте. Нужно всего лишь заменить процедуру Private Sub FLTR_by_Box на такую:
[vba]
Код
Private Sub FLTR_by_Box(oBj As Object, Optional СТОЛБЕЦ, Optional LTWH As String = "ltw", Optional SP_Star As Boolean = False) '--------------------------------------------------------------------------------------- ' Purpose : п/пр. фильтрации по значению аргумента oBj.Value ' Notes1 : Опциональный аргумент СТОЛБЕЦ задаёт номер столбца, по которому нужно фильтровать. Если СТОЛБЕЦ = 0, то столбец определися автоматически ' Notes2 : Опциональный аргумент LTWH = "ltw" задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
If IsMissing(СТОЛБЕЦ) Then СТОЛБЕЦ = oBj.TopLeftCell.Column 'если СТОЛБЕЦ не задан, то фильтруем по столбцу ячейки, в которой расположен верхний левый угол oBj-фильтра If СТОЛБЕЦ < 0 Or СТОЛБЕЦ > Me.Columns.Count Then MsgBox "Столбца с номером " & СТОЛБЕЦ & " на листе нет!" & vbCrLf & _ "Исправьте код обработки события " & oBj.Name & "_Change": Exit Sub '===== выравниваем размеры и позицию oBj-фильтра по размерам и позиции ячейки в соответствии с аргументом LTWH With Cells(oBj.TopLeftCell.Row, oBj.TopLeftCell.Column) If UCase(LTWH) Like "*L*" Then oBj.Left = .Left + 1 ' сдвинуть левый край oBj к левому краю ячейки If UCase(LTWH) Like "*T*" Then oBj.Top = .Top + 1 ' сдвинуть верхний край oBj к верхнему краю ячейки If UCase(LTWH) Like "*W*" Then oBj.Width = .Width - 1 ' сделать ширину oBj = ширине ячейки If UCase(LTWH) Like "*H*" Then oBj.Height = .Height - 1 ' сделать высоту oBj = высоте ячейки If UCase(LTWH) Like "*R*" Then oBj.Left = .Left + .Width - oBj.Width ' сдвинуть правый край oBj к правому краю ячейки If UCase(LTWH) Like "*B*" Then oBj.Top = .Top + .Height - oBj.Height ' сдвинуть нижний край oBj к нижнему краю ячейки '.Select ' выбираем ячейку под текстбоксом (чтобы появились значки фильтров, если используется не автофильтр, а список) '===== проверяем, включен ли автофильтр на ЛИСТЕ If Me.AutoFilterMode = False Then MsgBox "Фильтр на листе не включен!": Exit Sub '===== проверяем, включен ли автофильтр в СТОЛБЦЕ If Intersect(ActiveSheet.Columns(СТОЛБЕЦ), ActiveSheet.AutoFilter.Range.Columns) Is Nothing Then _ MsgBox "Фильтр в столбце " & ColumnLetter(СТОЛБЕЦ) & " не включен!": Exit Sub '===== фильтруем в столбце СТОЛБЕЦ по содержимому oBj If SP_Star Then oBj.Value = Replace(oBj.Value, " ", "*") If oBj.Value <> "" Then Selection.AutoFilter Field:=СТОЛБЕЦ, Criteria1:="*" & oBj.Value & "*" ', Operator:=xlAnd Else Selection.AutoFilter Field:=СТОЛБЕЦ Range(ActiveCell.Address).Activate ' сдвинуть экран к выделенной ячейке End If .Value = oBj.Value ' поместить значение из текст-бокса в ячейку, в которой расположен его левый верхний угол End With oBj.Activate ' вернуть курсор в текстбокс End Sub
Огромное тебе спс за такой замечательный автофильтр!)) Однако ты говорил что он с числовыми значениями не работает, что мне как раз и нужно. Ты вроде выложил код, но вроде он для текст боксов (могу ошибаться), а мне нужен для обычного Фильтр - ячейка. Если я этот код вставлю в лист, автофильтр по числовым значениям заработает?
P.S. Если не будет так сложно, можете пример скинуть?
Огромное тебе спс за такой замечательный автофильтр!)) Однако ты говорил что он с числовыми значениями не работает, что мне как раз и нужно. Ты вроде выложил код, но вроде он для текст боксов (могу ошибаться), а мне нужен для обычного Фильтр - ячейка. Если я этот код вставлю в лист, автофильтр по числовым значениям заработает?
P.S. Если не будет так сложно, можете пример скинуть?Timrei
Сообщение отредактировал Serge_007 - Пятница, 02.12.2022, 17:35
Я в личке уже ответил, что заниматься переделкой под фильтрацию цифр у меня сейчас абсолютно нет времени. Тем более, что не ясно, по какому условию фильтровать. А их с числами намного больше чем с текстом. Смысла фильтровать по числовым значениям с критерием "=" не вижу, честно говоря, т.к. числа в выпадающем списке автофильтра и так встают "по росту". Значит, нужно как-то менять интерфейс, чтобы можно было задавать условие фильтрации... А это уже не просто Текстбокс-фильтр получается, а целая конструкция как минимум из двух элементов управления для одного фильтра.
Я в личке уже ответил, что заниматься переделкой под фильтрацию цифр у меня сейчас абсолютно нет времени. Тем более, что не ясно, по какому условию фильтровать. А их с числами намного больше чем с текстом. Смысла фильтровать по числовым значениям с критерием "=" не вижу, честно говоря, т.к. числа в выпадающем списке автофильтра и так встают "по росту". Значит, нужно как-то менять интерфейс, чтобы можно было задавать условие фильтрации... А это уже не просто Текстбокс-фильтр получается, а целая конструкция как минимум из двух элементов управления для одного фильтра.Alex_ST
Даобрый день, не работает кнопка показать все, выдает ошибку макрос отсутствует или не включен, в макросах имена макроса кракозябра, подскажите как быть?
Даобрый день, не работает кнопка показать все, выдает ошибку макрос отсутствует или не включен, в макросах имена макроса кракозябра, подскажите как быть? kazlovichaliaksandr45
Если у Вас проблемы с копипастом кириллицы (бывает, особенно заметно на форумах), то назовите макрос латиницей. В оригинале макрос записан как: [vba]
Код
Sub Отобразить_всё() ' макрос для кнопки "Отобразить всё" - удобно для тех, кто до сих пор не вытащил соответствующую кнопку на панель управления If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End Sub
[/vba]измените имя, например, так:[vba]
Код
Sub Show_All() ' макрос для кнопки "Отобразить всё" - удобно для тех, кто до сих пор не вытащил соответствующую кнопку на панель управления If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End Sub
[/vba] и переназначьте в кнопках на листах
Если у Вас проблемы с копипастом кириллицы (бывает, особенно заметно на форумах), то назовите макрос латиницей. В оригинале макрос записан как: [vba]
Код
Sub Отобразить_всё() ' макрос для кнопки "Отобразить всё" - удобно для тех, кто до сих пор не вытащил соответствующую кнопку на панель управления If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End Sub
[/vba]измените имя, например, так:[vba]
Код
Sub Show_All() ' макрос для кнопки "Отобразить всё" - удобно для тех, кто до сих пор не вытащил соответствующую кнопку на панель управления If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End Sub