Excel цикл по листам книги excel

{quote}{login=Паша}{date=28.05.2010 04:46}{thema=}{post}Sub one()  

  Dim sh As Sheets  

  For Each sh In Workbook.Sheets  
If sh.Name <> «Сводная» Then  
Range(«A1:AK37»).Select  
   Selection.Copy  
   Sheets(«Ñâîäíàÿ»).Select  
   Range(«L28»).Select  
   ActiveSheet.Paste  
End If  
Next  
End Sub  

      сделал такой макрос который копирует всё в одно место что бы посмоотреть F8 как он вставляет попеременно всё, выдаёт ошибку Метод ор дата мембер нот фаунд и выделяет строку с IF. А если не прописывать Dim sh as shеet то выдаёт Object Required и выделяет первую строку For each…. И ещё к End приписал If так как выдаёт Next whithout For{/post}{/quote}  

  просто вы обявили не тот тип    

    sheets — это коллекция листов, а вам нужно тип элементов этой коллекции, но и тут может быть засада — объекта sheet не существует, а если использовать worksheet , то не все листы могут быть рабочими, встречаются меж ними и листы диаграмм, макросов и т.п. так что использование универсального обявления object в данном случае самое оно, но я к тому, что можно вообще не объявлять тип, тогда транслятор сам присвоит тип вариант, кот очень даже прокатит..

Перебор листов в книге 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

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


Аннотация

Данная статья содержит 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 для приложений

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

Содержание

  1. Макрос для перебора всех листов в книге
  2. Аннотация
  3. Дополнительная информация
  4. Ссылки
  5. Macro to Loop Through All Worksheets in a Workbook
  6. Summary
  7. More Information
  8. References
  9. VBA For Each примеры
  10. Сила циклов VBA
  11. Как работает цикл For Next?
  12. Два типа циклов For Next
  13. The For Each Next Loop: цикл по коллекции элементов
  14. В каком порядке работает цикл For Each?
  15. Предметы / объекты НЕ выбираются в цикле
  16. The Next Loop: циклы через набор чисел
  17. Обратный цикл
  18. Как остановить цикл раньше
  19. Переменная не требуется после ключевого слова Next
  20. Примеры макросов VBA для циклов
  21. Какую задачу хотите зациклить вы?

Макрос для перебора всех листов в книге

Аннотация

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

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

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

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

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

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

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

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

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

Ссылки

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

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

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

Источник

Macro to Loop Through All Worksheets in a Workbook

Summary

This article contains a Microsoft Visual Basic for Applications macro (Sub procedure) that loops through all the worksheets in the active workbook. This macro also displays the name of each worksheet.

More Information

Microsoft provides programming examples for illustration only, without warranty either expressed or implied. This includes, but is not limited to, the implied warranties of merchantability or fitness for a particular purpose. This article assumes that you are familiar with the programming language that is being demonstrated and with the tools that are used to create and to debug procedures. Microsoft support engineers can help explain the functionality of a particular procedure, but they will not modify these examples to provide added functionality or construct procedures to meet your specific requirements. To try the sample macro, follow these steps:

Type the following macro code into a new module sheet.

To run the macro, position the insertion point in the line that reads «Sub WorksheetLoop(),» and press F5.

The macro will loop through the workbook and display a message box with a different worksheet name each time it runs through the loop. Note that this macro will only display worksheet names; it will not display the names of other types of sheets in the workbook.

You can also loop through all of the worksheets in the workbook by using a ‘For Each’ loop.

Enter the following macro code into a new module sheet.

To run the macro, position the insertion point in the line that reads «Sub WorksheetLoop2(),» and press F5.

This macro works identically to the WorksheetLoop macro, except that it uses a different type of loop to process all of the worksheets in the active workbook.

References

For additional information about getting help with Visual Basic for Applications, please see the following article in the Microsoft Knowledge Base:

163435 VBA: Programming Resources for Visual Basic for Applications

226118 OFF2000: Programming Resources for Visual Basic for Applications

Источник

VBA For Each примеры

Итог: циклы For Next — одни из самых мощных методов VBA для автоматизации общих задач в Excel. В этой статье объясняется, как работает цикл, повторяющий действия над коллекцией элементов, что экономит нам массу времени.

Уровень мастерства: Средний

Сила циклов VBA

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

Можете ли вы вспомнить несколько задач, в которых вам приходилось повторять один и тот же процесс снова и снова?

Эти задачи чрезвычайно трудоемкие и скучные!

К счастью, выход есть. Мы можем использовать циклы в наших макросах VBA, чтобы очень быстро повторять действия. Задачи, выполнение которых вручную может занять несколько часов, могут быть выполнены за несколько секунд с помощью цикла.

Цикл For Next — это наиболее распространенный тип цикла, который помогает нам выполнять эти повторяющиеся задания. В этой статье мы рассмотрим два типа For Next Loops.

Загрузите файл примера

Загрузите бесплатный файл Excel, содержащий примеры макросов с помощью цикла For Next.

For Next Loop VBA Macro Examples.xlsm (79.0 KB)

Скачать PDF версию статьи на английском для печати.

Как работает цикл For Next?

Цикл For Next позволяет нам просматривать коллекцию, элементами которой могут быть объекты или списки чисел.

  • Клетки в ассортименте.
  • Рабочие листы в рабочей тетради.
  • Открытые рабочие тетради на компьютере.
  • Сводные таблицы на листе.
  • Сводные поля в сводной таблице.
  • Формы на листе.
  • И любой другой объект, с которым вы взаимодействуете в Excel.

Задача цикла For Next Loop состоит в том, чтобы выполнять одинаковые действия (строки кода) для каждого элемента в коллекции.

В приведенном ниже примере содержится цикл For Next, который проходит по каждому листу в книге и отображает каждый лист. Цикл начинается с первого элемента в коллекции (первый лист в рабочей книге) и выполняет строку кода между строками For и Next для каждого элемента в коллекции (каждый лист в рабочей книге).

Конечно, мы можем использовать логические операторы, такие как операторы If, для проверки свойств и условий перед выполнением действий.

Следующий макрос отображает только те листы, которые имеют фразу «ABC Global Co.» в ячейке A1 каждого листа, и скрывает все остальные листы.

Два типа циклов For Next

Действительно, существуют два типа For Next Loops.

  1. For Each Next Loops циклически просматривает коллекцию элементов.
  2. For Next Loops цикл через набор чисел.

Давайте посмотрим, как работает каждый.

The For Each Next Loop: цикл по коллекции элементов

Как мы видели выше, цикл «The For Each Next Loop» позволяет нам перебирать коллекцию предметов или объектов. Это, наверное, самый распространенный цикл, который мы используем в Excel, потому что мы работаем с коллекциями объектов. Опять же, эти коллекции представляют собой ячейки в диапазоне, рабочие таблицы в рабочей книге, сводные таблицы в рабочей таблице и т.д.

Мы будем использовать пример написания цикла «For Each Next Loop», чтобы просмотреть все рабочие листы в рабочей книге.

Существует четыре основных шага для написания цикла For Each Next в VBA:

  1. Объявите переменную для объекта.
  2. Напишите для каждой строки переменную и коллекцию ссылок.
  3. Добавьте строку (и) кода для повтора для каждого элемента в коллекции.
  4. Напишите следующую строку, чтобы закрыть цикл.

Давайте рассмотрим каждый из этих шагов подробно.

Шаг 1 — объявить переменную для объекта

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

Строка Dim в верхней части макроса объявляет переменную, как объект. В этом случае объект является рабочим листом. Мы можем создать любое имя переменной, если захотим, если оно не совпадает с другой ссылкой в VBA. «Ws» — наиболее распространенное имя переменной для объекта листа, но вы можете изменить его.

Шаг 2 — Для каждой строки

Далее мы напишем оператор For Each. Это первая строка кода в цикле.

Первые два слова For Each. Затем мы вводим имя переменной, за которым следует слово In. Наконец, мы указываем, где располагается коллекция. В этом случае мы хотим просмотреть все рабочие листы в ActiveWorkbook. Итак, мы набираем ActiveWorkbook.Worksheets. Эта строка ссылается на все рабочие листы в ActiveWorkbook.

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

Просто помните, что рабочая книга, на которую вы ссылаетесь, должна быть открыта до запуска строки кода For Next. Конечно, мы можем использовать метод Workbooks.Open, чтобы открыть рабочую книгу.

Шаг 3 — Добавить код для повторения для каждой итерации

После строки «For Each» мы добавляем строку(и) кода, которая будет выполняться на каждом листе. В этом примере у нас есть только одна строка кода, которая показывает лист.

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

Это так же, как если бы мы установили переменную ws для определенного листа, используя следующую строку кода.

Однако нам НЕ нужна эта строка с циклом For Each Next. Цикл заботится о настройке переменной для нас для каждой итерации в цикле.

Для первой итерации в цикле ws установлен на Worksheets (1). На следующей итерации ws устанавливается в Worksheets (2). Это продолжается, пока цикл перебирает все листы в рабочей книге. Это очень мощно, потому что мы можем повторно использовать переменную для ссылки на лист в цикле несколько раз.

Шаг 4 — Next закрывает цикл

Последняя строка кода в цикле — Next.

Когда макрос попадает в эту строку кода, он делает две вещи:

  1. Во-первых, он изменяет ссылку на переменную на следующий элемент коллекции. В этом примере переменная ws изменяется для ссылки на следующий лист в рабочей книге.
  2. Во-вторых, он возвращается к выполнению строки кода непосредственно под строкой For Each. Затем он выполняет все строки кода между строками For Each и Next в порядке сверху вниз.

Когда будет достигнут последний элемент в коллекции (рабочий лист в рабочей книге), цикл останавливается, и макрос переходит к следующей строке кода ниже строки Next.

В каком порядке работает цикл For Each?

Цикл For Each Loop всегда начинается с первого элемента в коллекции и переходит к последнему элементу в том порядке, в котором они отображаются в Excel. Это основано на номере индекса предметов в коллекции. Вот несколько примеров порядка выполнения цикла для общих объектов.

  • Рабочие листы. Начинается с первой вкладки листа в рабочей книге и возвращается к последней в том порядке, в котором вкладки отображаются в рабочей книге.
  • Рабочие книги. Начинается с первой открытой книги и циклически повторяется в порядке открытия рабочих книг. Рабочим книгам присваивается порядковый номер по мере их открытия.
  • Клетки: циклы слева направо, затем вниз. Начинается с первой ячейки в диапазоне и возвращается к следующему столбцу в той же строке, затем переходит к следующей строке.
  • Таблицы и сводные таблицы. Начинается с первого объекта, созданного на листе, и циклически повторяется в порядке создания объектов. Этот же принцип действует и для других объектов, которые вы создаете на листах, таких как фигуры, диаграммы, слайсеры и т.д.

Предметы / объекты НЕ выбираются в цикле

Важно отметить, что когда мы перебираем коллекцию объектов, каждый объект НЕ выделяется в Excel.

Цикл создает ссылку на элемент/объект с помощью переменной. Переменная временно установлена на ссылку на объект. Объект НЕ выбран и НЕ обязательно становится активным объектом. Для выбора объекта мы можем использовать методы Select или Activate. Вы также должны убедиться, что объекты родительского объекта выбраны первыми. Ознакомьтесь с моей статьей об объектной модели Excel и иерархии объектов в VBA, чтобы узнать больше об этом.

The Next Loop: циклы через набор чисел

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

Основная операция цикла For Next такая же, как и для цикла For Each. Разница заключается в формате строки For.

Шаг 1 — Объявление переменной для числа

Чтобы перебрать набор чисел, мы сначала должны объявить переменную для целого числа типа данных. Мы можем использовать Integer или Long integer.

Переменная называется счетчиком, потому что она увеличивается или уменьшается вверх/вниз для каждой итерации в цикле.

Дополнительное примечание к Long: тип данных Long (целое число) содержит большее число, чем Integer. Это занимает больше памяти, но для современного компьютера это не проблема. Мы можем использовать длинные переменные все время. Буква L выглядит как цифра 1 в VBA, поэтому я теперь использую i в качестве имени переменной, хотя я использую Long в качестве типа данных. Это все зависит от личных предпочтений, и вы можете назвать переменную как хотите.

Шаг 2 — Напишите строку For

Далее мы пишем строку For. Базовая конструкция — это ключевое слово For, за которым следует имя переменной (counter), затем знак равенства, начальное значение To end value.

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

Эта строка кода возвращает количество листов в активной книге. Тем не менее, он не проходит по каждому листу. Цикл просто перебирает набор чисел. Мы должны создать ссылку на лист с переменной счетчика (i) в качестве номера индекса свойства Worksheets. Шаг 3 показывает эту ссылку.

Шаг 3 — Добавить код, который повторяется для каждой итерации

Остальная часть цикла работает так же, как цикл For Each. Мы можем добавить строки между строками For и Next, которые будут выполняться для каждой итерации цикла. Переменная counter может быть использована несколько раз в этих строках кода.

Шаг 4 — Строка Next закрывает цикл

Наконец, мы добавляем строку Next внизу.

Когда макрос запускается, он устанавливает переменную, равную первому числу в строке For. Когда макрос попадает в следующую строку, он добавляет 1 к значению переменной или увеличивает счет. Итак, я = 2 во второй итерации цикла. Он продолжает цикл, пока не будет достигнут последний номер в цикле.

По умолчанию 1 добавляется к счетчику переменных для каждой итерации в цикле. Это называется значением шага, и мы можем контролировать значение каждого шага в счетчике. Значение Step добавляется в конец строки For. Следующая строка добавит 2 к счетчику для каждой итерации в цикле.

Если вы хотите заштриховать все остальные строки на листе, вы можете использовать такой цикл.

Обратный цикл

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

Обратите внимание, что начальное значение теперь больше, а конечное значение меньше. Циклы начинаются с 100 (начальное значение) и вычитают 1 из переменной счетчика (шаг -1) для каждой итерации в цикле, пока не дойдут до 1 (конечное значение).

Ключевое слово Step не является обязательным. Если вы не укажете его, тогда VBA примет значение шага 1.

Цикл в обратном направлении — это хорошо, если вы удаляете элементы.

Я напишу отдельный пост об этом, но общая идея заключается в том, что когда мы перебираем коллекцию и удаляем элементы, размер коллекции уменьшается при удалении элементов. Цикл обычно выдает ошибку, как только достигает 10-го элемента, когда в коллекции теперь только 9 элементов. Цикл в обратном направлении предотвращает эту потенциальную ошибку.

Как остановить цикл раньше

Обычно цикл перебирает все элементы в коллекции, а затем переходит к следующей строке кода ниже следующей строки. Однако мы можем остановить цикл раньше с помощью оператора Exit For.

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

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

Переменная не требуется после ключевого слова Next

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

Это НЕ обязательно, и вы можете не увидеть его в других примерах, которые вы найдете в Интернете. Однако мне нравится включать переменную после Next по двум причинам.

  1. Мы можем использовать его при отладке кода, чтобы увидеть значение переменной, наведя указатель мыши на переменную, когда код остановлен.
  2. Это облегчает понимание того, к какой строке For подключена следующая строка. Это особенно верно, когда у вас есть несколько циклов или вложенных циклов в ваших макросах.

Поэтому я рекомендую добавить переменную после ключевого слова Next в качестве лучшей практики. Немного дополнительной работы заранее сэкономит время и головную боль в будущем. Доверьтесь мне!

Примеры макросов VBA для циклов

Вот дополнительные статьи с макросами, в которых используется хотя бы один цикл For Next Loop.

Макрос метрики SUBTOTAL — создание сводной таблицы всех типов функций

Как добавить оглавление Галерея изображений в файлы Excel

Скрыть и отобразить (отфильтровать) столбцы с помощью слайсера или раскрывающегося меню фильтра

Как изменить размер панелей Excel для разных размеров экрана

Макрос VBA, чтобы скрыть все столбцы, которые содержат значение в ячейке

Как повторять задачи с помощью кода VBA — Looping — Отличная статья с большим количеством примеров от моего друга Криса Ньюмана из The Spreadsheet Guru.

Какую задачу хотите зациклить вы?

Я надеюсь, что эта статья поможет вам начать работу с циклами. Не забудьте скачать бесплатный файл Excel, содержащий примеры кода.

For Next Loop VBA Macro Examples.xlsm (79.0 KB)

Циклы, безусловно, являются промежуточной техникой кодирования, которая вынуждает нас выйти за рамки MacroRecorder. К сожалению, записанный макрос не может создавать петли. Тем не менее, это навык, который вы сможете использовать снова и снова на протяжении всей своей карьеры для автоматизации простых и сложных задач. Понимание того, как использовать циклы, даст вам волшебную силу с 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!

Содержание

  • 1 Оператор цикла «For» в Visual Basic
    • 1.1 Цикл «For … Next»
    • 1.2 Цикл «For Each»
    • 1.3 Оператор прерывания цикла «Exit For»
  • 2 Цикл «Do While» в Visual Basic
  • 3 Цикл «Do Until» в Visual Basic

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

Excel

таблицей БЕЗ макросов и дополнительных модулей (функций пользователя).

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

Первый шаг, чтобы начать работать с циклическими ссылками – это разрешить итеративные вычисления в Excel. В версии Microsoft Office XP это делается в разделе меню «Сервис – Параметры»:

как сделать цикл в excel

В открывшемся окне активируем соответствующий флажок:

как сделать цикл в excel

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

!Информация: В Excel 2007 включение итеративных вычислений производится в пункте меню «Файл – Параметры Excel» в разделе «Формулы».

Рассмотрим пример использования итеративных вычислений в виде цикла.

Впишите в ячейку А1 формулу:

Если значение предельного числа итераций равно 100, то результатом вычислений в ячейке А1 будет равно 100. Теперь изменим формулу:

как сделать цикл в excel

Как видите число итераций мы ограничили числом в ячейке А2, а именно 10. Чтобы проиллюстрировать, как происходят итерации, добавим формулу в ячейку B2:

как сделать цикл в excel

Как видите, каждый этап итерации (новое значение А1) добавляется к ячейке B1 до тех пор пока происходят итерации.

!Замечание: Возможно, результат в B2 будет не таким – для того, чтобы исправить это сделайте следующее: после ввода формулы в ячейку B1 перейдите в ячейку A1, установите курсор в поле редактирования формулы и нажмите Enter – произойдет пересчет итераций. Для корректной работы итераций необходимо задать ряд дополнительных условий, ограничивающих их количество и задающее условие сброса текущего значения поля в исходное значение. Пересчет всех ячеек с циклическими ссылками происходит каждый раз при изменении ячеек, от которых они зависят.

!Дополнительные ссылки:

Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.

К циклам VBA относятся:

  • Цикл For
  • Цикл Do While
  • Цикл Do Until

Далее мы подробно рассмотрим каждый из этих циклов.

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

For i = 1 To 10     Total = Total + iArray(i)  Next i

В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение . Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.

For d = 0 To 10 Step 0.1     dTotal = dTotal + d  Next d

Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

For i = 10 To 1 Step -1     iArray(i) = i  Next i

Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Dim wSheet As Worksheet    For Each wSheet in Worksheets     MsgBox "Найден лист: " & wSheet.Name  Next wSheet

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:

For i = 1 To 100     If dValues(i) = dVal Then        IndexVal = i        Exit For     End If  Next i

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

'Процедура Sub выводит числа Фибоначчи, не превышающие 1000  Sub Fibonacci()     Dim i As Integer 'счётчик для обозначения позиции элемента в последовательности     Dim iFib As Integer 'хранит текущее значение последовательности     Dim iFib_Next As Integer 'хранит следующее значение последовательности     Dim iStep As Integer 'хранит размер следующего приращения       'инициализируем переменные i и iFib_Next     i = 1     iFib_Next = 0     'цикл Do While будет выполняться до тех пор, пока значение     'текущего числа Фибоначчи не превысит 1000       Do While iFib_Next < 1000        If i = 1 Then           'особый случай для первого элемента последовательности           iStep = 1           iFib = 0        Else           'сохраняем размер следующего приращения перед тем, как перезаписать           'текущее значение последовательности           iStep = iFib           iFib = iFib_Next        End If          'выводим текущее число Фибоначчи в столбце A активного рабочего листа        'в строке с индексом i        Cells(i, 1).Value = iFib        'вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1        iFib_Next = iFib + iStep        i = i + 1     Loop    End Sub

В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do  ...  Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

iRow = 1  Do Until IsEmpty(Cells(iRow, 1))     'Значение текущей ячейки сохраняется в массиве dCellValues     dCellValues(iRow) = Cells(iRow, 1).Value     iRow = iRow + 1  Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

Однако, как было показано в примерах цикла Do While, в некоторых ситуациях нужно, чтобы цикл был выполнен хотя бы один раз, не зависимо от первоначального результата условного выражения. В таком случае условное выражение нужно поместить в конце цикла, вот так:

Do  ...  Loop Until IsEmpty(Cells(iRow, 1))

Урок подготовлен для Вас командой сайта office-guru.ru
Источник: /> Перевел: Антон Андронов

Правила перепечаткиЕще больше уроков по Microsoft Excel

Оцените качество статьи. Нам важно ваше мнение:

Добрый день!
Неделю пытаюсь разобраться с макросами в Excel — выходит признаюсь честно плохо…
Решение задачи так и не нашла. Надеюсь вы сумеете мне подсказать куда конкретнее направить свою активность.

Задача передо мной стоит такая:

ячейка A1 содержит значение, которое я с помощью формул разбиваю на диапазон ячеек (задействовано 276 ячеек) целыми числами. Но при разбивке образуется дельта округления. Так вот мне необходимо эту дельту целыми числами доразнести в уже заполненные формулами ячейки например по порядку.
Например если дельта = 117, а диапазон 276, то в первые 117 ячеек прибавляем по 1, а остальные не трогаем.

Подскажите, пожалуйста, возможно ли вообще это описать для Excel?

   Fish

23.10.08 — 14:18

Добрый день. У меня небольшая проблемка:

Открываю файл экселя как комобъект:

Экс = Новый COMОбъект(«Excel.Application»);

Книга = Экс.WorkBooks.Open(ПутьКЭкселю);

НомерСтраницыВКниге = 1;

ВсегоСтраницВКниге = Книга.WorkSheets.Count;

далее хочу обойти страницы книги в цикле:

Пока НомерСтраницыВКниге <= ВсегоСтраницВКниге Цикл

Страница = Книга.WorkSheets(НомерСтраницыВКниге);

ТекСтраница = Книга.Worksheets(Страница.Name).Activate;





КонецЦикла;

Ругается, что «Поле объекта не обнаружено (Activate)», подскажите как перебрать страницы.

   111222333444

1 — 23.10.08 — 14:25

Без скобок происходит обращение к свойствам. В данном случае нужен метод. Соответственно — Activate()

   dk

2 — 23.10.08 — 14:26

ТекСтраница = Книга.Worksheets(Страница.Name).Activate;

заменить на

Страница.Activate();

   Fragster

3 — 23.10.08 — 14:27

А зачем ее активировать? данные и так тырить через Книга.Worksheets(Страница.Name).Cells(x,y).value можно

   Kolyasik

4 — 23.10.08 — 14:28

а зачем активейт? ты и так получил страницу… делай с ней что хочешь… %)

   smaharbA

5 — 23.10.08 — 14:28

Листы=Книга.WorkSheets;
Для каждого Лист из Листы Цикл
  Сообщить(Лист.Name);
...

либо

Листы=Книга.WorkSheets;
Для к=1 По Листы.Count Цикл
  Лист=Листы.Item(к);
  Сообщить(Лист.Name);
...
   Voffka

6 — 23.10.08 — 14:36

Excel = новый COMОбъект(«Excel.Application»);

   
   Excel.WorkBooks.Open(ИмяФайлаЭксель);

   //WorkBooks = Эксель.WorkBooks();

   КоличествоЛистовКниги = Excel.Sheets().count();

   
   //Сообщить(«КоличествоЛистовКниги » + КоличествоЛистовКниги);

   
   Лист = Excel.Sheets(1);

   ИмяЛиста = Лист.Name();

   
   Для Каждого ТекЛист Из Excel.Sheets() Цикл

       гчНомерЗакладки = гчНомерЗакладки + 1;

       ИмяЛиста = ТекЛист.Name();

       Если Найти(ИмяЛиста, «Протокол») > 0 Тогда

           Продолжить;

       КонецЕсли;

       
       ЗагрузитьЛист(ТекЛист);

       
   КонецЦикла;

   
   Excel.Application.Quit();

   smaharbA

7 — 23.10.08 — 14:39

(6) с просто щетсами и обломаешься

   Fish

8 — 23.10.08 — 14:41

(2) Спасибо, все получилось.

(3) Просто до меня обработка была заточена под файлы с одним листом, и данные там читаются через Экс.Cells проще страницу активировать, чем все переписывать.

   Fragster

9 — 23.10.08 — 14:43

(8) зачем переписывать?
Пока НомерСтраницыВКниге <= ВсегоСтраницВКниге Цикл
Страница = Книга.WorkSheets(НомерСтраницыВКниге);
ТекСтраница = Книга.Worksheets(Страница.Name);


КонецЦикла;

   Voffka

10 — 23.10.08 — 14:43

(7) В чем?

   smaharbA

11 — 23.10.08 — 14:44

(10) щетс это не только электронные таблицы, но к примеру и диаграммы и еще чего может быть…

   dk

12 — 23.10.08 — 14:44

(9) мимо

   Voffka

13 — 23.10.08 — 14:45

(11) Ну я заведомо знаю что там нету диаграм, но за совет спс.

   dk

14 — 23.10.08 — 14:46

(13) я бы еще «попинал» за обращение к пропертям с () на конце :)

   Voffka

15 — 23.10.08 — 14:49

(14) Не надо :)

   b_ru

16 — 23.10.08 — 14:58

а зачем Activate() ? Просто переменная Страница в твоем коде и будет тем что нужно.

   Fish

17 — 23.10.08 — 15:22

(16) я в (8) написал, что данные с листа берутся через Экс.Cells — т.е. из активной страницы Экс.ActiveSheet. т.е. Страница перебирается, а активная страница — нет.

   b_ru

18 — 23.10.08 — 15:35

(17) Страница.Cells…

(18) читай (8) до полного просветления :)

Like this post? Please share to your friends:
  • Excel цикл для всех листов
  • Excel цикл for в формуле
  • Excel цену рублей цена
  • Excel центрировать по столбцам
  • Excel ценники с штрих кодом