Страницы: 1 2 След.
RSS
Перебор всех листов всех открытых книг
 
Добрый вечер!
Подскажите, пожалуйста, почему мой макрос останавливается, не отработав все открытые книги?
Вроде цикл указала правильно, но из 10 открытых книг обрабатываются сначала 5, потом я запускаю макрос еще раз, он обрабатывает еще 4, и потом еще раз запуск макроса - и он обрабатывает последнюю книгу.
Что я сделала не так?
Прилагаю код:
Код
Dim wb As Workbook
For Each wb In Workbooks
.......
.......
.......
Next
End Sub
 
А где перебор всех листов?
 
Цель - перебор всех листов во всех открытых книгах.
Или лучше выложить весь макрос? (Он не очень большой)
 
Какое действие выполняется при выборе очередного листа ?
 
Код
Dim wb As Workbook
For Each wb In Workbooks
 
 For s = 1 To Worksheets.Count
 Worksheets(s).Activate
 On Error GoTo 0
 Range("IU1" ;)  = ActiveSheet.Name
 Next s
 Columns("IU:IV" ;) .EntireColumn.Hidden = True
 For s = 1 To Worksheets.Count
 Worksheets(s).Activate
 On Error GoTo 0
 Range("IV1" ;) .FormulaR1C1 = _
 "=IF.... ' тут очень длинная формула
 Next s
 Application.DisplayAlerts = False
 For i = Sheets.Count To 1 Step -1
 If Sheets(i).[IV1] = 7 Then Sheets(i).PrintOut From:=1, To:=1, Copies:=1, Collate:=True
 Next
 Application.DisplayAlerts = True
 For s = 1 To Worksheets.Count
 Worksheets(s).Activate
 On Error GoTo 0
 Range("O1" ;)  = ClearContens
 Next s
 ActiveWindow.Close False
Next

End Sub
 
А зачем столько циклов(кажется 4) по листам очередной книги?
Книга, где макрос, тоже открытая книга, вы ее тоже обрабатываете?
Columns("IU:IV").EntireColumn.Hidden = True это в каком листе вы скрываете столбцы?
 
Макрос у меня не в "эта книга", а в "все открытые книги", поэтому нет, лишнее не обрабатывается.
Столбцы скрываю во всех листах книги, чтобы данные вписанные макросом (имя листа и формула рядом) не пошли на печать.
А с циклами - я не профессионал, я только учусь :)
 
Попробуйте так
Код
Option Explicit
Sub AllSheets()
Dim wb As Workbook
Dim s As Integer
    For Each wb In Workbooks
        Application.DisplayAlerts = False
    For s = 1 To Worksheets.Count
        Worksheets(s).Activate
        On Error GoTo 0
            Range("IU1") = ActiveSheet.Name
                Range("IV1").FormulaR1C1 = _
                 "=IF.... ' тут очень длинная формула "
            Columns("IU:IV").EntireColumn.Hidden = True
 If Sheets(s).[IV1] = 7 Then Sheets(s).PrintOut From:=1, To:=1, Copies:=1, Collate:=True
            Range("O1").ClearContens
    Next s
        Application.DisplayAlerts = True
        ActiveWindow.Close False
Next
End Sub

 
Обработал 7листов, потом 2 листа и потом еще 1 лист.
Почему-то останавливается  :(
Изменено: AmegaMSK - 19.10.2013 00:58:50
 
Попробуйте выполнить макрос в пошаговом режиме, те ли книги перебираются
все ли листы обрабатываются.
 
Стоп! Я вас дезинформировала!
Я скопировала ваш код без первых двух строк, поспешила на радостях  :)
Полностью код не работает, пишет ошибку на этой строчке "Option Explicit"
Текст ошибки "invalid inside procedure"
Изменено: AmegaMSK - 19.10.2013 01:30:33
 
Цитата
Обработал 7листов, потом 2 листа и потом еще 1 лист.
Так листов или книг? Может у вас не хватает памяти, когда открыты все 10 книг?
Я, обычно, все книги помещаю в один каталог и обрабатываю их последовательно:
открываю первую книгу, делаю действия и закрываю книгу, затем открываю следующую.
Как ведет себя макрос, который записан во всех открытых книгах, я не знаю .
Option Explicit - это явное объявление переменных
 
логическая ошибка
надо писать wb.Worksheets.Count, wb.Worksheets(s).Activate и т.п.
иначе - подобные команды применяются всегда к активной книге
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Kuzmich, книг, конечно, книг  :)  
ikki, заменила в макросе Worksheets.Count на wb.Worksheets.Count и Worksheets(s).Activate на wb.Worksheets(s).Activate по вашему совету, однако результат тот же - макрос останавливается, как и прежде.
 
не увидел ответа на
Цитата
Попробуйте выполнить макрос в пошаговом режиме, те ли книги перебираются
все ли листы обрабатываются.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Попробовала, обрабатываются ВСЕ листы в открытых книгах (Именно каждый лист, как и было задумано!). Перед отправкой на печать тоже обрабатывается каждый лист. Обработанные книги закрываются без сохранения. Но макрос останавливается, приходится его еще раз запускать, далее все по тому же сценарию.
Т. е. все правильно работает, но с остановками.
 
Цитата
Обработанные книги закрываются без сохранения.
А где в коде макроса книги закрываются?
 
Я так понимаю, что вот тут
       ActiveWindow.Close False
 
Не знаю ActiveWorkbook.Close False и ActiveWindow.Close False это одно и то же?
 
Не знаю, так рекордер записал.
Я заменила на ActiveWorkbook.Close False, но ничего не изменилось.
 
Цитата
ActiveWorkbook.Close False и ActiveWindow.Close False это одно и то же?
не всегда.
у одной книги может быть открыто более одного окна.
в этом случае ActiveWindow.Close приведёт к закрытию одного из окон (активного), но не файла.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Так чем сердце успокоилось?

У меня похожая задача - нужно, чтоб макрос выполнялся во всех листах, во всех открытых книгах, кроме файла с макросом (thisworkbook???)
Предварительный план такой - Пересчитать открытые книги, организовать цикл через IF. Я хз...
 
Цитата
tigor написал:
Преварительный план такой
создать свою тему, описать задачу  показать желаемый результат
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Mershik написал:
создать свою тему, описать задачу  показать желаемый результат
не хочу засорять форум копеечными темами. Может когда припрет... Спасибо.
 
tigor, ну попробуйте так:
Код
Sub mrshkei()
Dim wb As Workbook, sh As Worksheet
For Each wb In Workbooks
    If Not wb Is ThisWorkbook And wb.Name <> "PERSONAL.XLSB" Then
        With Workbooks(wb.Name)
            For i = 1 To .Worksheets.Count
                'действие макроса с листом
            Next i
        End With
    End If
Next
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, Спасибо большое, но возникла такая же проблема проблема, что и у автора ветки. После прохода 3-4 файлов (всего их 13) эксель вылетает.  Некоторые файлы получились с ошибками.

Прийдется вызывать файлы по очереди через DIR

Cпасибо вам большое за помощь.

З.Ы. Может есть какой-то  tmp, который переполняется? И его надо почистить?  
Изменено: tigor - 01.03.2021 02:11:22
 
Что касается сообщения 5 то наверно так будет работать
Код
Sub fdgh()
Dim wb As Workbook
For Each wb In Workbooks
 For s = 1 To Worksheets.Count
 Worksheets(s).Activate
 On Error GoTo 0
 Range("IU1") = ActiveSheet.Name
 Next s
 Columns("IU:IV").EntireColumn.Hidden = True
 For s = 1 To Worksheets.Count
 Worksheets(s).Activate
 On Error GoTo 0
 Range("IV1").FormulaR1C1 = _
 "=IF.... ' тут очень длинная формула"
 Next s
 Application.DisplayAlerts = False
 For i = Sheets.Count To 1 Step -1
 If [IV1] = 7 Then Sheets(i).PrintOut From:=1, To:=1, Copies:=1, Collate:=True
 Next
 Application.DisplayAlerts = True
 For s = 1 To Worksheets.Count
 Worksheets(s).Activate
 On Error GoTo 0
 Range("O1").ClearContens
 Next s
'Следующий оператор надо отсюда убрать
'Тут закрывать нельзя коллекция книг уменьшается поэтому до конца не доходит
 ActiveWindow.Close False
Next wb
End Sub
 
Евгений Смирнов, спасибо, попробуем
 
Заметил причину сбоев - в некоторых книгах были скрытые листы. Возможно, у автора поста было тоже самое, на этих книгах макрос и затыкался.

Позже выложу файл примера с макросом. Может кому и ссгодится.
 
tigor, просто добавьте проверку на скрытый лист

Код
Sub mrshkei()
Dim wb As Workbook, sh As Worksheet

    For Each wb In Workbooks 'по всем открытым книгам/файлам
        If Not wb Is ThisWorkbook And wb.Name <> "PERSONAL.XLSB" Then 'если не книга с макросом и не Личная книга макросов
        'If wb.Name <> "PERSONAL.XLSB" Then 'если не надо исключать книгу с этим макросом
            With Workbooks(wb.Name)
                For Each sh In wb.Worksheets 'по всем листам в книге
                    If sh.Visible = True Then 'если лист не скрытый
                        MsgBox sh.Name 'что-то делаем с этим листом
                    End If
                Next sh
            End With
        End If
    Next wb
End Sub
Изменено: New - 02.03.2021 14:25:30
Страницы: 1 2 След.
Наверх