Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2009, 15:37   #1
НеВа6464
Пользователь
 
Регистрация: 16.05.2009
Сообщений: 64
По умолчанию колонки автофильтра

Активно использую на листах автофильтр.
Определить с помощью ВБА размер диапазона автофильтра уже умею, а определять номера колонок, к которым применяется в конкретных ситуациях автофильтр не умею.
Это возможно в ВБА? Как?

Собственно ноги растут от желания сделать кнопку "Откл_автофильтр".
Т.к. фильтровать приходится широкие таблицы по нескольким столбцам сразу. И вот потом в них отключать фильтр уже надоело. Хочется одним кликом.
Сделал сначала так, что тупо отключаются фильтры во всех столбцах. Остался осадок в душе. Хочется отключать фильтр только в тех столбцах, к которым он применён.
НеВа6464 вне форума Ответить с цитированием
Старый 28.11.2009, 16:00   #2
НеВа6464
Пользователь
 
Регистрация: 16.05.2009
Сообщений: 64
По умолчанию Прозрел

Нашёл требуемое свойство.
НеВа6464 вне форума Ответить с цитированием
Старый 27.02.2010, 05:03   #3
Рудзфельд
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 22
По умолчанию

Здравствуйте! Вот у меня такой код:

Range("A2:A65536").AutoFilter Field:=1, Criteria1:="3"

Теперь как можно заменить эти "тройки", допустим, на другое число после того, как применила автофильтр?
Пользователь

Последний раз редактировалось Рудзфельд; 27.02.2010 в 06:29.
Рудзфельд вне форума Ответить с цитированием
Старый 27.02.2010, 06:28   #4
Рудзфельд
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 22
По умолчанию

Всё. Разобралась. Вот код (если кому понадобится):

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 'отключаем реакцию на событие. Это нужно для того, чтобы событие Change сработало один раз

Range("A2:A65536").AutoFilter Field:=1, Criteria1:="3"

With Worksheets(1)
If (.AutoFilterMode = True) And (.FilterMode = True) Then
With .AutoFilter.Range.Columns(1)
For Each iCell In .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlVisible)
iCell.Value = "666"
Next
End With
End If
End With

If Лист1.FilterMode = True Then Лист1.ShowAllData

Application.EnableEvents = True 'включаем реакцию на событие
End Sub
Пользователь
Рудзфельд вне форума Ответить с цитированием
Старый 27.02.2010, 07:28   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

На сколько я понял из вышеприведенного кода, то нужно при изменении значения любой ячейки листа при помощи автофильтра заменить значения ячеек столбца "A", совпадающих с критерием фильтра (3) на заданное (666). Если так, то во-первых, зачем делать ссылку на лист? во-вторых, зачем проверять, установлен ли и применен ли автофильтр, если мы сами это делаем? и в-третьих, применять в данном случае цикл совершенно ни к чему (ну не люблю я их). Учитывая все сказанное, код можно "облегчить" до такого:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False: Application.EnableEvents = False
    [A2:A65536].AutoFilter Field:=1, Criteria1:="3": On Error Resume Next
    Range([A3], Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlVisible) = 666
    [A:A].AutoFilter
    Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 27.02.2010, 09:18   #6
Рудзфельд
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 22
По умолчанию

SAS888, Вы просто настоящий профессионал. Вы можете под моим ником увидеть, что я еще новичок :-)

А вообще я хотела вот что... В Лист1 содержится колонка из чисел (числа там повторяются и их может быть о-очень много). Допустим, число "3" встречается Rows.Count раз. И я бы хотела программно эту "тройку" заменить, к примеру, на 666. Сначала делала циклом For, но это оказалось о-очень долго. Потом подумала, может с использованием автофильтра получится быстрее. Но с автофильтром все равно быстрее в отличие от цикла, но все же приходится ждать.

Вот Вы говорите, что не любите циклы. Может можно как-нибудь эту задачу решить без циклов и автофильтров и чтобы работало быстро. Если такое возможно, не подскажете (или покажете) как? Буду рада :-)
Пользователь

Последний раз редактировалось Рудзфельд; 27.02.2010 в 10:48.
Рудзфельд вне форума Ответить с цитированием
Старый 01.03.2010, 08:23   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Может можно как-нибудь эту задачу решить без циклов и автофильтров и чтобы работало быстро.
Конечно можно. Например, так:
Код:
[A:A].Replace 3, 666, xlWhole
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 01.03.2010, 09:38   #8
Рудзфельд
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 22
По умолчанию

SAS888, спасибо Вам большое :-)
Пользователь
Рудзфельд вне форума Ответить с цитированием
Старый 02.03.2010, 06:50   #9
Рудзфельд
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 22
По умолчанию

А как можно подобно этому коду

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False: Application.EnableEvents = False
[A2:A65536].AutoFilter Field:=1, Criteria1:="3": On Error Resume Next
Range([A3], Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlVisibl e) = 5
[A:A].AutoFilter
Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub

удалять строки? Я просто понять не могу, в каком месте вписать команду Delete.
Пользователь
Рудзфельд вне форума Ответить с цитированием
Старый 02.03.2010, 07:06   #10
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно так:
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False: Application.EnableEvents = False
    Application.DisplayAlerts = False
    [A2:A65536].AutoFilter Field:=1, Criteria1:="3": On Error Resume Next
    Range([A3], Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlVisible).Delete
    [A:A].AutoFilter
    Application.ScreenUpdating = True: Application.EnableEvents = True
End Sub
Обратите внимание, что для удаления мы определяем не строки, а диапазон ячеек. Поэтому, чтобы Excel не задавал лишних вопросов, добавлен запрет вывода сообщений.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анализ состояния автофильтра НеВа6464 Microsoft Office Excel 3 20.11.2009 15:43
Не верная работа автофильтра DsXack Microsoft Office Excel 2 06.11.2009 08:50
Сохранение - восстановление автофильтра ALev Microsoft Office Excel 2 30.07.2009 17:02
Работа автофильтра в запороленном листе. Rom1k06 Microsoft Office Excel 2 23.04.2009 09:16
Глюк автофильтра Gorizont Microsoft Office Excel 8 04.08.2008 10:23