Excel применение макроса ко всем листам

Как применить макрос сразу ко всей книге целиком?

Ekaterina

Дата: Среда, 30.10.2013, 15:23 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Вот написала я макрос. А применить могу его только на том листе, на котором нахожусь. Захожу в список макросов, выбираю конкретный макрос и нажимаю «выполнить».
А как сделать так, чтоб этот выбранный мной макрос применился сразу ко всем листам данной книги?
Спасибо

 

Ответить

Serge_007

Дата: Среда, 30.10.2013, 15:26 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 15888


Репутация:

2623

±

Замечаний:
±


Excel 2016

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

Указать эти листы в макросе

[p.s.]Вы вообще видели в какой раздел постите? При чем здесь формулы?
Тему перенес[/p.s.]


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

SkyPro

Дата: Среда, 30.10.2013, 15:30 |
Сообщение № 3

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

[vba]

Код

Sub sshheeetttss()
Dim i&
For i = 1 To .sheets.Count
     ThisWorkbook.sheets(i).Activate
         ‘ ваш макрос
Next
End Sub

[/vba]


skypro1111@gmail.com

 

Ответить

Ekaterina

Дата: Среда, 30.10.2013, 18:48 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Serge_007,

P.S.
Вы вообще видели в какой раздел постите? При чем здесь формулы?
Тему перенес

Ой, извините :'(

 

Ответить

Ekaterina

Дата: Среда, 30.10.2013, 18:49 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

SkyPro, спасибо большое! Сейчас попробую

 

Ответить

Alex_ST

Дата: Среда, 30.10.2013, 20:18 |
Сообщение № 6

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Ну, что-то я сильно сомневаюсь, что всё так просто, как написал SkyPro.
Скорее всего всё-таки макрос нужно будет перенести в стандартный модуль и, перебирая страницы в цикле, внутри циклов указывать перед Cells и Range имя листа — переменную цикла.



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

SkyPro

Дата: Среда, 30.10.2013, 20:54 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Alex_ST, ну в условиях задачи нет ничего. Ни файла, ни кода. Так что я выдал стандартный вариант, где все действия применяются к Activesheet.
Если бы люди читали правила, или, хотя бы понимали, что для решения вопроса недостаточно попросить кнопку «сделать как надо», то и ответ был бы другой )


skypro1111@gmail.com

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 09:57 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

SkyPro, нет, не работает!
[moder]Странно.

Если бы люди читали правила, или, хотя бы понимали, что для решения вопроса недостаточно попросить кнопку «сделать как надо», то и ответ был бы другой )

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 10:05 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Alex_ST,
SkyPro, вот этот макрос. Только прошу сильно не смеяться :) Я не умею писать макросы, так что делала его просто с помощью кнопки «запись макроса», потом зашла в «изменить макрос» и добавила пароль защиты листа. Где тут в этом коде надо поменять так, чтобы он применялся сразу ко всем листам? Спасибо!

[vba]

Код

Sub защитить_листы()

‘ защитить_листы Макрос


Cells.Select
Selection.Locked = True
Selection.FormulaHidden = False
ActiveWindow.ScrollColumn = 6
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 8
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollColumn = 14
ActiveWindow.ScrollColumn = 16
ActiveWindow.ScrollColumn = 17
ActiveWindow.ScrollColumn = 18
ActiveWindow.ScrollColumn = 19
ActiveWindow.ScrollColumn = 20
ActiveWindow.ScrollColumn = 21
ActiveWindow.ScrollColumn = 22
ActiveWindow.ScrollColumn = 23
ActiveWindow.ScrollColumn = 24
ActiveWindow.ScrollColumn = 25
ActiveWindow.ScrollColumn = 26
ActiveWindow.SmallScroll Down:=-9
Range(«AE13:AP27»).Select
Range(Selection, Selection.End(xlDown)).Select
Range(«AE13:AP638»).Select
Selection.Locked = False
Selection.FormulaHidden = False
ActiveWindow.ScrollColumn = 27
ActiveWindow.ScrollColumn = 28
ActiveWindow.ScrollColumn = 30
ActiveWindow.ScrollColumn = 31
ActiveWindow.ScrollColumn = 32
ActiveWindow.ScrollColumn = 33
ActiveWindow.ScrollColumn = 34
ActiveWindow.ScrollColumn = 35
ActiveWindow.ScrollColumn = 36
ActiveWindow.ScrollColumn = 37
ActiveWindow.ScrollColumn = 38
ActiveWindow.ScrollColumn = 39
ActiveWindow.ScrollColumn = 40
ActiveWindow.ScrollColumn = 41
ActiveWindow.ScrollColumn = 42
ActiveWindow.ScrollColumn = 43
ActiveWindow.ScrollColumn = 44
ActiveWindow.ScrollColumn = 45
ActiveWindow.ScrollColumn = 46
ActiveWindow.ScrollColumn = 47
ActiveWindow.ScrollColumn = 48
Range(«BF11»).Select
Selection.Locked = False
Selection.FormulaHidden = False
Range(«BN631:BR638»).Select
Range(«BN638»).Activate
ActiveWindow.ScrollRow = 608
ActiveWindow.ScrollRow = 605
ActiveWindow.ScrollRow = 599
ActiveWindow.ScrollRow = 593
ActiveWindow.ScrollRow = 582
ActiveWindow.ScrollRow = 566
ActiveWindow.ScrollRow = 551
ActiveWindow.ScrollRow = 533
ActiveWindow.ScrollRow = 514
ActiveWindow.ScrollRow = 478
ActiveWindow.ScrollRow = 444
ActiveWindow.ScrollRow = 394
ActiveWindow.ScrollRow = 358
ActiveWindow.ScrollRow = 328
ActiveWindow.ScrollRow = 297
ActiveWindow.ScrollRow = 279
ActiveWindow.ScrollRow = 270
ActiveWindow.ScrollRow = 260
ActiveWindow.ScrollRow = 250
ActiveWindow.ScrollRow = 239
ActiveWindow.ScrollRow = 230
ActiveWindow.ScrollRow = 209
ActiveWindow.ScrollRow = 202
ActiveWindow.ScrollRow = 201
ActiveWindow.ScrollRow = 195
ActiveWindow.ScrollRow = 191
ActiveWindow.ScrollRow = 187
ActiveWindow.ScrollRow = 181
ActiveWindow.ScrollRow = 177
ActiveWindow.ScrollRow = 174
ActiveWindow.ScrollRow = 170
ActiveWindow.ScrollRow = 166
ActiveWindow.ScrollRow = 163
ActiveWindow.ScrollRow = 158
ActiveWindow.ScrollRow = 152
ActiveWindow.ScrollRow = 144
ActiveWindow.ScrollRow = 137
ActiveWindow.ScrollRow = 128
ActiveWindow.ScrollRow = 119
ActiveWindow.ScrollRow = 110
ActiveWindow.ScrollRow = 103
ActiveWindow.ScrollRow = 96
ActiveWindow.ScrollRow = 90
ActiveWindow.ScrollRow = 86
ActiveWindow.ScrollRow = 83
ActiveWindow.ScrollRow = 79
ActiveWindow.ScrollRow = 76
ActiveWindow.ScrollRow = 74
ActiveWindow.ScrollRow = 71
ActiveWindow.ScrollRow = 70
ActiveWindow.ScrollRow = 68
ActiveWindow.ScrollRow = 67
ActiveWindow.ScrollRow = 65
ActiveWindow.ScrollRow = 63
ActiveWindow.ScrollRow = 61
ActiveWindow.ScrollRow = 60
ActiveWindow.ScrollRow = 56
ActiveWindow.ScrollRow = 52
ActiveWindow.ScrollRow = 49
ActiveWindow.ScrollRow = 47
ActiveWindow.ScrollRow = 45
ActiveWindow.ScrollRow = 43
ActiveWindow.ScrollRow = 41
ActiveWindow.ScrollRow = 39
ActiveWindow.ScrollRow = 35
ActiveWindow.ScrollRow = 32
ActiveWindow.ScrollRow = 31
ActiveWindow.ScrollRow = 27
ActiveWindow.ScrollRow = 25
ActiveWindow.ScrollRow = 23
ActiveWindow.ScrollRow = 21
ActiveWindow.ScrollRow = 19
ActiveWindow.ScrollRow = 14
ActiveWindow.ScrollRow = 13
Range(«BN13:BR638»).Select
Range(«BN638»).Activate
Selection.Locked = False
Selection.FormulaHidden = False
ActiveWindow.ScrollColumn = 45
ActiveWindow.ScrollColumn = 41
ActiveWindow.ScrollColumn = 7
ActiveWindow.ScrollColumn = 5
ActiveWindow.SmallScroll Down:=-9
Range(«D8»).Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Password:=»art789″, Scenarios:=True _
, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True
End Sub

[/vba]

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 10:06 |
Сообщение № 10

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Этого достаточно? Или нужно весь файл выкладывать?

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 10:10 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

А ещё можно один вопросик задать? Вот допустим есть у меня макрос, который удаляют содержимое определённых ячеек, ну и плюс проставляет суммы в некоторых колонках. Мне нужно, чтоб он 1 раз сделал это действие во всех листах книги, а после этого не действовал. Что нужно для этого сделать? Если, например, я этот макрос оставлю в списке сохранённых макросов этой конкретной книги, то при каждом открытии этой книги он будет опять проделывать все эти действия? Или не будет? А если я его удалю, то все те действия, которые он проделал до этого, отменятся или нет?

 

Ответить

Alex_ST

Дата: Четверг, 31.10.2013, 12:24 |
Сообщение № 12

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Ekaterina,
не вдаваясь в подробности, что и зачем Вы защищали, по всем листам книги будет так:
[vba]

Код

Sub защитить_листы()
        Dim sH As Worksheet
        Application.ScreenUpdating = False
        For Each sH In ThisWorkbook.Worksheets
           sH.Cells.Locked = True: sH.Cells.FormulaHidden = False
‘       sH.Range(«AE13:AP638», «BF11», «BN13:BR638»).Locked = False ‘ это НЕ ПРАВИЛЬНО — ошибка синтаксиса!!!
           sH.Range(«AE13:AP638,BF11,BN13:BR638»).Locked = False ‘ вот так должно быть
           sH.Protect DrawingObjects:=True, Contents:=True, Password:=»art789″, _
                      Scenarios:=True, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
                      AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True
        Next sH
        Application.ScreenUpdating = True
End Sub

[/vba]
А про «вопросик», так ведь макрос сам по себе ничего делать не будет. Чтобы он сработал, нужно его вызвать.
Вызвать его можете Вы сами, запустив, например, из списка макросов.
А можно ещё организовать его работу автоматически, но не самостоятельно, а только по факту происхождения какого-либо события (например, открытия книги, выбора листа, изменения выбранной ячейки, и ещё огромная куча событий-Event может быть отслежена программно).
А если у Вас в книге обработка событий (вызов процедур по событиям) не прописан, то никакой макрос сам по себе не запустится.

**********************************************
ВНИМАНИЕ! Вчера в коде мною была допущена ошибка в синтаксисе обращения к объекту Range. Прошу прощения. На данный момент она уже закомментирована и исправлена.



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STПятница, 01.11.2013, 10:25

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 12:39 |
Сообщение № 13

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Alex_ST, спасибо большое. Но я не поняла, а где все те строчки, которые были у меня? Их же тоже нужно куда-то вставлять, чтоб у меня защищались на листе именно те области, которые нужно защитить? Или это и есть весь макрос целиком?

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 12:57 |
Сообщение № 14

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Alex_ST, не работает :( . Выделяет вот этот отравок End With
sH.Range и выдаёт ошибку: «Compile error: Wrong number of arguments or invalid property assignment»

 

Ответить

SkyPro

Дата: Четверг, 31.10.2013, 13:11 |
Сообщение № 15

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Приложите ваш файл.


skypro1111@gmail.com

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 13:22 |
Сообщение № 16

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

SkyPro, я не знаю как его сделать размером в 100 кБ. Он весит намного больше, хотя я удалила 2/3 всех листов, чтоб вставить сюда

 

Ответить

Ekaterina

Дата: Четверг, 31.10.2013, 13:29 |
Сообщение № 17

Группа: Пользователи

Ранг: Новичок

Сообщений: 26


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Уже удалила всё что только можно, но весит всё равно много 4 Мб

 

Ответить

Alex_ST

Дата: Четверг, 31.10.2013, 13:39 |
Сообщение № 18

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

К сожалению, моё свободное время закончилось. Убегаю. Проверить сейчас не могу. Самое раннее — вечером.
(а куча хлама, которую Вам выдал макрорекордер, никому нафиг не нужна, т.к. ничего не делает)



С уважением,
Алексей
MS Excel 2003 — the best!!!

 

Ответить

SkyPro

Дата: Четверг, 31.10.2013, 14:06 |
Сообщение № 19

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010


Ну почему ничего ? Скроллит вверхвниз :)

Ekaterina, скопируйте все данные в новый файл. Скорее всего у вас там очень много лишнего (строк, столбцов).


skypro1111@gmail.com

 

Ответить

Alex_ST

Дата: Четверг, 31.10.2013, 19:01 |
Сообщение № 20

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

Ну, описАлся когда аргументы в Range(…) перечислял… Поспешил, не проверил :'(
Наврал в синтаксисе перечисления диапазонов в Range :(
Код исправил в предыдущем посте чтобы на форуме не было ошибочного синтаксиса



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STЧетверг, 31.10.2013, 20:43

 

Ответить

 

KDkd

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

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

Знаю, что такие темы есть, коды из них пыталась применить, но они не работают. Данный код работает только на 1 листе, помогите сделать так, чтобы он работал на всех листах.

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False
For Each cell In Target
 If Not Intersect(cell, Range(«A2:E4»)) Is Nothing Then
    With Cells(cell.Row, 6)
    .Value = Now
    .EntireColumn.AutoFit
    End With
    With Cells(cell.Row, 7)
    .Value = Application.UserName
    .EntireColumn.AutoFit
    End With
  End If
Next cell
Application.EnableEvents = True

End Sub

 

Пытливый

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

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

Как самый простой вариант : повторить код в модуле каждого листа.

Кому решение нужно — тот пример и рисует.

 

KDkd

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

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

#3

30.11.2022 11:05:57

Цитата
написал:
Как самый простой вариант : повторить код в модуле каждого листа.

и как я не додумалась до этого.. :D .. . Спасибо большое!))

 

МатросНаЗебре

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

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

#4

30.11.2022 11:07:44

Ещё вариант, в модуле листа оставить только вызов. А сам макрос поместить в стандартный модуль.

Код
Private Sub Worksheet_Change(ByVal Target As Range)
    myWorksheet_Change Target
End Sub

'Это в стандартный модуль.
Sub myWorksheet_Change(ByVal Target As Range)
Dim cell As Range
Application.EnableEvents = False
For Each cell In Target
 If Not Intersect(cell, Range("A2:E4")) Is Nothing Then
    With Cells(cell.Row, 6)
    .Value = Now
    .EntireColumn.AutoFit
    End With
    With Cells(cell.Row, 7)
    .Value = Application.UserName
    .EntireColumn.AutoFit
    End With
  End If
Next cell
Application.EnableEvents = True

End Sub

А если листов очень много, то посмотрите, как писать макросы макросами.

Programming In The VBA Editor (cpearson.com)

 

Jack Famous

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

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

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#5

30.11.2022 11:13:52

Цитата
МатросНаЗебре: А если листов очень много, то посмотрите, как писать макросы макросами.

или просто написать один макрос для события книги Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  ;)

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

KDkd

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

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

Всем спасибо, Работает!!!)

 

МатросНаЗебре

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

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

#7

30.11.2022 11:22:54

Цитата
Jack Famous написал:
или просто написать один макрос для события книги Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Забираем в копилочку )

Take the code out of the ThisWorkbook module and put it in a normal code module. In Design Mode, in the Excel window (not VBE), right-click the button and do Assign Macro, then choose the macro «Prevw1_Click». That should work. You’ll have to assign the macro to each button, or you could simply copy/paste the button to the other sheets.

If your button is an ActiveX Control, then I think you may need to have the subroutine for each button in the worksheet where the button resides. So, each worksheet may have an activeX command button called «CommandButton1», then each Worksheet code module should have a subroutine like:

Sub CommandButton1_Click()
    Call ClickTheButton
End Sub

You will basically put all of this same code in each of the 10 worksheet code modules. Then, rename your routine in the ordinary code module, like:

Private Sub ClickTheButton()
'============================================
' DAILY PATIENT TIMETABLE
' PRINT PREVIEW
'============================================
    ActiveSheet.Select
    ActiveSheet.AutoFilterMode = False
    Range("_Daily").Select
    ActiveSheet.PageSetup.PrintArea = "_Daily"
'
    Call page_SetUp
'
' Variations for page setup
    With ActiveSheet.PageSetup
        .LeftMargin = Application.InchesToPoints(1.5)
        .RightMargin = Application.InchesToPoints(0.9)
        .Zoom = 75
    End With
    ActiveSheet.PrintPreview
    ActiveSheet.PageSetup.PrintArea = ""
    Range("H126, H126").Select
End Sub

The reason I would do this, instead of copying the existing macro to each of 10 worksheets is simple: If you ever need to modify your subroutine, you only need to modify it in one place. Likewise, if you add a new worksheet(s) you need only copy 3 lines of code instead of 20. It’s just easier to maintain this way, since each sheet’s button is calling the same code, each sheet’s button should just have a simple sub that calls the «main» procedure.

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

Visual Basic
1
ThisWorkbook.Sheets.Select

Далее присвоим активной ячейке (это та, что на активном листе), какое-либо значение, например, 15 и зальём её цветом:

Visual Basic
1
2
ActiveCell = 15
ActiveCell.Interior.Color = RGB(15, 20, 200)

В результате на всех листах книги, в ячейках, имеющих такой же адрес как активная, будет прописано это число. Залиты они будут одинаковым цветом. Только будте осторожны — не «затрите» важной информации: проверить исходное содержимое ячеек на неактивных листах таким образом у Вас не получится.

Автор 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,251
  • Записан

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: Макрос для всех листов книги

Понравилась статья? Поделить с друзьями:
  • Excel применение в профессии
  • Excel приложение не отвечает
  • Excel приемы для работы с данными для анализа
  • Excel привязка формул к ячейке
  • Excel привязка к времени