Перебор листов в книге 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
- 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.
- 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:
- 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.
- 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.
- 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.
- 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:
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 — 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 — 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
Как применить макрос сразу ко всей книге целиком? |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Добрый день, 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 |
#1 18.10.2013 23:53:55 Добрый вечер!
|
||
Kuzmich Пользователь Сообщений: 7998 |
А где перебор всех листов? |
AmegaMSK Пользователь Сообщений: 41 |
Цель — перебор всех листов во всех открытых книгах. |
Kuzmich Пользователь Сообщений: 7998 |
Какое действие выполняется при выборе очередного листа ? |
AmegaMSK Пользователь Сообщений: 41 |
#5 19.10.2013 00:05:55
|
||
Kuzmich Пользователь Сообщений: 7998 |
А зачем столько циклов(кажется 4) по листам очередной книги? |
AmegaMSK Пользователь Сообщений: 41 |
Макрос у меня не в «эта книга», а в «все открытые книги», поэтому нет, лишнее не обрабатывается. |
Kuzmich Пользователь Сообщений: 7998 |
#8 19.10.2013 00:47:46 Попробуйте так
|
||
AmegaMSK Пользователь Сообщений: 41 |
Обработал 7листов, потом 2 листа и потом еще 1 лист. Изменено: AmegaMSK — 19.10.2013 00:58:50 |
Kuzmich Пользователь Сообщений: 7998 |
Попробуйте выполнить макрос в пошаговом режиме, те ли книги перебираются |
AmegaMSK Пользователь Сообщений: 41 |
Стоп! Я вас дезинформировала! Изменено: AmegaMSK — 19.10.2013 01:30:33 |
Kuzmich Пользователь Сообщений: 7998 |
#12 19.10.2013 13:23:14
Так листов или книг? Может у вас не хватает памяти, когда открыты все 10 книг? |
||
ikki Пользователь Сообщений: 9709 |
логическая ошибка фрилансер Excel, VBA — контакты в профиле |
AmegaMSK Пользователь Сообщений: 41 |
Kuzmich, книг, конечно, книг |
ikki Пользователь Сообщений: 9709 |
#15 19.10.2013 14:15:10 не увидел ответа на
фрилансер Excel, VBA — контакты в профиле |
||
AmegaMSK Пользователь Сообщений: 41 |
Попробовала, обрабатываются ВСЕ листы в открытых книгах (Именно каждый лист, как и было задумано!). Перед отправкой на печать тоже обрабатывается каждый лист. Обработанные книги закрываются без сохранения. Но макрос останавливается, приходится его еще раз запускать, далее все по тому же сценарию. |
Kuzmich Пользователь Сообщений: 7998 |
#17 19.10.2013 14:56:11
А где в коде макроса книги закрываются? |
||
AmegaMSK Пользователь Сообщений: 41 |
Я так понимаю, что вот тут |
Kuzmich Пользователь Сообщений: 7998 |
Не знаю ActiveWorkbook.Close False и ActiveWindow.Close False это одно и то же? |
AmegaMSK Пользователь Сообщений: 41 |
Не знаю, так рекордер записал. |
ikki Пользователь Сообщений: 9709 |
#21 19.10.2013 15:34:39
не всегда. фрилансер Excel, VBA — контакты в профиле |
||
tigor Пользователь Сообщений: 17 |
Так чем сердце успокоилось? У меня похожая задача — нужно, чтоб макрос выполнялся во всех листах, во всех открытых книгах, кроме файла с макросом (thisworkbook???) |
Mershik Пользователь Сообщений: 8277 |
#23 28.02.2021 17:26:50
создать свою тему, описать задачу показать желаемый результат Не бойтесь совершенства. Вам его не достичь. |
||
tigor Пользователь Сообщений: 17 |
#24 28.02.2021 17:36:29
не хочу засорять форум копеечными темами. Может когда припрет… Спасибо. |
||
Mershik Пользователь Сообщений: 8277 |
#25 28.02.2021 17:43:21 tigor, ну попробуйте так:
Не бойтесь совершенства. Вам его не достичь. |
||
tigor Пользователь Сообщений: 17 |
Mershik, Спасибо большое, но возникла такая же проблема проблема, что и у автора ветки. После прохода 3-4 файлов (всего их 13) эксель вылетает. Некоторые файлы получились с ошибками. Прийдется вызывать файлы по очереди через DIR Cпасибо вам большое за помощь. З.Ы. Может есть какой-то tmp, который переполняется? И его надо почистить? Изменено: tigor — 01.03.2021 02:11:22 |
Евгений Смирнов Пользователь Сообщений: 539 |
#27 01.03.2021 09:28:21 Что касается сообщения 5 то наверно так будет работать
|
||
tigor Пользователь Сообщений: 17 |
Евгений Смирнов, спасибо, попробуем |
tigor Пользователь Сообщений: 17 |
Заметил причину сбоев — в некоторых книгах были скрытые листы. Возможно, у автора поста было тоже самое, на этих книгах макрос и затыкался. Позже выложу файл примера с макросом. Может кому и ссгодится. |
New Пользователь Сообщений: 4581 |
#30 02.03.2021 14:11:34 tigor, просто добавьте проверку на скрытый лист
Изменено: New — 02.03.2021 14:25:30 |
||