Vba excel макрос для всех листов

 

SHARP

Пользователь

Сообщений: 154
Регистрация: 24.12.2012

#1

10.03.2017 13:32:18

Доброго времени суток
Как сделать так, чтобы При сохранении книги макрос работал на всех листах где это нужно, а не только на активном?

Скрытый текст

 

нужно понимать что Вы хотите получить от макроса
и
написать его так, чтобы он выполнял поставленную задачу

Изменено: Ігор Гончаренко10.03.2017 14:09:11

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

SHARP

Пользователь

Сообщений: 154
Регистрация: 24.12.2012

#3

10.03.2017 14:32:04

Если в макрос вставить

Скрытый текст

тогда он будет всегда выполняться на всех листах, а мне нужно чтобы только при сохранении.

Как проверить наличии «КнопкаЗОР» на листе
или
прописать В СЛУЧАИ ОТСУТСТВИИ ТАКОВОЙ

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#4

10.03.2017 15:00:21

Цитата
SHARP написал:
тогда он будет всегда выполняться на всех листах, а мне нужно чтобы только при сохранении

1. Вы сами просили на всех листах.
2. Вызывайте эту процедуру при  наступлении события сохранения.
===
И перечитайте цитату — какая связь? ))

 

SHARP

Пользователь

Сообщений: 154
Регистрация: 24.12.2012

Макрос «ЗАКРЫТЬ» вызывается нажатием кнопки активного листа и выполняется только на текущем листе
при вызове процедуры сохранить надо, чтобы этот макрос «ЗАКРЫТЬ» выполнялся на всех листах.
сам дошел до создания двух макросов для различных процедур.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#6

10.03.2017 15:18:14

Цитата
SHARP написал:
надо, чтобы этот макрос «ЗАКРЫТЬ» выполнялся на всех листах

Перебирайте листы циклом и выполняйте нужные действия для каждого листа.
А вот эта строка

Код
If Worksheets(i).Name <> "" Then

вызывает недоумение: не может лист не иметь имени.

 

SHARP

Пользователь

Сообщений: 154
Регистрация: 24.12.2012

про это я писал посте #3

Выходит нужно два макроса, с перебором листов и без и других вариантов нет?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Я читал #3. Зачем два макроса? Нажали на кнопку, макрос перебирает все листы, на каждом выполняет нужные операции. Проблема в чём?
И Вы ничего не ответили про проверку имя листа в #6.

 

SHARP

Пользователь

Сообщений: 154
Регистрация: 24.12.2012

Проблема в том, что пи нажатии кнопки макрос должен выполнятся только на активном листе и мне не нужно, чтобы он перебирал другие листы и делал на них какие либо изменения. Данная задача ставиться только при сохранении книги.
Строкой в посте#6 я организую условия для переборки всех листов. Т.к. лист не может не иметь имени, значит будут перебраны все листы.
Бывают листы, в которых не требуются изменения и впоследствии они могут туда быть вписаны.

Изменено: SHARP10.03.2017 15:44:23

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#10

10.03.2017 15:59:30

Если при нажатии на кнопку макрос должен делать действия только на активном листе, а при событии сохранения пройтись по всем, то я бы добавил глобальную логическую переменную и проверял её значение: например, если ИСТИНА, обработали только активный лист и вышли из процедуры. Если ЛОЖЬ — выполняется цикл.

Цитата
SHARP написал:
Строкой в посте#6 я организую условия для переборки всех листов. Т.к. лист не может не иметь имени, значит будут перебраны все листы.

Макрос и так переберёт ВСЕ листы. Условие перебора всех листов задаётся не строкой, которую я цитировал, а параметрами цикла. В Вашем случае с первого листа по последний.

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#11

10.03.2017 16:02:49

Цитата
SHARP написал:
Бывают листы, в которых не требуются изменения

Имена листов известны?

Цитата
SHARP написал:
Как проверить наличии «КнопкаЗОР» на листе

Можно так:

Код
function IsShapeExists(ws as worksheet, s as string)
dim osh as shape
on error resume next
set osh = ws.shapes(s)
IsShapeExists = not osh is nothing
end function

Sub CallCheck()
dim ws as worksheet
for each ws in thisworkbook.worksheets
if IsShapeExists(ws,"КнопкаЗОР") then
'здесь есть кнопка с именем "КнопкаЗОР"
end if
next
end sub

при условии, что кнопка является элементом форм или автофигурой. С ActiveX подход определения на листе иной будет, хоть общий принцип тот же.

Или можно просто перебрать только нужные листы:

Код
Sub CycleByNames()
dim ws as worksheet
dim arr,x
arr = array("Лист1","Лист5","Отчет")
for each x in arr
set ws = thisworkbook.sheets(x)
'что-то делаем с листом, например, активируем
ws.Select
next
end sub

Изменено: The_Prist10.03.2017 16:05:12

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

SHARP

Пользователь

Сообщений: 154
Регистрация: 24.12.2012

#12

10.03.2017 16:31:34

Цитата
Юрий М написал:
я бы добавил глобальную логическую переменную и проверял её значение: например, если ИСТИНА, обработали только активный лист и вышли из процедуры. Если ЛОЖЬ — выполняется цикл.

Я про это и спрашиваю. Я понимаю, что при разных условиях и разное решение. Решение готово, а условия построить не получается.

Цитата
The_Prist написал:
Имена листов известны?

Все листы имеют разное название, но те, которые перебирать не надо — Известны.

Цитата
The_Prist написал:
С ActiveX подход определения на листе иной будет

у меня как раз ActiveX, но ваш код встал как влитой. Спасибо

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#13

10.03.2017 18:39:45

В модуль книги:

Код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Flag = True
    Call ЗАКРЫТЬ
End Sub

В стандартный модуль:

Код
Public Flag As Boolean
Sub ЗАКРЫТЬ()
'Выполняются операции только на активном листе
    ActiveSheet.КнопкаЗОР.Caption = "ЗАКРЫТО"
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    If Not Flag Then Exit Sub
'Все последующие строки будут выполнены только в том случае, если макрос был вызван по событию
    For i = 1 To Sheets.Count
        If Worksheets(i).Name <> "Лист1" And Worksheets(i).Name <> "Лист3" Then
            Sheets(i).Activate 'Активация листа только для примера: здесь нужные операции с листами
        End If
    Next
    Flag = False
End Sub

Имена листов, которые обрабатывать не нужно, подставьте свои.

 

SHARP

Пользователь

Сообщений: 154
Регистрация: 24.12.2012

 

assedo

Пользователь

Сообщений: 43
Регистрация: 05.06.2014

#15

21.07.2017 16:38:39

Доброго времени суток
в продолжении темы «выполнение макроса на всех листах»
имею вот такой макрос (удаление строк со значением «0»):

Код
Sub M55_DelRows2()
    Dim x As Range, y As Range, fst As String
    Set x = [B:B].Find(0, , xlValues, xlWhole)
    If Not x Is Nothing Then
        fst = x.Address
        Do
            If y Is Nothing Then Set y = x Else Set y = Union(y, x)
            Set x = [B:B].FindNext(x)
        Loop While fst <> x.Address
        y.EntireRow.Delete
    End If
End Sub

он выполняется только на первом листе
что необходимо дописать/исправить что бы выполнял на всех листах или на выбранных листах

заранее благодарю

Изменено: assedo21.07.2017 16:39:31

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#16

21.07.2017 16:49:50

Для ВСЕХ листов

Код
Sub M55_DelRows2()
Dim sh As Worksheet, x  As Range, y As Range, fst As String
For Each sh In Worksheets
    With sh
        Set x = .Columns("B").Find(0, , xlValues, xlWhole)
        If Not x Is Nothing Then
            fst = x.Address
            Do
                If y Is Nothing Then Set y = x Else Set y = Union(y, x)
                Set x = .Columns("B").FindNext(x)
            Loop While fst <> x.Address
            y.EntireRow.Delete
        End If
    End With
Next
End Sub

Согласие есть продукт при полном непротивлении сторон.

 

assedo

Пользователь

Сообщений: 43
Регистрация: 05.06.2014

#17

21.07.2017 16:51:08

Sanja,
Благодарю, хорошего дня.

Аннотация

Данная статья содержит Microsoft Visual Basic для приложений макроса (процедура Sub), который в цикле проходит через все листы активной книги. Этот макрос также отображается имя каждого листа.

Дополнительная информация

Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации и без гарантии или подразумеваемых. Это включает, но не ограничиваясь, подразумеваемые гарантии товарной пригодности или пригодности для определенной цели. В данной статье предполагается, что вы знакомы с демонстрируемым языком программирования и средствами, которые используются для создания и отладки. Сотрудники службы поддержки Майкрософт могут объяснить возможности конкретной процедуры, но не выполнять модификации примеров для обеспечения дополнительных функциональных возможностей или создания процедур для определенных требований. Пример макроса, выполните следующие действия:

  1. Введите следующий код макроса в лист модуля.

          Sub WorksheetLoop()         Dim WS_Count As Integer         Dim I As Integer         ' Set WS_Count equal to the number of worksheets in the active         ' workbook.         WS_Count = ActiveWorkbook.Worksheets.Count         ' Begin the loop.         For I = 1 To WS_Count            ' Insert your code here.            ' The following line shows how to reference a sheet within            ' the loop by displaying the worksheet name in a dialog box.            MsgBox ActiveWorkbook.Worksheets(I).Name         Next I      End Sub

  2. Чтобы запустить макрос, поместите курсор в строку, которая считывает «Sub WorksheetLoop()» и нажмите клавишу F5.

Макрос будет цикла книги и отображает окно сообщения с именем другого листа при каждом выполнении цикла. Обратите внимание, что этот макрос будет отображать только имена листов; он будет отображаться имена других типов листов в книге. Можно также использовать цикл через все листы в книге с помощью цикла «For Each».

  1. Введите следующий код макроса в лист модуля.

          Sub WorksheetLoop2()         ' Declare Current as a worksheet object variable.         Dim Current As Worksheet         ' Loop through all of the worksheets in the active workbook.         For Each Current In Worksheets            ' Insert your code here.            ' This line displays the worksheet name in a message box.            MsgBox Current.Name         Next      End Sub

  2. Чтобы запустить макрос, поместите курсор в строку, которая считывает «Sub WorksheetLoop2()» и нажмите клавишу F5.

Этот макрос работает одинаково в макрос WorksheetLoop, за исключением того, что он использует другой тип цикла для обработки все листы активной книги.

Ссылки

Дополнительные сведения о получении справки по Visual Basic для приложений обратитесь к следующей статье Microsoft Knowledge Base:

163435 VBA: программные ресурсы для Visual Basic для приложений

226118 OFF2000: программные ресурсы для Visual Basic для приложений

Нужна дополнительная помощь?

Обычно мы можем запускать макрос на листе, если есть несколько листов, которые необходимо применить этот макрос, вы должны запускать код один за другим. Есть ли другой быстрый способ запустить один и тот же макрос на нескольких листах одновременно в Excel?

Запустить или выполнить один и тот же макрос на нескольких листах одновременно с кодом VBA


Запустить или выполнить один и тот же макрос на нескольких листах одновременно с кодом VBA

Чтобы запустить макрос на нескольких листах одновременно, не запуская его по одному, вы можете применить следующий код VBA, сделайте следующее:

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модули, и вставьте следующий макрос в Модули Окно.

Код VBA: запускать один и тот же макрос на нескольких листах одновременно:

Sub Dosomething()
    Dim xSh As Worksheet
    Application.ScreenUpdating = False
    For Each xSh In Worksheets
        xSh.Select
        Call RunCode
    Next
    Application.ScreenUpdating = True
End Sub
Sub RunCode()
    'your code here
End Sub

Внимание: В приведенном выше коде скопируйте и вставьте свой собственный код без ниже заголовок и End Sub нижний колонтитул между Дополнительный код выполнения () и End Sub скрипты. Смотрите скриншот:

макрос запуска документа на всех листах 1

3. Затем поместите курсор на макрос первой части и нажмите F5 нажмите клавишу для запуска кода, и ваш код макроса будет применяться к одному листу.



Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (13)


Оценок пока нет. Оцените первым!

Автор iva, 24 апреля 2017, 19:04

Добрый день!

Пожалуйста, подскажите, как сделать, чтобы этот макрос работал на всех листах книги, а не только на активном?

Sub T()

Dim lngI As Long
Dim lngJ As Long
    lngI = Cells(Rows.Count, 18).End(xlUp).Row ‘определяем строку последней заполненной ячейки в столбце R
    lngJ = Cells(Rows.Count, 6).End(xlUp).Row ‘определяем строку последней заполненной ячейки в столбце F
    Range(«R» & lngI).Copy Range(«R» & lngI + 1 & «:R» & lngJ)

End Sub



Администратор

  • Administrator
  • Сообщения: 2,252
  • Записан

Sub T()

    Dim sh As Worksheet
    Dim lngI As Long
    Dim lngJ As Long

        For Each sh In Worksheets
        lngI = sh.Cells(sh.Rows.Count, 18).End(xlUp).Row ‘определяем строку последней заполненной ячейки в столбце R
        lngJ = sh.Cells(sh.Rows.Count, 6).End(xlUp).Row ‘определяем строку последней заполненной ячейки в столбце F
        sh.Range(«R» & lngI).Copy sh.Range(«R» & lngI + 1 & «:R» & lngJ)
    Next sh

End Sub



  • Форум по VBA, Excel и Word

  • VBA, Excel

  • VBA, макросы в Excel

  • Excel: Макрос для всех листов книги

Ill show you how to loop through all of the worksheets in a workbook in Excel using VBA and Macros.

This only takes a few lines of code and is rather simple to use once you understand it.

Here is the macro that will loop through all worksheets in a workbook in Excel:

Sub Sheet_Loop()
'count the number of worksheets in the workbook
sheet_count = ActiveWorkbook.Worksheets.Count

'loop through the worksheets in the workbook
For a = 1 To sheet_count

    'code that you want to run on each sheet
    
    'simple message box that outputs the name of the sheet
    MsgBox ActiveWorkbook.Worksheets(a).Name

Next a
End Sub

Now, Ill go through the macro step-by-step.

ActiveWorkbook.Worksheets.Count

This line is what counts the number of worksheets that are in the workbook.

The first part of the line simply sets the variable sheet_count equal to the number of sheets in the workbook:

sheet_count = ActiveWorkbook.Worksheets.Count

Now that we know how many worksheets there are, we can loop through them.

We are going to use a very simple For Next loop in this case and you can copy it directly from here into your project.

For a = 1 To sheet_count
'code that you want to run on each sheet
Next a

In the above lines we are creating a new variable a and setting it equal to 1.  We then use the sheet_count variable to tell the macro when to stop looping; remember that it holds the numeric value of how many sheets there are in the workbook.

After this first line, which creates the loop, we then put all of the code that we want to run on each worksheet.

Dont forget that, at the end of the loop we still need something:

Next a

This tells the For loop that it should increment the value of the a variable by 1 each time the loop runs through a cycle or goes through a sheet.  The loop will not work without this line of code at the end of it.

In the original example we also have a line of code within the For loop:

MsgBox ActiveWorkbook.Worksheets(a).Name

This line will output the name of each worksheet into a pop-up message box; it also illustrates how you can access the worksheets from within the loop.

To do anything with the sheets from within the loop, we need to access each sheet by its reference or index number.  Each sheet has an index number and it always starts at 1 and increments by 1 for the next sheet in the workbook.

This is why we create the a variable and set it equal to 1 in the For loop, because the first sheet in the workbook always has an index number of 1, and we want to use a as the index number to access the worksheets.

Each time the loop runs and a is incremented by one, this allows you to access the next sheet in the workbook.  This is why we needed to count how many sheets were in the workbook, so we would know when to tell the For loop to stop running because there were no more sheets.

So, we can access the worksheets from within the loop by using
ActiveWorkbook.Worksheets(index number)

or

Sheets(index number)

Remember that the variable a is being used as our index number in this case.

Using this method you can do anything you want with the corresponding worksheet.

And thats how you loop through all worksheets in a workbook in Excel!

Make sure to download the accompanying file for this tutorial so you can see the VBA/Macro code in action.

Similar Content on TeachExcel

Get the Name of a Worksheet in Macros VBA in Excel

Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…

Excel Input Form with Macros and VBA

Tutorial:
Forms Course
How to make a data entry form in Excel using VBA and Macros — this allows yo…

Get User Submitted Data from a Prompt in Excel using VBA Macros

Tutorial: How to prompt a user for their input in Excel.
There is a simple way to do this using VBA …

Find the Next Blank Row with VBA Macros in Excel

Tutorial:
Learn how to find the next empty cell in a range in Excel using VBA and Macros.  This me…

Loop Through an Array in Excel VBA Macros

Tutorial:
I’ll show you how to loop through an array in VBA and macros in Excel.  This is a fairly…

Copy Data or Formatting to Multiple Worksheets in Excel

Tutorial:
Quickly copy all or parts of a single worksheet — data, formatting, or both — to multiple…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Like this post? Please share to your friends:
  • Vba excel макрос для всех книг
  • Vba excel лучший самоучитель
  • Vba excel логический оператор или
  • Vba excel логические выражения
  • Vba excel лист по индексу