Помогаем и разъясняем взаимодействие с ПО Ворд и Эксель на WordExceler.ru
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, вот этот макрос. Только прошу сильно не смеяться Я не умею писать макросы, так что делала его просто с помощью кнопки «запись макроса», потом зашла в «изменить макрос» и добавила пароль защиты листа. Где тут в этом коде надо поменять так, чтобы он применялся сразу ко всем листам? Спасибо!
Этого достаточно? Или нужно весь файл выкладывать?
Ответить
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
Знаю, что такие темы есть, коды из них пыталась применить, но они не работают. Данный код работает только на 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
Цитата
написал: Как самый простой вариант : повторить код в модуле каждого листа.
и как я не додумалась до этого.. .. . Спасибо большое!))
МатросНаЗебре
Пользователь
Сообщений: 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
А если листов очень много, то посмотрите, как писать макросы макросами.
МатросНаЗебре: А если листов очень много, то посмотрите, как писать макросы макросами.
или просто написать один макрос для события книги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 и зальём её цветом:
В результате на всех листах книги, в ячейках, имеющих такой же адрес как активная, будет прописано это число. Залиты они будут одинаковым цветом. Только будте осторожны — не «затрите» важной информации: проверить исходное содержимое ячеек на неактивных листах таким образом у Вас не получится.
Пожалуйста, подскажите, как сделать, чтобы этот макрос работал на всех листах книги, а не только на активном?
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