Ладно, давайте не будем пока углубляться в дебри моей задумки. Попробую поставить задачу более конкретно.
Итак есть файл example.xls. Начнем с одной кнопки - "Компьютеры". При нажатии на кнопку должен выполняться макрос по следующему примерному алгоритму: - определение "наименования" макроса - Если наименование макроса ВКЛ _то __- поиск строк в столбце С которых встречаются значения "Компьютеры" __- Если параметр скрытности найденных строк ИСТИНА ___то ___- изменить на ЛОЖЬ ___иначе ___- оставить ИСТИНА __и __задать "наименование" макросу ОТКЛ _иначе __- поиск строк в столбце С которых встречаются значения "Компьютеры" __- Если параметр скрытности найденных строк ИСТИНА ___то ___- оставить ИСТИНА ___иначе ___- изменить на ЛОЖЬ __и __задать "наименование" макросу ВКЛ
Если отображение "наименования" макроса на кнопке сложно, то в качестве "наименования" макроса можно попробовать использовать какую-либо ячейку. К примеру, в таблице будет выглядеть так:
| Компьютеры | кнопка | ОТКЛ |
Возможно, в моем алгоритме не хватает каких либо пунктов, типа "отключение обновления экрана" и тому подобные - тут я совсем бессилен, поэтому данные пункты на ваше усмотрение.
Ладно, давайте не будем пока углубляться в дебри моей задумки. Попробую поставить задачу более конкретно.
Итак есть файл example.xls. Начнем с одной кнопки - "Компьютеры". При нажатии на кнопку должен выполняться макрос по следующему примерному алгоритму: - определение "наименования" макроса - Если наименование макроса ВКЛ _то __- поиск строк в столбце С которых встречаются значения "Компьютеры" __- Если параметр скрытности найденных строк ИСТИНА ___то ___- изменить на ЛОЖЬ ___иначе ___- оставить ИСТИНА __и __задать "наименование" макросу ОТКЛ _иначе __- поиск строк в столбце С которых встречаются значения "Компьютеры" __- Если параметр скрытности найденных строк ИСТИНА ___то ___- оставить ИСТИНА ___иначе ___- изменить на ЛОЖЬ __и __задать "наименование" макросу ВКЛ
Если отображение "наименования" макроса на кнопке сложно, то в качестве "наименования" макроса можно попробовать использовать какую-либо ячейку. К примеру, в таблице будет выглядеть так:
| Компьютеры | кнопка | ОТКЛ |
Возможно, в моем алгоритме не хватает каких либо пунктов, типа "отключение обновления экрана" и тому подобные - тут я совсем бессилен, поэтому данные пункты на ваше усмотрение.amur84
Новый день. А что успел сделать ты?
Сообщение отредактировал amur84 - Вторник, 13.11.2012, 15:06
В данном файле скрытие и отображение строк производится путем выбора значения соответствующей ячейки - "+" или "-". В этом случае макрос должен реагировать на изменения в этой ячейке. Примерный алгоритм для тех же "Компьютеров" следующий:
- поиск строк в столбце С которых встречаются значения "Компьютеры" - Если значение в ячейке J2 равно "-" _то _- присвоить значение параметра скрытности найденых строк ИСТИНА _иначе __- присвоить значение параметра скрытности найденых строк ЛОЖЬ
Как вариант, представлен файл example2.xls.
В данном файле скрытие и отображение строк производится путем выбора значения соответствующей ячейки - "+" или "-". В этом случае макрос должен реагировать на изменения в этой ячейке. Примерный алгоритм для тех же "Компьютеров" следующий:
- поиск строк в столбце С которых встречаются значения "Компьютеры" - Если значение в ячейке J2 равно "-" _то _- присвоить значение параметра скрытности найденых строк ИСТИНА _иначе __- присвоить значение параметра скрытности найденых строк ЛОЖЬamur84
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> Range("J1").Address Then Exit Sub Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
Dim cell As Range, ra As Range, hidden_ra As Range Set ra = Range([A8], Range("A" & Rows.Count).End(xlUp)).Offset(, 2)
For Each cell In ra.Cells If cell.Value = "Компьютеры" Then If hidden_ra Is Nothing Then Set hidden_ra = cell Else Set hidden_ra = Union(cell, hidden_ra) Next cell
Application.Calculation = xlCalculationAutomatic End Sub
[/vba]
Но он только скрывает при изменениях в ячейке J2. И еще отрывает все другие строки... Как подкорректировать под мои нужды?
Для файла example2.xls нашел такой код: [vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> Range("J1").Address Then Exit Sub Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
Dim cell As Range, ra As Range, hidden_ra As Range Set ra = Range([A8], Range("A" & Rows.Count).End(xlUp)).Offset(, 2)
For Each cell In ra.Cells If cell.Value = "Компьютеры" Then If hidden_ra Is Nothing Then Set hidden_ra = cell Else Set hidden_ra = Union(cell, hidden_ra) Next cell
В принципе - то что нужно. Мне только осталось разобраться в коде, чтобы править его под другие базы и значения. Возможно ли расписать строки кода - на что они влияют?
Quote (AlexM)
Может так подойдет?
В принципе - то что нужно. Мне только осталось разобраться в коде, чтобы править его под другие базы и значения. Возможно ли расписать строки кода - на что они влияют?amur84
Можно Макрос обрабатывает событие изменений на листе (вставляется в модуль листа) [vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Range("D1:D2, J1:J2"), Target) Is Nothing Then 'Если изменяемая ячейка попадает в указанные диапазоны, то присваиваем переменным значения Tip = Target.Offset(0, -1) 'Tip - понятно и есть Тип (значение левой ячейки от изменяемой) cTip = IIf(Target.Column = 4, 2, 3) 'CTip - если изменяемая ячейка в 4-ом столбце, то 2, иначе 3 (это номера столбцов в таблице с типом и подтипом) False_True = IIf(Target = "+", False, True) 'False_True - В зависимости от того что в ячейке присваивается соответствующее значение False или True iHidden 'Запуск макроса обработки строк End If End Sub
[/vba]
[vba]
Code
Public Tip As String Public False_True As Boolean Public cTip As Integer 'Описание переменных Public Sub iHidden() Hidden_Row = 65536 - Columns(1).SpecialCells(xlVisible).Count 'Счет скрытых строк For i = 6 To Range("A5").End(xlDown).Row + Hidden_Row 'Цикл с 6 ячейки до последней заполненной видимой плюс навидимые строки If Cells(i, cTip) = Tip Then Rows(i).EntireRow.Hidden = False_True 'скрытие или отображение строк в зависимости от значений переменных Next i End Sub
[/vba]
Можно Макрос обрабатывает событие изменений на листе (вставляется в модуль листа) [vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Range("D1:D2, J1:J2"), Target) Is Nothing Then 'Если изменяемая ячейка попадает в указанные диапазоны, то присваиваем переменным значения Tip = Target.Offset(0, -1) 'Tip - понятно и есть Тип (значение левой ячейки от изменяемой) cTip = IIf(Target.Column = 4, 2, 3) 'CTip - если изменяемая ячейка в 4-ом столбце, то 2, иначе 3 (это номера столбцов в таблице с типом и подтипом) False_True = IIf(Target = "+", False, True) 'False_True - В зависимости от того что в ячейке присваивается соответствующее значение False или True iHidden 'Запуск макроса обработки строк End If End Sub
[/vba]
[vba]
Code
Public Tip As String Public False_True As Boolean Public cTip As Integer 'Описание переменных Public Sub iHidden() Hidden_Row = 65536 - Columns(1).SpecialCells(xlVisible).Count 'Счет скрытых строк For i = 6 To Range("A5").End(xlDown).Row + Hidden_Row 'Цикл с 6 ячейки до последней заполненной видимой плюс навидимые строки If Cells(i, cTip) = Tip Then Rows(i).EntireRow.Hidden = False_True 'скрытие или отображение строк в зависимости от значений переменных Next i End Sub
Спасибо большое за Ваш труд! Здесь описание переменных, как я понимаю, происходит одинаково для каждого листа всей книги. А если в другом листе, к примеру, столбцы с типами/подтипами будут смещены от исходного положения? Если количество типов/подтипов будет более двух, тогда код придется менять практически полностью? И описание переменных будет другое, и строка "сTip = ....." будет иначе выглядеть. Верно?
В принципе более универсального кода пока не прошу. Будем с этим пытаться извратиться.
Но вот вместе с Tviga мы выяснили, что "Автофильтр" 2003 версии отличается от него же в версиях 2007 и выше. И в версиях 2007 и выше можно использовать "галочки" для отображения/скрытия строк, что и требуется выполнять запрашиваемым мной макросом. Поэтому возникает вопрос - можно ли с помощью простого кода в 2003 реализовать автофильтр как в 2007? Или в данном случае код будет довольно не "простой"?
Quote (AlexM)
Можно
Спасибо большое за Ваш труд! Здесь описание переменных, как я понимаю, происходит одинаково для каждого листа всей книги. А если в другом листе, к примеру, столбцы с типами/подтипами будут смещены от исходного положения? Если количество типов/подтипов будет более двух, тогда код придется менять практически полностью? И описание переменных будет другое, и строка "сTip = ....." будет иначе выглядеть. Верно?
В принципе более универсального кода пока не прошу. Будем с этим пытаться извратиться.
Но вот вместе с Tviga мы выяснили, что "Автофильтр" 2003 версии отличается от него же в версиях 2007 и выше. И в версиях 2007 и выше можно использовать "галочки" для отображения/скрытия строк, что и требуется выполнять запрашиваемым мной макросом. Поэтому возникает вопрос - можно ли с помощью простого кода в 2003 реализовать автофильтр как в 2007? Или в данном случае код будет довольно не "простой"?amur84
Новый день. А что успел сделать ты?
Сообщение отредактировал amur84 - Вторник, 13.11.2012, 18:08
вот поэтому я вам и говорила - выкладывайте базу ту - которая есть. Что бы люди не тратили время на написание кодов, которые потом придется переписывать.
может есть смысл просто переустановить эксель. ??
Quote (amur84)
А если в другой книге, к примеру
вот поэтому я вам и говорила - выкладывайте базу ту - которая есть. Что бы люди не тратили время на написание кодов, которые потом придется переписывать.
может есть смысл просто переустановить эксель. ??Tviga
Немного изменил код. Теперь событие обрабатывается в модуле "Эта книга" и теперь нет надобности коды событий вставлять в модули листов. Введена еще одна переменная, передающая название листа, на котором произошли изменения.
Если на листах таблицы отличаются, то и под это можно сделать макрос, но лучше стандартизировать таблицу хотя бы в пределах одной книги.
Немного изменил код. Теперь событие обрабатывается в модуле "Эта книга" и теперь нет надобности коды событий вставлять в модули листов. Введена еще одна переменная, передающая название листа, на котором произошли изменения.
Если на листах таблицы отличаются, то и под это можно сделать макрос, но лучше стандартизировать таблицу хотя бы в пределах одной книги.AlexM
Но таблицы будут отличаться и поэтому придется вставлять коды событий в модули листов. Вот я уже ответил сам себе на свои вопросы в посте 31. В приложенном файле на листе 3 реализовал и смещение столбцов с типами, и добавление еще одного подтипа.
Начал дальше осваивать и на листе 5 попытался написать тоже самое, но для столбцов. Событие не происходит и ошибки не выдает. Смотрю уже около получаса на код, не пойму где ошибся. А на листе 4 еще и по столбцам выполнил скрытие.
Создавал темку не для получения готового кода, а для того, чтобы разобраться, как его писать на данную функцию. Нужен был начальный код для примера, так как я не силен в названиях функций. В принципе тема исчерпана. Спасибо откликнувшимся, в частности AlexM. Файл прикладываю для примера и дальнейшей критики, если кому интересно.
Quote (AlexM)
Немного изменил код.
Спасибо. Посмотрел, приму к сведению.
Но таблицы будут отличаться и поэтому придется вставлять коды событий в модули листов. Вот я уже ответил сам себе на свои вопросы в посте 31. В приложенном файле на листе 3 реализовал и смещение столбцов с типами, и добавление еще одного подтипа.
Начал дальше осваивать и на листе 5 попытался написать тоже самое, но для столбцов. Событие не происходит и ошибки не выдает. Смотрю уже около получаса на код, не пойму где ошибся. А на листе 4 еще и по столбцам выполнил скрытие.
Создавал темку не для получения готового кода, а для того, чтобы разобраться, как его писать на данную функцию. Нужен был начальный код для примера, так как я не силен в названиях функций. В принципе тема исчерпана. Спасибо откликнувшимся, в частности AlexM. Файл прикладываю для примера и дальнейшей критики, если кому интересно.amur84