Excel миф во всех листах книги

Перебор листов в книге Excel циклом For Each… Next с копированием данных из этих листов и вставкой в новый лист той же книги с помощью кода VBA.

Условие задачи по перебору листов

Есть книга Excel с неизвестным количеством рабочих листов с данными. Необходимо выполнить следующие действия:

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

Для открытия книги (получения полного имени) будем использовать диалоговое окно выбора файлов GetOpenFilename, а для перебора листов — цикл For Each… Next.

Пример кода для перебора листов в книге Excel циклом For Each… Next с частичным копированием данных на отдельный лист:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

Sub CopyDataFromAllSheets()

Dim wb As Workbook, newws As Worksheet, ws As Worksheet, n As Long

n = 1

‘Выбираем, открываем нужную книгу и присваиваем ссылку на нее переменной wb

Set wb = Workbooks.Open(Application.GetOpenFilename(«Файлы Excel,*.xls*», , «Выбор файла»))

‘Создаем в открытой книге новый лист и присваиваем ссылку на него переменной newws

Set newws = wb.Worksheets.Add

    With newws

        ‘Присваиваем имя новому листу: «Отчет от dd.mm.yyyy»

        .Name = «Отчет от « & Date

            ‘Запускаем цикл, перебирающий листы

            For Each ws In wb.Worksheets

                ‘Проверяем, что имя текущего листа не равно имени нового листа «Отчет…»

                If ws.Name <> newws.Name Then

                    ‘Копируем столбец «B» текущего листа на лист «Отчет…» в столбец n

                    ws.Columns(«B»).Copy Destination:=.Columns(n)

                    ‘Добавляем ячейку cверху столбца n

                    .Cells(1, n).Insert Shift:=xlShiftDown

                    ‘Записываем в добавленную ячейку имя текущего листа

                    .Cells(1, n) = ws.Name

                    ‘Задаем тексту в добавленной ячейке полужирное начертание

                    .Cells(1, n).Font.Bold = True

                    n = n + 1

                End If

            Next

    End With

End Sub

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


In Excel, you can make it so all of your macros can be easily accessed by any Excel workbook.

To do this we need to create what is called a «personal macro workbook» and then save it.  All of the macros that we want to use in Excel will be stored within this personal macro workbook and will then be accessible by any Excel file.

Steps to Make any Macro Available in All Excel Files

  1. Open an Excel file and then go to record a dummy macro, recording this dummy macro is what will create the «personal macro workbook» that we need in order to store the macros.
  2. To record a macro go to the Developer tab, if that is visible, or simply look to the bottom left of the Excel window.  From there, click the Record Macro button:
    0090ff8f1346bb6e5fd58a4f23a2e878.jpg
  3. On the screen that appears, make sure to select Personal Macro Workbook from the Store macro in: drop down box and then hit the OK button. Nothing else matters here because we just need to record a simple macro, anything really.
    aa5c83eef649501987c1791017105057.png
  4. Select any cell in the worksheet and then just click the Stop Recording macro button, which is in the exact same location as the Record Macro button in step 2.
    4f55b8f6ab9215a22b4f2630cbcf1a80.png
  5. Now hit Alt + F11 on the keyboard so we can go to the VBA/Macro editor window.  You will now see the PERSONAL.XLSB file appear in the top left pane of the window.
    122bce41fec5716168a2e10c8736d184.png
  6. All you have to do now is to add Modules and Macros to this file like you would to any normal Excel file. Double-click Module 1 and we see the macro that we just recorded:
    80a7034fa3c5d613c06bc0f72c54f20c.png

As you can see, this new PERSONAL.XLSB file behaves just like a regular file in the VBA window.  This is where you will store any macros that you want to be able to access from all Excel files.

Notes

The personal macro workbook file does NOT travel with your Excel files when you send them; this PERSONAL.XLSB file only remains on your computer for you to use.  So, if you send a workbook to another person, they will not be able to access the same macros that you have unless you also put those macros in the workbook you sent.

You must follow the above steps to create the personal macro workbook but, once you have created it, you can access it from any workbook on your computer by simply going to the VBA/Macro editor window (Alt + F11).  As such, once it is created, adding macros to this new file is the same as adding it to any other Excel file — open any workbook, go to the VBA window, add a module to the PERSONAL.XLSB file and then add a macro.

The sample file for this tutorial is empty because, remember, you cannot send the personal macro workbook file with Excel files.


Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Similar Content on TeachExcel

Vlookup Function That Searches The Entire Workbook in Excel — UDF

Macro: With this VLOOKUPWORKBOOK function, you will have to power to more quickly and easily ana…

Copy and Paste Data using Macro VBA in Excel

Tutorial: How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this,…

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…

Highlight, Sort, and Group the Top and Bottom Performers in a List in Excel

Tutorial:
How to highlight the rows of the top and bottom performers in a list of data.
This allows…

Sort Data that Doesn’t Have Headers in Ascending Order in Excel

Macro: Sort data that doesn’t have headers in ascending order in Excel with this macro. This is a…

Loop through a Range of Cells in a UDF in Excel

Tutorial:
How to loop through a range of cells in a UDF, User Defined Function, in Excel. This is …

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons

50+ Hours of Video

200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

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

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

 

Ответить

Добрый день, Narimanych, Burk, извиняюсь что не ответил сразу, экстренно улетал в командировку на дальние рубежи Родины (без досутпа в сеть). Спасибо за Ваши отклики!

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

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

Т.е. макрос выдает адрес ячейки ‘2 Apr 2019’!A13, другая формула должна считать по такому алгоритму:

=’2 Apr 2019′!A13/СРЗНАЧ(‘1 Apr 2019:7 Apr 2019’!A1:A200)

т.е. нужно найти отношение найденного уникального значения к среднему арифметическому задаваемого диапазона на задаваемом листе. Смысл в том, что бы можно было получать адрес, и потом получая через ДВССЫЛ числовое значение этой ячейки сравнивать его с другими средними, максимальными, минимальными значениями диапазаона.

и использовать номер листа что бы искать другие значения в других столбцах той же строки, например = ‘2 Apr 2019’!B13

Cпасибо!

 

AmegaMSK

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

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

#1

18.10.2013 23:53:55

Добрый вечер!
Подскажите, пожалуйста, почему мой макрос останавливается, не отработав все открытые книги?
Вроде цикл указала правильно, но из 10 открытых книг обрабатываются сначала 5, потом я запускаю макрос еще раз, он обрабатывает еще 4, и потом еще раз запуск макроса — и он обрабатывает последнюю книгу.
Что я сделала не так?
Прилагаю код:

Код
Dim wb As Workbook
For Each wb In Workbooks
.......
.......
.......
Next
End Sub
 

Kuzmich

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

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

А где перебор всех листов?

 

AmegaMSK

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

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

Цель — перебор всех листов во всех открытых книгах.
Или лучше выложить весь макрос? (Он не очень большой)

 

Kuzmich

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

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

Какое действие выполняется при выборе очередного листа ?

 

AmegaMSK

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

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

#5

19.10.2013 00:05:55

Код
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
 

Kuzmich

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

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

А зачем столько циклов(кажется 4) по листам очередной книги?
Книга, где макрос, тоже открытая книга, вы ее тоже обрабатываете?
Columns(«IU:IV»).EntireColumn.Hidden = True это в каком листе вы скрываете столбцы?

 

AmegaMSK

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

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

Макрос у меня не в «эта книга», а в «все открытые книги», поэтому нет, лишнее не обрабатывается.
Столбцы скрываю во всех листах книги, чтобы данные вписанные макросом (имя листа и формула рядом) не пошли на печать.
А с циклами — я не профессионал, я только учусь :)

 

Kuzmich

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

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

#8

19.10.2013 00:47:46

Попробуйте так

Код
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

 

AmegaMSK

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

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

Обработал 7листов, потом 2 листа и потом еще 1 лист.
Почему-то останавливается  :(

Изменено: AmegaMSK19.10.2013 00:58:50

 

Kuzmich

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

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

Попробуйте выполнить макрос в пошаговом режиме, те ли книги перебираются
все ли листы обрабатываются.

 

AmegaMSK

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

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

Стоп! Я вас дезинформировала!
Я скопировала ваш код без первых двух строк, поспешила на радостях  :)
Полностью код не работает, пишет ошибку на этой строчке «Option Explicit»
Текст ошибки «invalid inside procedure»

Изменено: AmegaMSK19.10.2013 01:30:33

 

Kuzmich

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

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

#12

19.10.2013 13:23:14

Цитата
Обработал 7листов, потом 2 листа и потом еще 1 лист.

Так листов или книг? Может у вас не хватает памяти, когда открыты все 10 книг?
Я, обычно, все книги помещаю в один каталог и обрабатываю их последовательно:
открываю первую книгу, делаю действия и закрываю книгу, затем открываю следующую.
Как ведет себя макрос, который записан во всех открытых книгах, я не знаю .
Option Explicit — это явное объявление переменных

 

ikki

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

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

логическая ошибка
надо писать wb.Worksheets.Count, wb.Worksheets(s).Activate и т.п.
иначе — подобные команды применяются всегда к активной книге

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

AmegaMSK

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

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

Kuzmich, книг, конечно, книг  :)  
ikki, заменила в макросе Worksheets.Count на wb.Worksheets.Count и Worksheets(s).Activate на wb.Worksheets(s).Activate по вашему совету, однако результат тот же — макрос останавливается, как и прежде.

 

ikki

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

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

#15

19.10.2013 14:15:10

не увидел ответа на

Цитата
Попробуйте выполнить макрос в пошаговом режиме, те ли книги перебираются
все ли листы обрабатываются.

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

AmegaMSK

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

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

Попробовала, обрабатываются ВСЕ листы в открытых книгах (Именно каждый лист, как и было задумано!). Перед отправкой на печать тоже обрабатывается каждый лист. Обработанные книги закрываются без сохранения. Но макрос останавливается, приходится его еще раз запускать, далее все по тому же сценарию.
Т. е. все правильно работает, но с остановками.

 

Kuzmich

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

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

#17

19.10.2013 14:56:11

Цитата
Обработанные книги закрываются без сохранения.

А где в коде макроса книги закрываются?

 

AmegaMSK

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

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

Я так понимаю, что вот тут
       ActiveWindow.Close False

 

Kuzmich

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

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

Не знаю ActiveWorkbook.Close False и ActiveWindow.Close False это одно и то же?

 

AmegaMSK

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

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

Не знаю, так рекордер записал.
Я заменила на ActiveWorkbook.Close False, но ничего не изменилось.

 

ikki

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

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

#21

19.10.2013 15:34:39

Цитата
ActiveWorkbook.Close False и ActiveWindow.Close False это одно и то же?

не всегда.
у одной книги может быть открыто более одного окна.
в этом случае ActiveWindow.Close приведёт к закрытию одного из окон (активного), но не файла.

фрилансер Excel, VBA — контакты в профиле
«Совершенствоваться не обязательно. Выживание — дело добровольное.» Э.Деминг

 

tigor

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

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

Так чем сердце успокоилось?

У меня похожая задача — нужно, чтоб макрос выполнялся во всех листах, во всех открытых книгах, кроме файла с макросом (thisworkbook???)
Предварительный план такой — Пересчитать открытые книги, организовать цикл через IF. Я хз…

 

Mershik

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

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

#23

28.02.2021 17:26:50

Цитата
tigor написал:
Преварительный план такой

создать свою тему, описать задачу  показать желаемый результат

Не бойтесь совершенства. Вам его не достичь.

 

tigor

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

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

#24

28.02.2021 17:36:29

Цитата
Mershik написал:
создать свою тему, описать задачу  показать желаемый результат

не хочу засорять форум копеечными темами. Может когда припрет… Спасибо.

 

Mershik

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

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

#25

28.02.2021 17:43:21

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

Не бойтесь совершенства. Вам его не достичь.

 

tigor

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

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

Mershik, Спасибо большое, но возникла такая же проблема проблема, что и у автора ветки. После прохода 3-4 файлов (всего их 13) эксель вылетает.  Некоторые файлы получились с ошибками.

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

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

З.Ы. Может есть какой-то  tmp, который переполняется? И его надо почистить?  

Изменено: tigor01.03.2021 02:11:22

 

Евгений Смирнов

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

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

#27

01.03.2021 09:28:21

Что касается сообщения 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

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

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

Евгений Смирнов, спасибо, попробуем

 

tigor

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

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

Заметил причину сбоев — в некоторых книгах были скрытые листы. Возможно, у автора поста было тоже самое, на этих книгах макрос и затыкался.

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

 

New

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

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

#30

02.03.2021 14:11:34

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

Изменено: New02.03.2021 14:25:30

Понравилась статья? Поделить с друзьями:
  • Excel миф with range cells
  • Excel миф with function
  • Excel миф with access
  • Excel миф while do while
  • Excel миф on time