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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2010, 08:33   #1
as-is
Пользователь
 
Регистрация: 09.02.2010
Сообщений: 41
По умолчанию Макрос для всех листов

Уважаемые, помогите править макрос. Я долго добирался до макроса, который бы выполнялся на всех листах книги. Ниже образец найденного.
-----------------------------------------------------------------
Public Sub DoToAll()
'декларирование переменой
Dim ws As Worksheet
For Each ws In Worksheets
'разместите свой код для выполнения на каждом листе
ws.Range("A1") = "Пример"
Next
End Sub
-----------------------------------------------------------------

Макрос-пример на каждом листе в ячейке ставит надпись "Пример". Мне необходимо, чтобы выполнялся другой макрос:
Проблема, - как разместить ранее полученный макрос удаления пустых строк между "For" "Next". Сам код для удаления ниже
-----------------------------------------------------------------
Sub DeleteEmptyRows()
LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
Application.ScreenUpdating = False
For r = LastRow To 1 Step -1
If Application.CountA(Rows(r).Columns( 9)) = 0 Then Rows(r).Delete
Next r
End Sub
-----------------------------------------------------------------

СПАСИБО. долго мучаюсь.
as-is вне форума Ответить с цитированием
Старый 07.03.2010, 08:54   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Можно, например, так:

Код:
Sub DoToAll()
    Application.ScreenUpdating = False ' отключаем обновление экрана
    Dim ws As Worksheet    'декларирование переменой
    For Each ws In Worksheets
        ws.Activate    ' активируем лист
        DeleteEmptyRows    ' выполняем макрос
    Next
End Sub

Sub DeleteEmptyRows()
    LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    For r = LastRow To 1 Step -1
        If Application.CountA(Rows(r).Columns(9)) = 0 Then Rows(r).Delete
    Next r
End Sub
Или так:

Код:
Sub DeleteEmptyRowsToAll()
    Application.ScreenUpdating = False    ' отключаем обновление экрана
    Dim ws As Worksheet    'декларирование переменой
    For Each ws In Worksheets
        LastRow = ws.UsedRange.Row - 1 + ws.UsedRange.Rows.Count
        For r = LastRow To 1 Step -1
            If Application.CountA(ws.Rows(r).Columns(9)) = 0 Then ws.Rows(r).Delete
        Next r
    Next
End Sub

PS: Не понял, что означает CountA(Rows(r).Columns(9))
Зачем считать количество заполненных ячеек для диапазона из 1 ячейки???
Ладно бы, если всю строку проверяли...
А то можно написать и попроще:

Код:
Sub DeleteEmptyRowsToAll()
    Application.ScreenUpdating = False    ' отключаем обновление экрана
    Dim ws As Worksheet    'декларирование переменой
    For Each ws In Worksheets
        LastRow = ws.UsedRange.Row - 1 + ws.UsedRange.Rows.Count
        For r = LastRow To 1 Step -1
            If ws.Rows(r).Cells(9) = "" Then ws.Rows(r).Delete
        Next r
    Next
End Sub
Или вообще без цикла:
Код:
Sub DeleteEmptyRowsToAll()
    Application.ScreenUpdating = False    ' отключаем обновление экрана
    On Error Resume Next
    Dim ws As Worksheet    'декларирование переменой
    For Each ws In Worksheets
        ' удаляем сразу все строки, в которых в 9-м столбце - пусто
        ws.Columns(9).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Next
End Sub

Последний раз редактировалось EducatedFool; 07.03.2010 в 09:01.
EducatedFool вне форума Ответить с цитированием
Старый 07.03.2010, 09:13   #3
as-is
Пользователь
 
Регистрация: 09.02.2010
Сообщений: 41
По умолчанию

Огромное спасибо, - быстро и оперативно. Сначала не получилось, но подправил код удаления и стало все ОК.
Возникла ещё одна проблемка - на первом листе у меня ячейки, при активации на которых выполняется макрос (своеобразное меню). Так это "меню" тоже удаляется.
Можно ли сделать так, чтобы ... со второго листа и до последнего шло удаление.
То есть как не трогать первый лист. Спасибо.
as-is вне форума Ответить с цитированием
Старый 07.03.2010, 09:15   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub DeleteEmptyRowsToAll()
    Application.ScreenUpdating = False    ' отключаем обновление экрана
    On Error Resume Next
    Dim ws As Worksheet    'декларирование переменой
    For Each ws In Worksheets
        If ws.Index > 1 Then    ' кроме первого листа
            ' удаляем сразу все строки, в которых в 9-м столбце - пусто
            ws.Columns(9).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        End If
    Next
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 07.03.2010, 09:20   #5
as-is
Пользователь
 
Регистрация: 09.02.2010
Сообщений: 41
По умолчанию

Не дочитал - броузер не все выдал. Строка
CountA(Rows(r).Columns(9))
означает, что удаление строк идет по проверке ячеек в 9 колонке - это сейчас не принципиально.
Другие Ваши варианты ещё не пробовал - получилось пока с первым.
***
Проблема с первым листом-описано выше.
После этого попробовал вставлять картинки и привязывать к ним макросы - картинки не удаляются. Поэтому один из вариантом найден.

Ради интереса - как все-таки оставить "неприкосновенным" первый лист. Макрос выполнялся бы со второго. Спасибо.
as-is вне форума Ответить с цитированием
Старый 07.03.2010, 09:23   #6
as-is
Пользователь
 
Регистрация: 09.02.2010
Сообщений: 41
По умолчанию

Так быстро, что не успеваю. Преклоняюсь, иду осваивать. Спасибо.
as-is вне форума Ответить с цитированием
Старый 10.02.2011, 19:34   #7
yogoru
Новичок
Джуниор
 
Регистрация: 01.02.2011
Сообщений: 2
По умолчанию

Доброго времени суток всем!!!!

У меня имеется макрос вида:

Sub Защита()

Const MyPassword = "1111"
With ActiveSheet
.Unprotect Password:=MyPassword
.EnableOutlining = True
.Protect Password:=MyPassword, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True
End With

End Sub

необходим запуск макроса по Всем листам!!!
на сколько я понял мне необходим примерно вот такой цикл в него вписать:

Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets

Next

Но как это сделать понять не могу!!! Только начал с VB колдовать и не очень что-то получается!

Помогите ПЛЗ!
yogoru вне форума Ответить с цитированием
Старый 10.02.2011, 19:42   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Например, так:
Код:
Sub ЗащитаВсехЛистов()

Const MyPassword = "1111"
Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets

ws.Unprotect Password:=MyPassword
ws.EnableOutlining = True
ws.Protect Password:=MyPassword, Contents:=True, Scenarios:=True, UserInterfaceOnly:=True

Next

End Sub
EducatedFool вне форума Ответить с цитированием
Старый 10.02.2011, 21:15   #9
yogoru
Новичок
Джуниор
 
Регистрация: 01.02.2011
Сообщений: 2
По умолчанию

ОГРОМНОЕ СПАСИБО!
Всё работает!
yogoru вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для сохранения всех картинок из Word в файл Nitro Microsoft Office Word 5 24.05.2012 21:05
Получить имена всех листов в книге Temnota Microsoft Office Excel 6 26.12.2009 07:36
Макрос для сохранения листов в отдельных файлах Neo007 Microsoft Office Excel 2 22.10.2008 18:16
Снятие Защиты с листов, сразу со всех valerij Microsoft Office Excel 2 02.11.2007 21:19