[offtop]Ну, если это не "the best!!!" , то это не для меня (RIBBON INTERFACE MUST DIE!) И вообще, в таком случае не замусоривайте топик! Здесь готовые решения, а не разработка [/offtop]
Цитата (RAN)
Правда "the best!!!" тут не рулит...
[offtop]Ну, если это не "the best!!!" , то это не для меня (RIBBON INTERFACE MUST DIE!) И вообще, в таком случае не замусоривайте топик! Здесь готовые решения, а не разработка [/offtop]Alex_ST
Действительно удобный фильтр! Но никак не могу приспособить его для своего файла. Ситуация следующая: Из первого листа книги макросом создается новый лист с именем (база + дата) на котором формируется таблица с данными по выборке. Поместил Ваш удобный автофильтр в отдельный модуль. Вопрос как заставить его работать на всех сгенерированных листах? Не силен в макросах, больше использовал формулы. Если не трудно необходим исходный код как такое осуществить. Буду очень благодарен!
Действительно удобный фильтр! Но никак не могу приспособить его для своего файла. Ситуация следующая: Из первого листа книги макросом создается новый лист с именем (база + дата) на котором формируется таблица с данными по выборке. Поместил Ваш удобный автофильтр в отдельный модуль. Вопрос как заставить его работать на всех сгенерированных листах? Не силен в макросах, больше использовал формулы. Если не трудно необходим исходный код как такое осуществить. Буду очень благодарен!Денис
Поместил Ваш удобный автофильтр в отдельный модуль
? Процедуры удобного автофильтра "заточены" под функционирование в модуле листа. И если уж выносить их кода-то в "общее место", так в модуль класса. И в Вашем случае программно придётся создавать не только новый лист, но и текстбоксы на нём. Тогда обработку их событий можно будет проводить в модуле класса. Я модули класса знаю очень слабо. Да и считаю, что это здесь абсолютно ни к чему, т.к. текстбоксов на каждом листе не огромное число, а всего несколько штук и для каждого из них совсем не трудно написать одну строчку вызова обработчика событий. Вам же проще не создавать новый лист, а копировать лист-шаблон (его можно сделать очень скрытым чтобы никто не попортил) с уже имеющимися на нём текстбоксами в нужных ячейках и процедурами обработки их событий. А уже после копирования листа-шаблона выгружать на него данные.
Если
Цитата (Денис)
Не силен в макросах
, то зачем
Цитата (Денис)
Поместил Ваш удобный автофильтр в отдельный модуль
? Процедуры удобного автофильтра "заточены" под функционирование в модуле листа. И если уж выносить их кода-то в "общее место", так в модуль класса. И в Вашем случае программно придётся создавать не только новый лист, но и текстбоксы на нём. Тогда обработку их событий можно будет проводить в модуле класса. Я модули класса знаю очень слабо. Да и считаю, что это здесь абсолютно ни к чему, т.к. текстбоксов на каждом листе не огромное число, а всего несколько штук и для каждого из них совсем не трудно написать одну строчку вызова обработчика событий. Вам же проще не создавать новый лист, а копировать лист-шаблон (его можно сделать очень скрытым чтобы никто не попортил) с уже имеющимися на нём текстбоксами в нужных ячейках и процедурами обработки их событий. А уже после копирования листа-шаблона выгружать на него данные.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 26.02.2013, 11:20
Alex_ST, здравствуйте. Понравился Ваш автофильтр. Подскажите, пожалуйста, как в нем "опционально" работают пробел и звездочка*. Как настроить, чтобы поиск выполнялся именно с учетом пробела?
Alex_ST, здравствуйте. Понравился Ваш автофильтр. Подскажите, пожалуйста, как в нем "опционально" работают пробел и звездочка*. Как настроить, чтобы поиск выполнялся именно с учетом пробела?Yuzhniy
' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки
[/vba] разве не достаточно? Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента Так сделано для примера в процедуре обработки[vba]
Код
Private Sub TextBox2_Change() Call FLTR_by_Box(TextBox2, , "LTW", True) End Sub
[/vba]
А комментария к Private Sub FLTR_by_Box[vba]
Код
' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки
[/vba] разве не достаточно? Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента Так сделано для примера в процедуре обработки[vba]
Код
Private Sub TextBox2_Change() Call FLTR_by_Box(TextBox2, , "LTW", True) End Sub
Alex_ST, достаточно будет поменять только на "Лист1.Отобразить_все" в следующих строках:
'<<<<<<<<<<<< ИНДИВИДУАЛЬНЫЕ для каждого текстбокса процедуры обработки событий изменения текста » Private Sub CoirbiFilterl_Change ()' фильтрация по скрытому столбцу 1 (А). 3 его ячейках прописаны Call FLTR_by_3ox(CoirbiFilterl, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать тек End Sub Private Sub Text3oxl_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнят Call FLTR_by_3ox(Text3oxl, , "LTWh", True)' столбец для фильтрации определить по положению т End Sub Private Sub Text3ox2_Change() Call FLTR_by_3ox(Text3ox2, , "LTW", True) End Sub Private Sub Text3ox3_Change() Call FLTR_by_3ox(Text3ox3) изменить на Call FLTR_by_3ox(Text3ox3, , "LTW", True) End Sub Private Sub Text3ox4_Change() Call FLTR_by_3ox(Text3ox4, , "") изменить на Call FLTR_by_3ox(Text3ox4, , "LTW", True, , "") End Sub '<<<<<<<<<<<< ОБЩИЕ для всех текстбоксов процедуры фильтрации и позиционирования »»»»»
Alex_ST, достаточно будет поменять только на "Лист1.Отобразить_все" в следующих строках:
'<<<<<<<<<<<< ИНДИВИДУАЛЬНЫЕ для каждого текстбокса процедуры обработки событий изменения текста » Private Sub CoirbiFilterl_Change ()' фильтрация по скрытому столбцу 1 (А). 3 его ячейках прописаны Call FLTR_by_3ox(CoirbiFilterl, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать тек End Sub Private Sub Text3oxl_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнят Call FLTR_by_3ox(Text3oxl, , "LTWh", True)' столбец для фильтрации определить по положению т End Sub Private Sub Text3ox2_Change() Call FLTR_by_3ox(Text3ox2, , "LTW", True) End Sub Private Sub Text3ox3_Change() Call FLTR_by_3ox(Text3ox3) изменить на Call FLTR_by_3ox(Text3ox3, , "LTW", True) End Sub Private Sub Text3ox4_Change() Call FLTR_by_3ox(Text3ox4, , "") изменить на Call FLTR_by_3ox(Text3ox4, , "LTW", True, , "") End Sub '<<<<<<<<<<<< ОБЩИЕ для всех текстбоксов процедуры фильтрации и позиционирования »»»»»Yuzhniy
У меня на работе сисадмины заблокировали скачивание файлов с макросами (собаки!). Поэтому посмотреть, по какому из вариантов Вы пытаетесь работать, я не могу, а смотрю код, записанный у меня на компьютере. А он может немного не совпадать с примером. Но даже по приведённому Вами фрагменту я вижу, что Вы что-то пытались самостоятельно менять, т.к. имена текстбоксов в процедурах обработки событий не совпадают с моими.
Читайте комментарии! Они написаны по-русски и, ИМХО, достаточно подробно (по крайней мере меня ещё никто никогда не упрекал в их недостаточной подробности). [vba]
Код
Private Sub FLTR_by_Box(oBj As Object, Optional СТОЛБЕЦ, Optional LTWH As String = "ltw", Optional SP_Star As Boolean = False)
[/vba] означает, что процедура FLTR_by_Box при её вызове должна получить следующие аргументы: oBj As Object - объект, который она обработает - ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ СТОЛБЕЦ - задаёт номер столбца, по которому нужно фильтровать - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ. Если СТОЛБЕЦ не задан, то столбец определится автоматически LTWH As String - задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' LTWH - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то будет выполнено выравнивание по умолчанию - "ltw" ' Поэтому если Вам нужно выравнивание по левой и верхней границам и растягивание на всю ширину ячейки, то "LTW" можно не писать. SP_Star As Boolean - задаёт менять или нет введённые пробелы на звёздочки - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то НЕ будут заменяться. Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True
У меня на работе сисадмины заблокировали скачивание файлов с макросами (собаки!). Поэтому посмотреть, по какому из вариантов Вы пытаетесь работать, я не могу, а смотрю код, записанный у меня на компьютере. А он может немного не совпадать с примером. Но даже по приведённому Вами фрагменту я вижу, что Вы что-то пытались самостоятельно менять, т.к. имена текстбоксов в процедурах обработки событий не совпадают с моими.
Читайте комментарии! Они написаны по-русски и, ИМХО, достаточно подробно (по крайней мере меня ещё никто никогда не упрекал в их недостаточной подробности). [vba]
Код
Private Sub FLTR_by_Box(oBj As Object, Optional СТОЛБЕЦ, Optional LTWH As String = "ltw", Optional SP_Star As Boolean = False)
[/vba] означает, что процедура FLTR_by_Box при её вызове должна получить следующие аргументы: oBj As Object - объект, который она обработает - ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ СТОЛБЕЦ - задаёт номер столбца, по которому нужно фильтровать - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ. Если СТОЛБЕЦ не задан, то столбец определится автоматически LTWH As String - задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' LTWH - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то будет выполнено выравнивание по умолчанию - "ltw" ' Поэтому если Вам нужно выравнивание по левой и верхней границам и растягивание на всю ширину ячейки, то "LTW" можно не писать. SP_Star As Boolean - задаёт менять или нет введённые пробелы на звёздочки - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то НЕ будут заменяться. Чтобы пробелы заменялись на звёздочки, нужно указывать его значение TrueAlex_ST
Нет, ничего не менял, т.к. я в макросах ноль. Вот что красным выделено, это, как я понял из комментария, нужно бы поменять. Но не знаю, вот спрашиваю.
Нет, ничего не менял, т.к. я в макросах ноль. Вот что красным выделено, это, как я понял из комментария, нужно бы поменять. Но не знаю, вот спрашиваю.Yuzhniy
в посте 28 написано Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента, а в посте 32 Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True. Просто опечатка или это о разных аргументах?
Там наверное совсем немного надо поменять. Если Вы могли бы написать, где конкретно (а то там 3 листа и, как я понимаю, 3 части макроса или 3 макроса) и как именно изменить. НЕОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ опустить... значит ли это просто удалить строки или что-то другое?
в посте 28 написано Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента, а в посте 32 Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True. Просто опечатка или это о разных аргументах?
Там наверное совсем немного надо поменять. Если Вы могли бы написать, где конкретно (а то там 3 листа и, как я понимаю, 3 части макроса или 3 макроса) и как именно изменить. НЕОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ опустить... значит ли это просто удалить строки или что-то другое?Yuzhniy
Да, а кто изменил названия элементов управления? У меня написано:[vba]
Код
Private Sub CombiFilter1_Change() ' фильтрация по скрытому столбцу 1 (А). В его ячейках прописаны формуды типа A3=B3&E3 ... Call FLTR_by_Box(CombiFilter1, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать текстбокс в ячейке ВЛЕВО (L), ВВЕРХ (T) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" End Sub Private Sub TextBox1_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнять текстбокс по ячейке Call FLTR_by_Box(TextBox1, , "LTWh", True) ' столбец для фильтрации определить по положению текстбокса, выравнивать его в ячейке ВЛЕВО (L), ВВЕРХ (T), по ширине ячейки (W) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" End Sub Private Sub TextBox2_Change() Call FLTR_by_Box(TextBox2, , "LTW", True) End Sub Private Sub TextBox3_Change() Call FLTR_by_Box(TextBox3) End Sub Private Sub TextBox4_Change() Call FLTR_by_Box(TextBox4, , "") End Sub
[/vba] А у Вас:[vba]
Код
Private Sub CoirbiFilterl_Change ()' фильтрация по скрытому столбцу 1 (А). 3 его ячейках прописаны Call FLTR_by_3ox(CoirbiFilterl, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать тек End Sub Private Sub Text3oxl_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнят Call FLTR_by_3ox(Text3oxl, , "LTWh", True)' столбец для фильтрации определить по положению т End Sub Private Sub Text3ox2_Change() Call FLTR_by_3ox(Text3ox2, , "LTW", True) End Sub Private Sub Text3ox3_Change() Call FLTR_by_3ox(Text3ox3) изменить на Call FLTR_by_3ox(Text3ox3, , "LTW", True) End Sub Private Sub Text3ox4_Change() Call FLTR_by_3ox(Text3ox4, , "") изменить на Call FLTR_by_3ox(Text3ox4, , "LTW", True, , "") End Sub
[/vba] Чувствуете разницу между TextBox1 и Text3oxl, между TextBox2 и Text3ox2 и т.д.? Ведь не хотите же Вы сказать, что в коде у Вас написано всё правильно, а при копировании само заменилось TextBox1 на Text3oxl ?
Цитата (Yuzhniy)
в посте 28 написано Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента, а в посте 32 Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True. Просто опечатка или это о разных аргументах?
А попробовать и выяснить очень трудно? Специально сейчас скачал пример из первого поста. Посмотрел. Там написано[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 задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
[/vba]Так трудно догадаться, что если аргумент, задающий менять или нет пробелы на звёздочки, равен False, т.е. ЛОЖЬ, т.е. НЕТ, то замена не происходит? А если True==ИСТИНА==ДА, то происходит? Тут никакого программирования знать не нужно. Достаточно просто логики и начального знания английского языка.
Цитата (Yuzhniy)
Нет, ничего не менял, т.к. я в макросах ноль
Да, а кто изменил названия элементов управления? У меня написано:[vba]
Код
Private Sub CombiFilter1_Change() ' фильтрация по скрытому столбцу 1 (А). В его ячейках прописаны формуды типа A3=B3&E3 ... Call FLTR_by_Box(CombiFilter1, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать текстбокс в ячейке ВЛЕВО (L), ВВЕРХ (T) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" End Sub Private Sub TextBox1_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнять текстбокс по ячейке Call FLTR_by_Box(TextBox1, , "LTWh", True) ' столбец для фильтрации определить по положению текстбокса, выравнивать его в ячейке ВЛЕВО (L), ВВЕРХ (T), по ширине ячейки (W) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" End Sub Private Sub TextBox2_Change() Call FLTR_by_Box(TextBox2, , "LTW", True) End Sub Private Sub TextBox3_Change() Call FLTR_by_Box(TextBox3) End Sub Private Sub TextBox4_Change() Call FLTR_by_Box(TextBox4, , "") End Sub
[/vba] А у Вас:[vba]
Код
Private Sub CoirbiFilterl_Change ()' фильтрация по скрытому столбцу 1 (А). 3 его ячейках прописаны Call FLTR_by_3ox(CoirbiFilterl, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать тек End Sub Private Sub Text3oxl_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнят Call FLTR_by_3ox(Text3oxl, , "LTWh", True)' столбец для фильтрации определить по положению т End Sub Private Sub Text3ox2_Change() Call FLTR_by_3ox(Text3ox2, , "LTW", True) End Sub Private Sub Text3ox3_Change() Call FLTR_by_3ox(Text3ox3) изменить на Call FLTR_by_3ox(Text3ox3, , "LTW", True) End Sub Private Sub Text3ox4_Change() Call FLTR_by_3ox(Text3ox4, , "") изменить на Call FLTR_by_3ox(Text3ox4, , "LTW", True, , "") End Sub
[/vba] Чувствуете разницу между TextBox1 и Text3oxl, между TextBox2 и Text3ox2 и т.д.? Ведь не хотите же Вы сказать, что в коде у Вас написано всё правильно, а при копировании само заменилось TextBox1 на Text3oxl ?
Цитата (Yuzhniy)
в посте 28 написано Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента, а в посте 32 Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True. Просто опечатка или это о разных аргументах?
А попробовать и выяснить очень трудно? Специально сейчас скачал пример из первого поста. Посмотрел. Там написано[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 задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
[/vba]Так трудно догадаться, что если аргумент, задающий менять или нет пробелы на звёздочки, равен False, т.е. ЛОЖЬ, т.е. НЕТ, то замена не происходит? А если True==ИСТИНА==ДА, то происходит? Тут никакого программирования знать не нужно. Достаточно просто логики и начального знания английского языка.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 12.03.2013, 20:55
На самом деле, в коде все правильно, и я действительно хочу сказать, что так вышло при копировании и вставке. Обратите внимание хотя бы на строку Private Sub CoirbiFilterl_Change в моем посте (в самом коде имеем CombiFilter1_Change); наверное НЕ ТРУДНО ДОГАДАТЬСЯ, что в совокупности с другими ошибками такой абсурд, как COIRBIFILTERL, не есть результат работы ума (даже если этот ум не силен в программировании, он скорее бы написал COME-WITH-ME-FILTER-ONE, чем COIRBIFILTERL?????). Как Вы думаете, Гуру?
Я выделил красным то, на что хочу обратить Ваше внимание, и спросил, достаточно ли будет это поменять. Спасибо, что заглянули в весь "код". Там ошибки. Но я повторяю, что в коде никто ничего не менял, это результат копирования и вставки; в коде все в порядке. Не будем тратить время на это. Более того, от Вас не было ни одного конкретного ответа на конкретный вопрос: это менять или не это? в каком из 3-х листов? что именно поменять? А то, что TRUE=ИСТИНА, FALSE=ЛОЖЬ, мы уже давно догадались. Спасибо, Гуру. И немного о логике. Если бы в коде макроса по чьей-либо вине на самом деле было столько ошибок, по одной в каждом слове, наверное вопрос звучал бы иначе, напр.: А ПОЧЕМУ АВТОФИЛЬТР НЕ РАБОТАЕТ? И напротив, было бы удивительно, что он все еще работает, а пользователь зациклился на звездочке и пробеле))
На самом деле, в коде все правильно, и я действительно хочу сказать, что так вышло при копировании и вставке. Обратите внимание хотя бы на строку Private Sub CoirbiFilterl_Change в моем посте (в самом коде имеем CombiFilter1_Change); наверное НЕ ТРУДНО ДОГАДАТЬСЯ, что в совокупности с другими ошибками такой абсурд, как COIRBIFILTERL, не есть результат работы ума (даже если этот ум не силен в программировании, он скорее бы написал COME-WITH-ME-FILTER-ONE, чем COIRBIFILTERL?????). Как Вы думаете, Гуру?
Я выделил красным то, на что хочу обратить Ваше внимание, и спросил, достаточно ли будет это поменять. Спасибо, что заглянули в весь "код". Там ошибки. Но я повторяю, что в коде никто ничего не менял, это результат копирования и вставки; в коде все в порядке. Не будем тратить время на это. Более того, от Вас не было ни одного конкретного ответа на конкретный вопрос: это менять или не это? в каком из 3-х листов? что именно поменять? А то, что TRUE=ИСТИНА, FALSE=ЛОЖЬ, мы уже давно догадались. Спасибо, Гуру. И немного о логике. Если бы в коде макроса по чьей-либо вине на самом деле было столько ошибок, по одной в каждом слове, наверное вопрос звучал бы иначе, напр.: А ПОЧЕМУ АВТОФИЛЬТР НЕ РАБОТАЕТ? И напротив, было бы удивительно, что он все еще работает, а пользователь зациклился на звездочке и пробеле))Yuzhniy
Век живи - век учись.
Сообщение отредактировал Yuzhniy - Среда, 13.03.2013, 18:15
от Вас не было ни одного конкретного ответа на конкретный вопрос
Ну как же ещё можно более конкретно ответить, если эти ответы:
Цитата (Alex_ST)
SP_Star As Boolean - задаёт менять или нет введённые пробелы на звёздочки - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то НЕ будут заменяться. Чтобы пробелы заменялись на звёздочки, нужно указывать его значение Tru
Цитата (Alex_ST)
если аргумент, задающий менять или нет пробелы на звёздочки, равен False, т.е. ЛОЖЬ, т.е. НЕТ, то замена не происходит
Вы считаете не конкретными?
А по замене чего-то на что-то в приведённом Вами коде я ничего ответить просто не смог, т.к. там ОГРОМНАЯ куча опечаток. Откуда я мог знать, что движок форума персонально Вас подсиживает и сам меняет буквы, которые Вы вводите правильно? :) При чём как хитро, гад, меняет! Ладно бы ещё 1 символ на другой, так ведь нет - меняет, например, CombiFilter1 (12 символов) на CoirbiFilterl (13 символов) !!!
Цитата (Yuzhniy)
от Вас не было ни одного конкретного ответа на конкретный вопрос
Ну как же ещё можно более конкретно ответить, если эти ответы:
Цитата (Alex_ST)
SP_Star As Boolean - задаёт менять или нет введённые пробелы на звёздочки - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то НЕ будут заменяться. Чтобы пробелы заменялись на звёздочки, нужно указывать его значение Tru
Цитата (Alex_ST)
если аргумент, задающий менять или нет пробелы на звёздочки, равен False, т.е. ЛОЖЬ, т.е. НЕТ, то замена не происходит
Вы считаете не конкретными?
А по замене чего-то на что-то в приведённом Вами коде я ничего ответить просто не смог, т.к. там ОГРОМНАЯ куча опечаток. Откуда я мог знать, что движок форума персонально Вас подсиживает и сам меняет буквы, которые Вы вводите правильно? :) При чём как хитро, гад, меняет! Ладно бы ещё 1 символ на другой, так ведь нет - меняет, например, CombiFilter1 (12 символов) на CoirbiFilterl (13 символов) !!!Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 13.03.2013, 21:04
Yuzhniy, читайте правила и оформляйте коды СООТВЕТСТВУЮЩИМИ тегами. А при ручной раскраске Вы допускаете ошибки в коде. Движок тут ни при чём
Yuzhniy, читайте правила и оформляйте коды СООТВЕТСТВУЮЩИМИ тегами. А при ручной раскраске Вы допускаете ошибки в коде. Движок тут ни при чём Serge_007
Alex_ST, При открытии общего доступа к файлу через Рецензирование-Защитить книгу и дать общий доступ выскакивает ошибка. Как победить данную проблему? Как должен быть преобразован код?
Alex_ST, При открытии общего доступа к файлу через Рецензирование-Защитить книгу и дать общий доступ выскакивает ошибка. Как победить данную проблему? Как должен быть преобразован код?essinyak
Сообщение отредактировал essinyak - Воскресенье, 26.05.2013, 12:22
essinyak, я уже отвечал Вам на Планете в личке, что ошибка возникает из-за невозможности программно позиционировать и изменить размеры OLE-объектов (Текстбоксов) в режиме общего доступа к файлу. Для того, чтобы не возникало ошибки при открытии общего доступа к файлу достаточно вставить обработчик ошибок в процедуру 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-фильтра On Error Resume Next 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 ' выбираем ячейку под текстбоксом (чтобы появились значки фильтров, если используется не автофильтр, а список) End With '===== проверяем, включен ли автофильтр на ЛИСТЕ 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 oBj.Activate ' вернуть курсор в текстбокс End Sub
[/vba]
Я только что проверил это решение. Открыл общий доступ к файлу с удобюным автофильтром у себя на компьютере и проверил работу фильтра - всё в норме.
essinyak, я уже отвечал Вам на Планете в личке, что ошибка возникает из-за невозможности программно позиционировать и изменить размеры OLE-объектов (Текстбоксов) в режиме общего доступа к файлу. Для того, чтобы не возникало ошибки при открытии общего доступа к файлу достаточно вставить обработчик ошибок в процедуру 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-фильтра On Error Resume Next 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 ' выбираем ячейку под текстбоксом (чтобы появились значки фильтров, если используется не автофильтр, а список) End With '===== проверяем, включен ли автофильтр на ЛИСТЕ 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 oBj.Activate ' вернуть курсор в текстбокс End Sub
[/vba]
Я только что проверил это решение. Открыл общий доступ к файлу с удобюным автофильтром у себя на компьютере и проверил работу фильтра - всё в норме.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Воскресенье, 26.05.2013, 15:25
Фильтр безусловно супер, но есть один вопросик - при вводе числовых значений в форму поиска - ищет только ячейки, где текст+ это число, а отдельно числа не находит! в чем проблема, объясните плиз!!я не силен в программировании, а такой фильтр для работы с цифрами позарез нужен
Фильтр безусловно супер, но есть один вопросик - при вводе числовых значений в форму поиска - ищет только ячейки, где текст+ это число, а отдельно числа не находит! в чем проблема, объясните плиз!!я не силен в программировании, а такой фильтр для работы с цифрами позарез нуженmasterlii