Оффтоп: Ну, если это не "the best!!!" , то это не для меня (RIBBON INTERFACE MUST DIE!) И вообще, в таком случае не замусоривайте топик! Здесь готовые решения, а не разработка
Цитата (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 задаёт менять или нет введённые пробелы на звёздочки
разве не достаточно? Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента Так сделано для примера в процедуре обработки
' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки
разве не достаточно? Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента Так сделано для примера в процедуре обработки
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
У меня на работе сисадмины заблокировали скачивание файлов с макросами (собаки!). Поэтому посмотреть, по какому из вариантов Вы пытаетесь работать, я не могу, а смотрю код, записанный у меня на компьютере. А он может немного не совпадать с примером. Но даже по приведённому Вами фрагменту я вижу, что Вы что-то пытались самостоятельно менять, т.к. имена текстбоксов в процедурах обработки событий не совпадают с моими.
Читайте комментарии! Они написаны по-русски и, ИМХО, достаточно подробно (по крайней мере меня ещё никто никогда не упрекал в их недостаточной подробности).
означает, что процедура FLTR_by_Box при её вызове должна получить следующие аргументы: oBj As Object - объект, который она обработает - ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ СТОЛБЕЦ - задаёт номер столбца, по которому нужно фильтровать - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ. Если СТОЛБЕЦ не задан, то столбец определится автоматически LTWH As String - задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' LTWH - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то будет выполнено выравнивание по умолчанию - "ltw" ' Поэтому если Вам нужно выравнивание по левой и верхней границам и растягивание на всю ширину ячейки, то "LTW" можно не писать. SP_Star As Boolean - задаёт менять или нет введённые пробелы на звёздочки - НЕ ОБЯЗАТЕЛЬНЫЙ АРГУМЕНТ - если его опустить, то НЕ будут заменяться. Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True
У меня на работе сисадмины заблокировали скачивание файлов с макросами (собаки!). Поэтому посмотреть, по какому из вариантов Вы пытаетесь работать, я не могу, а смотрю код, записанный у меня на компьютере. А он может немного не совпадать с примером. Но даже по приведённому Вами фрагменту я вижу, что Вы что-то пытались самостоятельно менять, т.к. имена текстбоксов в процедурах обработки событий не совпадают с моими.
Читайте комментарии! Они написаны по-русски и, ИМХО, достаточно подробно (по крайней мере меня ещё никто никогда не упрекал в их недостаточной подробности).
означает, что процедура 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
Да, а кто изменил названия элементов управления? У меня написано:
PrivateSub CombiFilter1_Change() ' фильтрация по скрытому столбцу 1 (А). В его ячейках прописаны формуды типа A3=B3&E3 ... Call FLTR_by_Box(CombiFilter1, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать текстбокс в ячейке ВЛЕВО (L), ВВЕРХ (T) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" EndSub PrivateSub TextBox1_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнять текстбокс по ячейке Call FLTR_by_Box(TextBox1, , "LTWh", True) ' столбец для фильтрации определить по положению текстбокса, выравнивать его в ячейке ВЛЕВО (L), ВВЕРХ (T), по ширине ячейки (W) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" EndSub PrivateSub TextBox2_Change() Call FLTR_by_Box(TextBox2, , "LTW", True) EndSub PrivateSub TextBox3_Change() Call FLTR_by_Box(TextBox3) EndSub PrivateSub TextBox4_Change() Call FLTR_by_Box(TextBox4, , "") EndSub
А у Вас:
PrivateSub CoirbiFilterl_Change ()' фильтрация по скрытому столбцу 1 (А). 3 его ячейках прописаны Call FLTR_by_3ox(CoirbiFilterl, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать тек EndSub PrivateSub Text3oxl_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнят Call FLTR_by_3ox(Text3oxl, , "LTWh", True)' столбец для фильтрации определить по положению т EndSub PrivateSub Text3ox2_Change() Call FLTR_by_3ox(Text3ox2, , "LTW", True) EndSub PrivateSub Text3ox3_Change() Call FLTR_by_3ox(Text3ox3) изменить на Call FLTR_by_3ox(Text3ox3, , "LTW", True) EndSub PrivateSub Text3ox4_Change() Call FLTR_by_3ox(Text3ox4, , "") изменить на Call FLTR_by_3ox(Text3ox4, , "LTW", True, , "") EndSub
Чувствуете разницу между TextBox1 и Text3oxl, между TextBox2 и Text3ox2 и т.д.? Ведь не хотите же Вы сказать, что в коде у Вас написано всё правильно, а при копировании само заменилось TextBox1 на Text3oxl ?
Цитата (Yuzhniy писал(а)):
в посте 28 написано Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента, а в посте 32 Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True. Просто опечатка или это о разных аргументах?
А попробовать и выяснить очень трудно? Специально сейчас скачал пример из первого поста. Посмотрел. Там написано
PrivateSub FLTR_by_Box(oBj AsObject, Optional СТОЛБЕЦ, Optional LTWH AsString = "ltw", Optional SP_Star AsBoolean = False) '--------------------------------------------------------------------------------------- ' Purpose : п/пр. фильтрации по значению аргумента oBj.Value ' Notes1 : Опциональный аргумент СТОЛБЕЦ задаёт номер столбца, по которому нужно фильтровать. Если СТОЛБЕЦ = 0, то столбец определися автоматически ' Notes2 : Опциональный аргумент LTWH = "ltw" задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
Так трудно догадаться, что если аргумент, задающий менять или нет пробелы на звёздочки, равен False, т.е. ЛОЖЬ, т.е. НЕТ, то замена не происходит? А если True==ИСТИНА==ДА, то происходит? Тут никакого программирования знать не нужно. Достаточно просто логики и начального знания английского языка.
Цитата (Yuzhniy писал(а)):
Нет, ничего не менял, т.к. я в макросах ноль
Да, а кто изменил названия элементов управления? У меня написано:
PrivateSub CombiFilter1_Change() ' фильтрация по скрытому столбцу 1 (А). В его ячейках прописаны формуды типа A3=B3&E3 ... Call FLTR_by_Box(CombiFilter1, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать текстбокс в ячейке ВЛЕВО (L), ВВЕРХ (T) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" EndSub PrivateSub TextBox1_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнять текстбокс по ячейке Call FLTR_by_Box(TextBox1, , "LTWh", True) ' столбец для фильтрации определить по положению текстбокса, выравнивать его в ячейке ВЛЕВО (L), ВВЕРХ (T), по ширине ячейки (W) и по её высоте (H) и заменять каждый введённый "пробел" на "звёздочку" EndSub PrivateSub TextBox2_Change() Call FLTR_by_Box(TextBox2, , "LTW", True) EndSub PrivateSub TextBox3_Change() Call FLTR_by_Box(TextBox3) EndSub PrivateSub TextBox4_Change() Call FLTR_by_Box(TextBox4, , "") EndSub
А у Вас:
PrivateSub CoirbiFilterl_Change ()' фильтрация по скрытому столбцу 1 (А). 3 его ячейках прописаны Call FLTR_by_3ox(CoirbiFilterl, 1, "LTh", True) ' фильтровать в столбце 1 (А), выравнивать тек EndSub PrivateSub Text3oxl_Change() ' фильтровать по столбцу, в котором расположен текстбокс и выровнят Call FLTR_by_3ox(Text3oxl, , "LTWh", True)' столбец для фильтрации определить по положению т EndSub PrivateSub Text3ox2_Change() Call FLTR_by_3ox(Text3ox2, , "LTW", True) EndSub PrivateSub Text3ox3_Change() Call FLTR_by_3ox(Text3ox3) изменить на Call FLTR_by_3ox(Text3ox3, , "LTW", True) EndSub PrivateSub Text3ox4_Change() Call FLTR_by_3ox(Text3ox4, , "") изменить на Call FLTR_by_3ox(Text3ox4, , "LTW", True, , "") EndSub
Чувствуете разницу между TextBox1 и Text3oxl, между TextBox2 и Text3ox2 и т.д.? Ведь не хотите же Вы сказать, что в коде у Вас написано всё правильно, а при копировании само заменилось TextBox1 на Text3oxl ?
Цитата (Yuzhniy писал(а)):
в посте 28 написано Если не хотите, чтобы заменяло пробел на звёздочку, то прописывайте а процедурах вызова значение True для этого аргумента, а в посте 32 Чтобы пробелы заменялись на звёздочки, нужно указывать его значение True. Просто опечатка или это о разных аргументах?
А попробовать и выяснить очень трудно? Специально сейчас скачал пример из первого поста. Посмотрел. Там написано
PrivateSub FLTR_by_Box(oBj AsObject, Optional СТОЛБЕЦ, Optional LTWH AsString = "ltw", Optional SP_Star AsBoolean = False) '--------------------------------------------------------------------------------------- ' Purpose : п/пр. фильтрации по значению аргумента oBj.Value ' Notes1 : Опциональный аргумент СТОЛБЕЦ задаёт номер столбца, по которому нужно фильтровать. Если СТОЛБЕЦ = 0, то столбец определися автоматически ' Notes2 : Опциональный аргумент LTWH = "ltw" задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
Так трудно догадаться, что если аргумент, задающий менять или нет пробелы на звёздочки, равен 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:
PrivateSub FLTR_by_Box(oBj AsObject, Optional СТОЛБЕЦ, Optional LTWH AsString = "ltw", Optional SP_Star AsBoolean = False) '--------------------------------------------------------------------------------------- ' Purpose : п/пр. фильтрации по значению аргумента oBj.Value ' Notes1 : Опциональный аргумент СТОЛБЕЦ задаёт номер столбца, по которому нужно фильтровать. Если СТОЛБЕЦ = 0, то столбец определися автоматически ' Notes2 : Опциональный аргумент LTWH = "ltw" задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
IfIsMissing(СТОЛБЕЦ) Then СТОЛБЕЦ = oBj.TopLeftCell.Column 'если СТОЛБЕЦ не задан, то фильтруем по столбцу ячейки, в которой расположен верхний левый угол oBj-фильтра OnErrorResumeNext If СТОЛБЕЦ < 0Or СТОЛБЕЦ > Me.Columns.Count Then MsgBox "Столбца с номером " & СТОЛБЕЦ & " на листе нет!" & vbCrLf & _ "Исправьте код обработки события " & oBj.Name & "_Change": ExitSub '===== выравниваем размеры и позицию oBj-фильтра по размерам и позиции ячейки в соответствии с аргументом LTWH With Cells(oBj.TopLeftCell.Row, oBj.TopLeftCell.Column) IfUCase(LTWH) Like"*L*"Then oBj.Left = .Left + 1' сдвинуть левый край oBj к левому краю ячейки IfUCase(LTWH) Like"*T*"Then oBj.Top = .Top + 1' сдвинуть верхний край oBj к верхнему краю ячейки IfUCase(LTWH) Like"*W*"Then oBj.Width = .Width - 1' сделать ширину oBj = ширине ячейки IfUCase(LTWH) Like"*H*"Then oBj.Height = .Height - 1' сделать высоту oBj = высоте ячейки IfUCase(LTWH) Like"*R*"Then oBj.Left = .Left + .Width - oBj.Width ' сдвинуть правый край oBj к правому краю ячейки IfUCase(LTWH) Like"*B*"Then oBj.Top = .Top + .Height - oBj.Height ' сдвинуть нижний край oBj к нижнему краю ячейки '.Select ' выбираем ячейку под текстбоксом (чтобы появились значки фильтров, если используется не автофильтр, а список) EndWith '===== проверяем, включен ли автофильтр на ЛИСТЕ If Me.AutoFilterMode = FalseThen MsgBox "Фильтр на листе не включен!": ExitSub '===== проверяем, включен ли автофильтр в СТОЛБЦЕ If Intersect(ActiveSheet.Columns(СТОЛБЕЦ), ActiveSheet.AutoFilter.Range.Columns) IsNothingThen _
MsgBox "Фильтр в столбце " & ColumnLetter(СТОЛБЕЦ) & " не включен!": ExitSub '===== фильтруем в столбце СТОЛБЕЦ по содержимому 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 ' сдвинуть экран к выделенной ячейке EndIf
oBj.Activate ' вернуть курсор в текстбокс EndSub
Я только что проверил это решение. Открыл общий доступ к файлу с удобюным автофильтром у себя на компьютере и проверил работу фильтра - всё в норме.
essinyak, я уже отвечал Вам на Планете в личке, что ошибка возникает из-за невозможности программно позиционировать и изменить размеры OLE-объектов (Текстбоксов) в режиме общего доступа к файлу. Для того, чтобы не возникало ошибки при открытии общего доступа к файлу достаточно вставить обработчик ошибок в процедуру FLTR_by_Box:
PrivateSub FLTR_by_Box(oBj AsObject, Optional СТОЛБЕЦ, Optional LTWH AsString = "ltw", Optional SP_Star AsBoolean = False) '--------------------------------------------------------------------------------------- ' Purpose : п/пр. фильтрации по значению аргумента oBj.Value ' Notes1 : Опциональный аргумент СТОЛБЕЦ задаёт номер столбца, по которому нужно фильтровать. Если СТОЛБЕЦ = 0, то столбец определися автоматически ' Notes2 : Опциональный аргумент LTWH = "ltw" задаёт параметры выравнивания oBj относительно ячейки: ' L - по левому краю, T - по верхнему краю, W - по ширине, H - по высоте, R - по правому краю, B - по нижнему краю ' Если выравнивание не требуется, то можно задать любой стринг, не содержащий этих ЛАТИНСКИХ букв или пустой стринг "" ' Notes3 : Опциональный аргумент SP_Star = False задаёт менять или нет введённые пробелы на звёздочки '---------------------------------------------------------------------------------------
IfIsMissing(СТОЛБЕЦ) Then СТОЛБЕЦ = oBj.TopLeftCell.Column 'если СТОЛБЕЦ не задан, то фильтруем по столбцу ячейки, в которой расположен верхний левый угол oBj-фильтра OnErrorResumeNext If СТОЛБЕЦ < 0Or СТОЛБЕЦ > Me.Columns.Count Then MsgBox "Столбца с номером " & СТОЛБЕЦ & " на листе нет!" & vbCrLf & _ "Исправьте код обработки события " & oBj.Name & "_Change": ExitSub '===== выравниваем размеры и позицию oBj-фильтра по размерам и позиции ячейки в соответствии с аргументом LTWH With Cells(oBj.TopLeftCell.Row, oBj.TopLeftCell.Column) IfUCase(LTWH) Like"*L*"Then oBj.Left = .Left + 1' сдвинуть левый край oBj к левому краю ячейки IfUCase(LTWH) Like"*T*"Then oBj.Top = .Top + 1' сдвинуть верхний край oBj к верхнему краю ячейки IfUCase(LTWH) Like"*W*"Then oBj.Width = .Width - 1' сделать ширину oBj = ширине ячейки IfUCase(LTWH) Like"*H*"Then oBj.Height = .Height - 1' сделать высоту oBj = высоте ячейки IfUCase(LTWH) Like"*R*"Then oBj.Left = .Left + .Width - oBj.Width ' сдвинуть правый край oBj к правому краю ячейки IfUCase(LTWH) Like"*B*"Then oBj.Top = .Top + .Height - oBj.Height ' сдвинуть нижний край oBj к нижнему краю ячейки '.Select ' выбираем ячейку под текстбоксом (чтобы появились значки фильтров, если используется не автофильтр, а список) EndWith '===== проверяем, включен ли автофильтр на ЛИСТЕ If Me.AutoFilterMode = FalseThen MsgBox "Фильтр на листе не включен!": ExitSub '===== проверяем, включен ли автофильтр в СТОЛБЦЕ If Intersect(ActiveSheet.Columns(СТОЛБЕЦ), ActiveSheet.AutoFilter.Range.Columns) IsNothingThen _
MsgBox "Фильтр в столбце " & ColumnLetter(СТОЛБЕЦ) & " не включен!": ExitSub '===== фильтруем в столбце СТОЛБЕЦ по содержимому 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 ' сдвинуть экран к выделенной ячейке EndIf
oBj.Activate ' вернуть курсор в текстбокс EndSub
Я только что проверил это решение. Открыл общий доступ к файлу с удобюным автофильтром у себя на компьютере и проверил работу фильтра - всё в норме.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Воскресенье, 26.05.2013, 15:25
Фильтр безусловно супер, но есть один вопросик - при вводе числовых значений в форму поиска - ищет только ячейки, где текст+ это число, а отдельно числа не находит! в чем проблема, объясните плиз!!я не силен в программировании, а такой фильтр для работы с цифрами позарез нужен
Фильтр безусловно супер, но есть один вопросик - при вводе числовых значений в форму поиска - ищет только ячейки, где текст+ это число, а отдельно числа не находит! в чем проблема, объясните плиз!!я не силен в программировании, а такой фильтр для работы с цифрами позарез нуженmasterlii