Vba на разных листах excel

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

Запустить или выполнить один и тот же макрос на нескольких листах одновременно с кодом VBA


Запустить или выполнить один и тот же макрос на нескольких листах одновременно с кодом VBA

Чтобы запустить макрос на нескольких листах одновременно, не запуская его по одному, вы можете применить следующий код VBA, сделайте следующее:

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модули, и вставьте следующий макрос в Модули Окно.

Код VBA: запускать один и тот же макрос на нескольких листах одновременно:

Sub Dosomething()
    Dim xSh As Worksheet
    Application.ScreenUpdating = False
    For Each xSh In Worksheets
        xSh.Select
        Call RunCode
    Next
    Application.ScreenUpdating = True
End Sub
Sub RunCode()
    'your code here
End Sub

Внимание: В приведенном выше коде скопируйте и вставьте свой собственный код без ниже заголовок и End Sub нижний колонтитул между Дополнительный код выполнения () и End Sub скрипты. Смотрите скриншот:

макрос запуска документа на всех листах 1

3. Затем поместите курсор на макрос первой части и нажмите F5 нажмите клавишу для запуска кода, и ваш код макроса будет применяться к одному листу.



Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (13)


Оценок пока нет. Оцените первым!

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

задан 6 авг 2016 в 15:54

Математик's user avatar

0

Sub switch()
    Dim wb As Workbook
    Dim ws1, ws2 As Worksheet

    Set wb = Application.ActiveWorkbook
    Set ws1 = wb.Worksheets("Лист1")
    Set ws2 = wb.Worksheets("Лист2")

    ' индексация ячеек начинается с 1 в формате (номер строки, номер столбца)
    ' скопирует данные с первого листа ячейки A1 на второй лист в ячейку A1
    ws2.Cells(1, 1) = ws1.Cells(1, 1)
End Sub

ответ дан 8 авг 2016 в 15:41

slippyk's user avatar

slippykslippyk

6,0913 золотых знака19 серебряных знаков38 бронзовых знаков

Sheets("Sheet2").Range("A1").Value = Sheets("Sheet1").Range("A1").Value

pavel's user avatar

pavel

9,7693 золотых знака27 серебряных знаков42 бронзовых знака

ответ дан 8 авг 2016 в 12:16

user3615789's user avatar

2

hil25cm

0 / 0 / 0

Регистрация: 26.07.2013

Сообщений: 62

1

Сравнение ячеек на разных листах

26.07.2013, 11:55. Показов 9393. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

на листе «Сводка» в столбце «А» номенклатуры товара, который есть в принципе. на листе «Foto» в столбце «А» номенклатуры товара, фото которого есть. мне нежна программа, которая берет значение ячейки из столбца «А» на листе «Сводка», сравнивает с содержимым ячеек столбца «А» на листе «Foto» и если совпадение есть, то на листе «Сводка» в столбце «Е» ставит отметку «Есть», если совпадений нет — то ставит отметку «Нет»

работал с vba очень давно, многое забыл((

вот что написал

Visual Basic
1
2
3
4
5
6
For j = 2 To 10000
    If Sheets("Сводка").Range("Aj") = Sheets("Foto").Range("A2:A12000") Then
    Worksheets("Сводка").Range("Ej") = "Есть"
    Else: Worksheets("Ñâîäêà").Range("Ej") = "Нет"
    End If
Next j



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

26.07.2013, 12:18

2

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Во-первых: синтаксис неверен(Range(«Aj»))
Во-вторых: в первом случае Вы идете циклом по значениям листа «Сводка», а вот цикла по «Foto» нет. Вы почему-то сравниваете одно значение с массивом ячеек. Это неправильно.

Visual Basic
1
2
3
4
5
6
7
8
For j = 2 To 10000
For li = 2 To 12000
 If Sheets("Сводка").Range("A" & j) = Sheets("Foto").Range("A" & li) Then
 Worksheets("Сводка").Range("E" & j) = "Есть"
 Else: Worksheets("Ñâîäêà").Range("E" & j) = "Нет"
 End If
Next li
Next j

Но этот код будет долго работать. Лучше на массивах:

Visual Basic
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
Sub compareData()
    Dim avData, avComp, avRes, lr As Long, li As Long, lLastRow As Long, bExists As Boolean
    With Worksheets("Foto")
        lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        avComp = Range(.Cells(2, 1), .Cells(lLastRow, 1)).Value
    End With
    With Worksheets("Сводка")
        lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        avData = Range(.Cells(2, 1), .Cells(lLastRow, 1)).Value
        ReDim avRes(1 To UBound(avData, 1), 1 To 1)
        For lr = 1 To UBound(avData, 1)
            bExists = False
            For li = 2 To 12000
                If avData(lr, 1) = avComp(li, 1) Then
                    bExists = True: Exit For
                End If
            Next li
            If bExists Then
                avRes(lr, 1) = "Есть"
            Else
                avRes(lr, 1) = "Нет"
            End If
        Next lr
        Range("E2").Resize(UBound(avRes, 1)).Value = avRes
    End With
End Sub

Сразу говорю — не проверял на работоспсобность. Но вроде как все правильно.



0



2617 / 547 / 109

Регистрация: 21.03.2012

Сообщений: 1,051

26.07.2013, 12:48

3

hil25cm, для такой задачи макросы не нужны. Вставьте в соответствующие ячейки листа «Сводка» формулу, подобную такой: =ЕСЛИ(ЕТЕКСТ(ВПР(A1;Книга1!Фото;1;ЛОЖЬ)); «есть»;»нет»)
Здесь «Фото» — это именованый диапазон ячеек на листе «Foto».



0



Хитрости »

1 Май 2011              765518 просмотров


Как собрать данные с нескольких листов или книг?

Очень часто бывает необходимо собрать данные с нескольких листов одной книги или даже с листов нескольких книг. Например, каждую неделю мы получаем некие отчеты от отделов, которые необходимо собрать в одну общую таблицу для построения сводной таблицы. Или это могут быть некие книги прайсов по товарам от разных поставщиком, который опять же надо сначала объединить, а потом уже анализировать. Вручную делать это довольно муторно. И то, муторно это только для первых 20-ти листов/файлов, потом становится просто тошно. Поэтому решил поделиться решением, которое поможет собрать данные со всех листов книги, со всех листов всех указанных книг или только с указанных листов:

'---------------------------------------------------------------------------------------
' Author : Щербаков Дмитрий(The_Prist)
'          Профессиональная разработка приложений для MS Office любой сложности
'          Проведение тренингов по MS Excel
'          https://www.excel-vba.ru
'          info@excel-vba.ru
'          WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
' Purpose: http://www.excel-vba.ru/chto-umeet-excel/kak-sobrat-dannye-s-neskolkix-listov-ili-knig/
'             Процедура сбора данных с нескольки листов/книг
'---------------------------------------------------------------------------------------
Option Explicit
 
Sub Consolidated_Range_of_Books_and_Sheets()
    Dim iBeginRange As Range, rCopy As Range, lCalc As Long, lCol As Long
    Dim oAwb As String, sCopyAddress As String, sSheetName As String
    Dim lLastrow As Long, lLastRowMyBook As Long, li As Long, iLastColumn As Integer
    Dim wsSh As Worksheet, wsDataSheet As Worksheet, bPolyBooks As Boolean, avFiles
    Dim wbAct As Workbook
    Dim bPasteValues As Boolean, IsPasteSheetName As Boolean
 
    On Error Resume Next
    'Выбираем диапазон выборки с книг
    Set iBeginRange = Application.InputBox("Выберите диапазон сбора данных." & vbCrLf & _
                                           "1. При выборе только одной ячейки данные будут собраны со всех листов начиная с этой ячейки. " & _
                                           vbCrLf & "2. При выделении нескольких ячеек данные будут собраны только с указанного диапазона всех листов.", Type:=8)
    'для указания диапазона без диалогового окна:
    'Set iBeginRange = Range("A1:A10") 'диапазон указывается нужный
    'Если диапазон не выбран - завершаем процедуру
    If iBeginRange Is Nothing Then
        Exit Sub
    End If
    'Указываем имя листа
    'Допустимо указывать в имени листа символы подставки ? и *.
    'Если указать только * то данные будут собираться со всех листов
    sSheetName = InputBox("Введите имя листа, с которого собирать данные(если не указан, то данные собираются со всех листов)", "Параметр")
    'Если имя листа не указано - данные будут собраны со вех листов
    If sSheetName = "" Then
        sSheetName = "*"
    End If
    'добавлять ли имя листа в начало таблицы
    IsPasteSheetName = (MsgBox("Вставлять имя листа первым столбцом?", vbQuestion + vbYesNo, "www.wxcel-vba.ru") = vbYes)
    On Error GoTo 0
    'Запрос - вставлять на результирующий лист все данные
    'или только значения ячеек (без формул и форматов)
    bPasteValues = (MsgBox("Вставлять только значения?", vbQuestion + vbYesNo, "www.wxcel-vba.ru") = vbYes)
    'Запрос сбора данных с книг(если Нет - то сбор идет с активной книги)
    If MsgBox("Собрать данные с нескольких книг?", vbInformation + vbYesNo, "www.wxcel-vba.ru") = vbYes Then
        avFiles = Application.GetOpenFilename("Excel files(*.xls*),*.xls*", , "Выбор файлов", , True)
        If VarType(avFiles) = vbBoolean Then Exit Sub
        bPolyBooks = True
        lCol = 1
    Else
        avFiles = Array(ThisWorkbook.FullName)
    End If
    If IsPasteSheetName Then
        lCol = lCol + 1
    End If
    'отключаем обновление экрана, автопересчет формул и отслеживание событий
    'для скорости выполнения кода и для избежания ошибок, если в книгах есть иные коды
    With Application
        lCalc = .Calculation
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlManual
    End With
    'создаем новый лист в книге для сбора
    Set wsDataSheet = ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.Count))
    'если нужно сделать сбор данных на новый лист книги с кодом
    'Set wsDataSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    'цикл по книгам
    For li = LBound(avFiles) To UBound(avFiles)
        If bPolyBooks Then
            Set wbAct = Workbooks.Open(Filename:=avFiles(li))
        Else
            Set wbAct = ThisWorkbook
        End If
        oAwb = wbAct.Name
        'цикл по листам
        For Each wsSh In wbAct.Sheets
            If wsSh.Name Like sSheetName Then
                'Если имя листа совпадает с именем листа, в который собираем данные
                'и сбор идет только с активной книги - то переходим к следующему листу
                If wsSh.Name = wsDataSheet.Name And bPolyBooks = False Then GoTo NEXT_
                With wsSh
                    Select Case iBeginRange.Count
                    Case 1 'собираем данные начиная с указанной ячейки и до конца данных
                        lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row
                        iLastColumn = .Cells.SpecialCells(xlLastCell).Column
                        sCopyAddress = .Range(.Cells(iBeginRange.Row, iBeginRange.Column), .Cells(lLastrow, iLastColumn)).Address
                    Case Else 'собираем данные с фиксированного диапазона
                        sCopyAddress = iBeginRange.Address
                    End Select
                    lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
                    'определяем для копирования диапазон только заполненных данных на листе
                    Set rCopy = Intersect(.Range(sCopyAddress).Parent.UsedRange, .Range(sCopyAddress))
                    'вставляем имя книги, с которой собраны данные
                    If lCol > 0 Then
                        If bPolyBooks Then
                            wsDataSheet.Cells(lLastRowMyBook, 1).Resize(rCopy.Rows.Count).Value = oAwb
                        End If
                        If IsPasteSheetName Then
                            wsDataSheet.Cells(lLastRowMyBook, lCol).Resize(rCopy.Rows.Count).Value = .Name
                        End If
                    End If
                    'если вставляем только значения
                    If bPasteValues Then
                        rCopy.Copy
                        wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol).PasteSpecial xlPasteValues
                        wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol).PasteSpecial xlPasteFormats
                    Else 'если вставляем все данные ячеек(формулы, форматы и т.д.)
                        rCopy.Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)
                    End If
                End With
            End If
NEXT_:
        Next wsSh
        If bPolyBooks Then
            wbAct.Close False
        End If
    Next li
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = lCalc
    End With
End Sub

Приведенный выше код необходимо вставить в стандартный модуль(Что такое модуль? Какие бывают модули?). Выполнить его можно будет из этой книги нажатием клавиш Alt+F8. В появившемся окне выбрать Consolidated_Range_of_Books_and_Sheets и нажать Выполнить. Так же можно создать на листе кнопку и назначить ей данный макрос. Так же, если впервые работаете с макросами настоятельно рекомендую прочитать статью: Что такое макрос и где его искать?, а так же Почему не работает макрос?

После вызова макроса поочередно будут появляется запросы, в которых надо будет указать исходные параметры:

  • Диапазон сбора данных — Если в окне выбора диапазона выбрать только одну ячейку, то данные будут собраны со всех листов книги/книг, начиная с этой ячейки и до последней ячейки листа.
    Если выбрать несколько ячеек, данные будут собраны только с указанного диапазона всех листов книги/книг. Допускается указать несвязанный(рваный) диапазон(например, только три столбца: A:A,D:D,F:F). Сделать это можно, выделив нужный диапазон с зажатой клавишей Ctrl. Здесь необходимо учитывать, что Excel позволяет одним махом скопировать не любые рваные диапазоны, а только диапазоны одного размера и только если они начинаются с одной строки. Например, если выделить диапазоны A1:B20, F1:H20 — они будут скопированы без проблем. Но если попробовать указать диапазоны со сдвигом: A1:B20, F2:H21 — Excel выдаст ошибку.
  • Имя листа — Необязателен для указания. Если не указан — данные будут собраны со всех листов. Указать можно как точное соответствие имени листа, так и с частичным соответствием. Например, если в книгах для сбора данных необходимо собрать данные только с листа «Январь», то следует так и указать — «Январь». Если требуется собрать данные только с листов, начинающихся с «Продажи»(«Продажи ЮГ», «Продажи НН», «Продажи Запад» и т.д.), то следует применить символ подстановки звездочку — «Продажи*». Если надо собрать с листов, содержащих в имени «продажи»(«Итоговые продажи ЮГ», «Продажи НН», «Сезонные продажи» и т.д.), то указываем «*продажи*». Если надо собрать только с листа «Сезонные продажи», но известно, что вместо пробела может быть нижнее подчеркивание или тире(«Сезонные продажи», «Сезонные_продажи», «Сезонные-продажи») или иной символ, то можно также применить звездочку — «Сезонные*продажи». Но если среди листов могут встречаться и такие как «Сезонные разовые продажи», «Сезонные корпоративные продажи» и т.п., но информацию с них собирать не надо, то можно применить вопросительный знак — «Сезонные?продажи». Вопросительный знак заменяет любой один символ, звездочка — любое количество любых символов.
  • Вставлять имя листа первым столбцом? — если выбрать Да, перед данными в итоговой таблице будут записаны имена листов, с которых были собраны данные. Если будет указано собирать данные с нескольких книг — то имя листа будет во втором столбце, если с листов одной книги — то имя листа будет первым столбцом.
  • Вставлять только значения? — если выбрать Да, то в результирующий лист с листов будут вставлены исключительно значения ячеек (без формул), но при этом сохранятся их форматы(формат чисел, цвет заливки, цвет шрифта, границы и т.п.). Может пригодится, если на листах для сбора записаны формулы, ссылающиеся на другие листы, книги, диапазоны. При обычном копировании может случиться так, что формула выдаст ошибку, т.к. в книге для вставки нет таких листов и диапазонов или данные расположены иначе. Если выбрать Нет, то все ячейки с листов на результирующий будут копироваться в точности как в исходных листах.
  • И последний запрос: Собрать данные с нескольких книг? — если выбрать Да, то появится диалоговое окно выбора файлов. Надо указать все файлы, данные с которых необходимо собрать. Если выбрать Нет, то данные будут собираться с листов только активной книги. При этом, если выбран вариант сбора с нескольких книг, то первым столбцом в итоговой таблице будут записаны имена файлов, с которых были собраны данные

Данные будут собраны на новый лист книги с макросом. Если данные собирались с нескольких книг, то в первый столбец будут занесены имена книг, с которых собраны данные.

Если после сбора данных обнаружили, что после каждого файла/листа много пустых строк, то следует найти в коде строку:

lLastrow = .Cells(1, 1).SpecialCells(xlLastCell).Row

и заменить её на строку примерно следующего содержания:

lLastrow = .Cells(.Rows.Count, 1).End(xlUp).Row

где 1 — это номер столбца на листах данных, в котором искать последнюю заполненную ячейку.
Актуально это для файлов с одинаковой структурой. Например, если сбор идет с листов по продажам, то вполне может быть такое, что в столбце 1 может не быть данных. Поэтому следует определить номер столбца, в котором наполнение данных максимально. Например, это может быть столбец с наименованиями товара или с суммами. Если это столбец D, то следует строку записать так:

lLastrow = .Cells(.Rows.Count, 4).End(xlUp).Row 'ищем последнюю строку в 4-м столбце

Подробнее про определение последней строки можно прочитать в статье: Как определить последнюю ячейку на листе через VBA?

Важное замечание: Если вы используете Excel 2007 и выше и файлы для сбора данных тоже в этом формате, то следует скачанный файл сначала сохранить в формат «Книга Excel с поддержкой макросов(.xlsm)», закрыть и открыть заново. Иначе есть шанс получить ошибку при сборе данных, т.к. Excel будет в режиме совместимости и не сможет поместить на результирующий лист более 65536 строк.

Скачать пример:

  Сбор данных с листов и книг.xls (73,0 KiB, 37 088 скачиваний)

Также см.:
Сбор данных с нескольких листов/книг
Как объединить несколько текстовых файлов в один?
Просмотреть все файлы в папке
План-фактный анализ в Excel при помощи Power Query


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Столкнулся с задачей масс-форматирования схожих страниц и заметил, что код занимает весьма много времени.  

  Конкретней, мне надо было изменить на 11 листах ширину строк с 22 по 34 на определенные значения, удалить несколько листов или определенные строки/столбцы на 11 листах.  

  Ну и собственно был код в 2-х вариантах (с массивом листов и массивом названий листов):  
dim wsName(1 to 11) as String  
wsName(1)=»Sheet1″  
…  
wsName(11)=»Sheet11″  

  for j = 1 to 11  
ThisWorkBook.Worksheets(wsName(j)).Rows(«24»).RowHeight=10  
ThisWorkBook.Worksheets(wsName(j)).Rows(«25»).RowHeight=15  
…  
ThisWorkBook.Worksheets(wsName(j)).Rows(«32»).RowHeight=20  
Next  

  Ну и аналогично для массива листов, было    
ws(j).Rows(«24»).RowHeight=10 в цикле  

  Работало это всё медленно, нашел в хелпе обращение к массиву листов Worksheets(Array(«Sheet1», «Sheet2», «Sheet3»), и нашел что оно работает с применением строкового массива типа (Worksheets(wsName))  

  Но, что было неудобно:  
Для того, чтобы например изменить высоту строк, приходилось писать такой код:  
ThisWorkBook.WorkSheets(wsName).Select  
Rows(«22»).RowHeight=10  

  То есть выделение листа, и выделение строки на активном листе (ну фиг с ним с ScreenUpdating = false пользователь этого не видит), но мне кажется, что это как-то криво и должна быть возможность сделать это без Select’а.  
А ещё в коде перед этим открывается другой эксель файл и чтобы заработал Select, нужно было писать ThisWorkBook.Activate.  
Мне оч. сильно не нравятся методы Select/Activate, поэтому собственно и создал эту тему :)

Иногда одни и те же данные одновременно содержатся в нескольких рабочих листах. Чтобы выполнить ввод данных в несколько рабочих листов, можно применить инструмент группировки Excel. Эту группировку можно выполнить стандартными методами Excel или с использованием кода VBA. [1] Встроенный механизм Excel для одновременного размещения данных в нескольких листах — это средство под названием Группа. Оно позволяет группировать листы, связывая их внутри рабочей книги. Чтобы применить средство Группа, щелкните лист, на котором будете вводить данные, а затем, удерживая клавишу Ctrl, щелкните ярлычки с именами рабочих листов, куда должны одновременно вводиться те же данные (рис. 1).

Рис. 1. Три первых листа объединены в группу

Рис. 1. Три первых листа объединены в группу

Скачать заметку в формате Word или pdf, примеры в формате Excel (с макросами)

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

Если у вас сгруппировано несколько рабочих листов, то, взглянув на строку заголовка, вы увидите слово Группа в квадратных скобках. Это позволяет понять, что ваши листы объединены в группу. Однако эта надпись не бросается в глаза, поэтому мы советуем разгруппировывать листы сразу же, как только закончите делать то, для чего была необходима группировка.

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

Эти трудности можно преодолеть при помощи кода VBA. Чтобы этот код заработал, он должен находиться в частном модуле для объекта Лист (а не в модуле рабочей книги). Ранее я однажды уже использовал такой код (см. Создание указателя листов в книге). Чтобы быстро перейти в частный модуль, щелкните правой кнопкой мыши ярлычок листа и в контекстном меню выберите команду Исходный текст. Для запуска кода, расположенного в частном модуле для объекта Лист, вы сможете использовать одно из событий листа Excel, то есть событие, которое происходит в вашем листе, например, изменение ячейки, выбор диапазона, активация, деактивация и так далее. В указанном выше примере макрос запускался каждый раз при переходе на соответствующий лист.

Первое, что необходимо сделать для обработки группировки, — это выбрать имя для диапазона ячеек, который вы хотите сгруппировать, чтобы данные автоматически отображались на других листах. Я, например, выбрал на Лист3 область С3:F8 и ввел в поле имени MyRange (рис. 2). Чтобы убедитьбся, что диапазону присвоено имя, можно перейти на вкладку Формулы и кликнуть на кнопке Диспетчер имен. В открывшемся окне вы увидите строку с параметрами только что определенного имени диапазона.

Рис. 2. Присвоение диапазону ячеек имени MyRange

Рис. 2. Присвоение диапазону ячеек имени MyRange

Убедиться, что вы находить в частном модуле для объекта Лист можно, посмотрев на заголовок окна модуля, в котором отражаются названия файла и листа (см. выделение на рис. 3). В частный модуль введите код:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Range("MyRange"), Target) Is Nothing Then

‘Sheet5 намеренно помещен на первое место в списке так как

‘это активный лист, на котором мы работаем

Sheets(Array("Лист3", "Лист1", "Лист2")).Select

Else

Me.Select

End If

End Sub

Рис. 3. Код VBA для автоматической группировки листов

Рис. 3. Код VBA для автоматической группировки листов

В этом коде мы использовали имя диапазона MyRange. Измените MyRange на имя диапазона, которое вы используете в своем листе. Кроме того, измените в коде три имени листов на имена листов, которые хотите сгруппировать. Закончив ввод, закройте окно модуля или нажмите сочетание клавиш Alt+Q, чтобы вернуться в Excel. Сохраните книгу Excel с расширением .xlsm (с поддержкой макросов).

Важно помнить, что первым в этом массиве должно стоять имя листа, содержащего этот код, то есть листа, на котором вы будете вводить данные. После того как код создан, каждый раз, когда вы будете выбирать ячейку на Лист3, код будет проверять, принадлежит ли выбранная ячейка диапазону с именем MyRange (С3:F8). Если да, то код будет автоматически группировать нужные рабочие листы. Если нет, он будет разгруппировывать листы, активируя тот лист, на котором вы в данный момент находитесь. Прелесть этого трюка в том, что вручную группировать листы не нужно, и нет риска забыть разгруппировать их.

Вы также можете сделать так, чтобы данные появлялись на других листах, но не в ячейках с теми же адресами. Для этого я определил новый диапазон на Лист6 – Пример2 (В2:Н11). Далее записал следующий код в частный модуль объекта Лист6:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Range("Пример2"), Target) Is Nothing Then

With Range("Пример2")

.Copy Destination: =Sheets ("Лист4").Range ("A1")

.Copy Destination:=Sheets("Лист5").Range("D10")

End With

End If

End Sub

Этот код левому верхнему углу диапазона на Лист 6 – В2 поставит в соответствие диапазон на Лист4 с вершиной в А1 и на Лист5 – с вершиной D10. Вводя на Лист6 значения в ячейки диапазона Пример2 (В2:Н11), вы получите аналогичные значения в диапазонах на Лист4 (А1:G10) и Лист5 (D10:J19).

[1] По материалам книги Р.Холи, Д.Холи. Excel 2007. Трюки, стр. 26–28

Like this post? Please share to your friends:
  • Vba массивы excel значения элементов массива
  • Vba максимальная дата excel
  • Vba макросы массивы excel
  • Vba макросы excel окно
  • Vba макрос при запуске word