Год назад создал базу данных. Из нее по критериям вывожу данные в таблицу (во вложении) и перед выгрузкой листа в отдельный файл макросом скрываю пустые строки. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range, R& R = 14 Range("14:20").EntireRow.Hidden = False For Each c In Range("A14:A20") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
[/vba]
В течение года были определенные неудобства с файлом: 1. При добавлении строки макрос автоматически скрывает строку и приходится отображать строку, чтобы потом добавить номер строки таблицы, и макрос не скрывает строку. 2. Любые действия (например, занесение данных в таблицу) срабатывает автоматический макрос (т.е. разворачивает и скрывает строки). Ну и подтормаживает из-за этого. 3. Если ошибочно занес информацию и нужно вернуть прежнее значение с макросом нет такой возможности сделать например нажатием Ctrl+Z.
Подскажите, пожалуйста, как это можно вылечить?
Добрый вечер, участникам форума!
В очередной раз с просьбой подпилить макрос.
Год назад создал базу данных. Из нее по критериям вывожу данные в таблицу (во вложении) и перед выгрузкой листа в отдельный файл макросом скрываю пустые строки. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range, R& R = 14 Range("14:20").EntireRow.Hidden = False For Each c In Range("A14:A20") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
[/vba]
В течение года были определенные неудобства с файлом: 1. При добавлении строки макрос автоматически скрывает строку и приходится отображать строку, чтобы потом добавить номер строки таблицы, и макрос не скрывает строку. 2. Любые действия (например, занесение данных в таблицу) срабатывает автоматический макрос (т.е. разворачивает и скрывает строки). Ну и подтормаживает из-за этого. 3. Если ошибочно занес информацию и нужно вернуть прежнее значение с макросом нет такой возможности сделать например нажатием Ctrl+Z.
Подскажите, пожалуйста, как это можно вылечить?Anis625
Я За этот вариант и даже попытался это сделать вчера до размещения темы, но в Alt+F8 он даже не отображается. То есть как я понимаю это автоматический макрос. Может [vba]
Код
(ByVal Target As Range)
[/vba] в макросе делает его таким невидимым?
Pelena,
Я За этот вариант и даже попытался это сделать вчера до размещения темы, но в Alt+F8 он даже не отображается. То есть как я понимаю это автоматический макрос. Может [vba]
Код
(ByVal Target As Range)
[/vba] в макросе делает его таким невидимым?Anis625
перед выгрузкой листа в отдельный файл макросом скрываю пустые строки
Макрос работает не "перед выгрузкой", а при любом изменении на листе. Определитесь - Вам как нужно Судя по формулам, Вы тянете по номеру данные из другого листа, тогда как вы вводите номер в А, если у Вас скрыты незаполненные строки? Сначала их показываете, а потом дописываете новый номер? Тогда зачем их скрывать после каждого телодвижения? Похоже, что нужно перекинуть макрос из Sub Worksheet_Change в обычный Sub и действительно запускать его только перед выгрузкой А если все-таки догадка неверна, то такой вариант [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count >= Columns.Count Then Exit Sub r0_ = 11 n_ = Cells(Rows.Count, 2).End(3).Row - r0_ + 1 If Not Intersect(Target, Cells(r0_, 1).Resize(n_)) Is Nothing Then For Each a0_ In Cells(r0_, 1).Resize(n_) If a0_ = "" Then a0_.Rows.EntireRow.Hidden = True End If Next a0_ End If End Sub
перед выгрузкой листа в отдельный файл макросом скрываю пустые строки
Макрос работает не "перед выгрузкой", а при любом изменении на листе. Определитесь - Вам как нужно Судя по формулам, Вы тянете по номеру данные из другого листа, тогда как вы вводите номер в А, если у Вас скрыты незаполненные строки? Сначала их показываете, а потом дописываете новый номер? Тогда зачем их скрывать после каждого телодвижения? Похоже, что нужно перекинуть макрос из Sub Worksheet_Change в обычный Sub и действительно запускать его только перед выгрузкой А если все-таки догадка неверна, то такой вариант [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count >= Columns.Count Then Exit Sub r0_ = 11 n_ = Cells(Rows.Count, 2).End(3).Row - r0_ + 1 If Not Intersect(Target, Cells(r0_, 1).Resize(n_)) Is Nothing Then For Each a0_ In Cells(r0_, 1).Resize(n_) If a0_ = "" Then a0_.Rows.EntireRow.Hidden = True End If Next a0_ End If End Sub
Зачем? вовсе не обязательно Просто переименуйте его, напишите [vba]
Код
Sub SkrStr() Dim c As Range, R& R = 14 Range("14:20").EntireRow.Hidden = False For Each c In Range("A14:A20") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
Зачем? вовсе не обязательно Просто переименуйте его, напишите [vba]
Код
Sub SkrStr() Dim c As Range, R& R = 14 Range("14:20").EntireRow.Hidden = False For Each c In Range("A14:A20") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
Согласен, я запускаю другой макрос, который активирует этот макрос (он срабатывает при любых действиях на листе), чтобы скрыть строки. Знаю-знаю не по фен-шуй это =)
А потом этот макрос начинает мешать когда он срабатывает при любых действиях на листе. И при добавлении строки.
Согласен, я запускаю другой макрос, который активирует этот макрос (он срабатывает при любых действиях на листе), чтобы скрыть строки. Знаю-знаю не по фен-шуй это =)
А потом этот макрос начинает мешать когда он срабатывает при любых действиях на листе. И при добавлении строки.Anis625
Тогда зачем их скрывать после каждого телодвижения?
Нашел и адаптировал макрос под себя на скорую руку. На тот момент даже это было значительное облегчение ручного труда. В течение года были определенные трудности, поэтому и ищу варианты оптимизации.
Тогда зачем их скрывать после каждого телодвижения?
Нашел и адаптировал макрос под себя на скорую руку. На тот момент даже это было значительное облегчение ручного труда. В течение года были определенные трудности, поэтому и ищу варианты оптимизации.Anis625
С чего вдруг по фен-шую-то? Кто сказал? Где про это написано? Да даже если и написано
Я наоборот, те коды, которые к листу относятся, стараюсь именно в модуле этого листа писать. Очень удобно - не нужно указывать лист, а запускать макрос можно с любого листа. Поясню - если в обычном модуле написано cells(1), то это ячейка А1 активного на момент запуска макроса листа, а если cells(1) написано в макросе, находящемся в модуле листа, то это по-любому ячейка А1 того листа, в модуле которого этот макрос находится. И если первоначально макрос пишется, допустим, для запуска с кнопки, находящейся на исполняемом листе, то впоследствии, когда таких кнопок на разных листах книги накапливается некоторое количество (а это достаточно часто случается - аппетиты, как известно, во время еды приходят) и становится неудобно нажимать, например, 10 кнопок в определенной последовательности, я пишу сборный макрос, который запускает подряд каждый макрос из этого десятка. А поскольку они все работают с разными листами, то получается, что в каждом из макросов должен быть явно указан лист. Но изначально-то макросы писались для работы на активных листах, то есть указывать лист не нужно было и конечно я его не указал. Все переписывать? Или в сборном макросе перед запуском каждого из макросов явно указывать лист? Вот совсем не радует
Вы скажете, что по фен-шую в любом случае указывать лист, в котором работаем (более того, пойдем дальше, нужно указывать и книгу тоже - вдруг макрос будет запущен при активной другой книге, поэтому как же без ThisWorkbook-то?, ну тогда уж и экземпляр Excel тоже надо, вдруг у нас их несколько запущено?). Да, в принципе все верно, нужно указывать (вы сами всегда так делаете?), но зачем мне весь этот геморрой с указанием макросу места для его работы, если есть решение гораздо проще? Я просто пишу макрос там, где мне нужно, чтобы он работал и не морочу себе голову А вот если мне нужно, чтобы макрос работал независимо от листа книги, тогда да, я конечно пишу его в обычном модуле
Кстати, про явное указание - представим себе обычный мой рабочий файл, таких множество, в нем десяток-другой макросов, каждый из которых тысячи полторы-две-три строк. Обращений к листу много, не всегда можно сначала все счить в массив, а потом положить обратно, и в процессе написания всего этого мне нужно, помимо всего прочего, еще и следить за тем, чтобы указывать лист? Или, если сначала написать With Лист, то следить за точками перед Range и Cells? Да никогда я не услежу за этим, обязательно где-нибудь пропущу. Не, нафиг, кому нравится, пусть по фен-шую делает, а я буду делать так, как мне удобно
С чего вдруг по фен-шую-то? Кто сказал? Где про это написано? Да даже если и написано
Я наоборот, те коды, которые к листу относятся, стараюсь именно в модуле этого листа писать. Очень удобно - не нужно указывать лист, а запускать макрос можно с любого листа. Поясню - если в обычном модуле написано cells(1), то это ячейка А1 активного на момент запуска макроса листа, а если cells(1) написано в макросе, находящемся в модуле листа, то это по-любому ячейка А1 того листа, в модуле которого этот макрос находится. И если первоначально макрос пишется, допустим, для запуска с кнопки, находящейся на исполняемом листе, то впоследствии, когда таких кнопок на разных листах книги накапливается некоторое количество (а это достаточно часто случается - аппетиты, как известно, во время еды приходят) и становится неудобно нажимать, например, 10 кнопок в определенной последовательности, я пишу сборный макрос, который запускает подряд каждый макрос из этого десятка. А поскольку они все работают с разными листами, то получается, что в каждом из макросов должен быть явно указан лист. Но изначально-то макросы писались для работы на активных листах, то есть указывать лист не нужно было и конечно я его не указал. Все переписывать? Или в сборном макросе перед запуском каждого из макросов явно указывать лист? Вот совсем не радует
Вы скажете, что по фен-шую в любом случае указывать лист, в котором работаем (более того, пойдем дальше, нужно указывать и книгу тоже - вдруг макрос будет запущен при активной другой книге, поэтому как же без ThisWorkbook-то?, ну тогда уж и экземпляр Excel тоже надо, вдруг у нас их несколько запущено?). Да, в принципе все верно, нужно указывать (вы сами всегда так делаете?), но зачем мне весь этот геморрой с указанием макросу места для его работы, если есть решение гораздо проще? Я просто пишу макрос там, где мне нужно, чтобы он работал и не морочу себе голову А вот если мне нужно, чтобы макрос работал независимо от листа книги, тогда да, я конечно пишу его в обычном модуле
Кстати, про явное указание - представим себе обычный мой рабочий файл, таких множество, в нем десяток-другой макросов, каждый из которых тысячи полторы-две-три строк. Обращений к листу много, не всегда можно сначала все счить в массив, а потом положить обратно, и в процессе написания всего этого мне нужно, помимо всего прочего, еще и следить за тем, чтобы указывать лист? Или, если сначала написать With Лист, то следить за точками перед Range и Cells? Да никогда я не услежу за этим, обязательно где-нибудь пропущу. Не, нафиг, кому нравится, пусть по фен-шую делает, а я буду делать так, как мне удобно_Boroda_
Sub SkrStr() Dim c As Range, R& R = 14 Range("14:20").EntireRow.Hidden = False For Each c In Range("A14:A20") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
[/vba]
Этот макрос как раз то что доктор прописал =) с кнопочным скрытием пустых строк
Возможно для этого отдельно конечно тему нужно создавать или можно уточниться в этой ветке? В макросе четкая привязка к нижней границы диапазона и когда добавляется строка диапазон не расширяется
[vba]
Код
Sub SkrStr() Dim c As Range, R& R = 14 Range("14:20").EntireRow.Hidden = False For Each c In Range("A14:A20") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
[/vba]
Этот макрос как раз то что доктор прописал =) с кнопочным скрытием пустых строк
Возможно для этого отдельно конечно тему нужно создавать или можно уточниться в этой ветке? В макросе четкая привязка к нижней границы диапазона и когда добавляется строка диапазон не расширяетсяAnis625
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count >= Columns.Count Then Exit Sub r0_ = 11 n_ = Cells(Rows.Count, 2).End(3).Row - r0_ + 1 If Not Intersect(Target, Cells(r0_, 1).Resize(n_)) Is Nothing Then For Each a0_ In Cells(r0_, 1).Resize(n_) If a0_ = "" Then a0_.Rows.EntireRow.Hidden = True End If Next a0_ End If End Sub
[/vba]
Макрос никак не срабатывает. Добавлял строки, добавлял значения и ничего не происходило
_Boroda_,
Попробовал его [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count >= Columns.Count Then Exit Sub r0_ = 11 n_ = Cells(Rows.Count, 2).End(3).Row - r0_ + 1 If Not Intersect(Target, Cells(r0_, 1).Resize(n_)) Is Nothing Then For Each a0_ In Cells(r0_, 1).Resize(n_) If a0_ = "" Then a0_.Rows.EntireRow.Hidden = True End If Next a0_ End If End Sub
[/vba]
Макрос никак не срабатывает. Добавлял строки, добавлял значения и ничего не происходилоAnis625
Sub SkrStr() Dim c As Range, R& R = 14 Range("14:Cells(Rows.Count, 2).End(3).Row").EntireRow.Hidden = False For Each c In Range("A14:Cells(Rows.Count, 2).End(3).Row") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
[/vba]
=) так не сработало.
Представляю ваши мысли после прочтения сообщения =)
_Boroda_,
[vba]
Код
Sub SkrStr() Dim c As Range, R& R = 14 Range("14:Cells(Rows.Count, 2).End(3).Row").EntireRow.Hidden = False For Each c In Range("A14:Cells(Rows.Count, 2).End(3).Row") If c = "" Then c.Rows.EntireRow.Hidden = True End If Next End Sub
[/vba]
=) так не сработало.
Представляю ваши мысли после прочтения сообщения =)Anis625