Excel макрос выбрать все листы

 

Макс

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

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

Добрый день уважаемые профи VBA, в очередной раз прошу Вашего совета в решении задачи.

Есть книга, в нее иногда добавляются новые листы. Скрытых листов в книге нет.
Помогите пожалуйста с написанием макроса, который выделял бы все листы в книге, кроме листов с именами TR и Base (точно также как это делается при помощи зажатой кнопки ctrl и выделения курсором нужных листов), именно с именами, а не с порядковыми номерами, т.к. количество листов постоянно изменяется. После этого макрос перемещал копии выделенной группы листов в новую книгу.

Пример файла во вложении.

Изменено: Макс27.10.2013 09:37:21

 

Юрий М

Модератор

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

Контакты см. в профиле

#2

27.10.2013 11:44:34

Вариант:

Код
Sub Макрос1()
Dim i As Integer, x As Integer
    x = 1
    For i = 1 To Sheets.Count
        If Sheets(i).Name <> "TR" And Sheets(i).Name <> "Base" Then
            If x = 1 Then
                Sheets(i).Select
            Else
                Sheets(i).Select Replace:=False
            End If
            x = x + 1
        End If
    Next
End Sub
 

Hugo

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

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

Я бы делал иначе — сохранил копию книги, в ней удалил эти два листа.
Т.к. тут рядом уже намучились с этим Move:

http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=52142

 

Юрий М

Модератор

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

Контакты см. в профиле

Игорь, с копией книги действительно проще)) А я уткнулся в задание (выделение группы листов)… Но выделяет ))

 

Hugo

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

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

Да, выделяет — но далее с переносом возможны проблемы.
Если заменить на копирование и удаление — последний пример Михаила работает без проблем. Но у копирования есть свой недостаток — страдают строки >255 символов.

 

Юрий М

Модератор

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

Контакты см. в профиле

 

Макс

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

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

#7

27.10.2013 13:16:34

Юрий М, спасибо, проверил код — выделение группы листов работает ка надо, но вот как теперь эту группу перенести в новую пустую книгу, путем создания копий листа (копированием) ?

Цитата
Я бы делал иначе — сохранил копию книги, в ней удалил эти два листа.

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

Прикрепленные файлы

  • SelectionSheets.xlsm (17.35 КБ)

 

Юрий М

Модератор

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

Контакты см. в профиле

Прислушайтесь к совету Игоря — создавайте копию книги, а уже в ней удаляйте ненужные листы. Тогда и копировать группы листов не нужно.

 

ikki

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

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

#9

27.10.2013 13:36:07

Цитата
Я бы делал иначе — сохранил копию книги, в ней удалил эти два листа.

в некоторых случаях это не одно и то же  :(
так что — смотря по задаче.

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

 

Макс

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

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

#10

27.10.2013 14:30:43

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

Затем делаю копию всех видимых листов и переношу эти копии в новую книгу.

Код получился следующим:

Код
Sub Macro()
Dim ws As Worksheet, flg As Boolean

Sheets(Array("TR", "Base")).Select
ActiveWindow.SelectedSheets.Visible = False
    
For Each ws In Sheets
If ws.Visible = -1 Then
ws.Select Not flg
flg = True
End If
Next
ActiveWindow.SelectedSheets.Copy


Windows("SelectionSheets.xlsm").Activate
Worksheets("TR").Visible = xlSheetVisible
Worksheets("Base").Visible = xlSheetVisible

End Sub

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

 

Мотя

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

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

#11

27.10.2013 19:04:38

Вариант: см. файл.

Прикрепленные файлы

  • MAKS.xls (86 КБ)

Содержание

  1. Как вы выбираете весь лист excel с помощью Range с помощью макроса в VBA?
  2. Как выбрать весь лист Excel с помощью Range с помощью VBA?
  3. 11 ответов
  4. Как выбрать весь лист excel с диапазоном, используя макрос в VBA?
  5. 8 ответов
  6. Как удалить все листы, кроме активного
  7. Как макрос работает
  8. Код макроса
  9. Как работает код
  10. Как использовать
  11. Microsoft Excel
  12. Как создать список всех листов, содержащихся в книге Excel при помощи макрофункции

Как вы выбираете весь лист excel с помощью Range с помощью макроса в VBA?

Я нашел аналогичное решение этого вопроса в С#… См. Ссылку ниже

У кого-нибудь есть фрагмент, чтобы сделать это в VBA? Я не очень знаком с VBA, так что это было бы полезно. Вот что у меня так далеко…

Я обычно выбираю данные, используя “Ctrl + стрелка над стрелкой, стрелка вниз”, чтобы выделить весь диапазон ячеек. Когда я запускаю это в макросе, он кодирует A1: Q398247930, например. Мне нужно это просто

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

редактировать: есть другие части, где я мог бы использовать тот же код, но диапазон, скажем, “C3: конец строк и столбцов”. В VBA есть способ получить местоположение последней ячейки в документе?

Я считаю, что вы хотите найти текущую область A1 и окружающих клеток – не обязательно все ячейки на листе.
Если так – просто используйте…
Range ( “A1” ). CurrentRegion

Вы можете просто использовать cells.select , чтобы выбрать ячейки all на листе. Вы можете получить действительный адрес, указав Range(Cells.Address) .

Если вы хотите найти последний Used Range , где вы внесли некоторые изменения форматирования или ввели значение, вы можете вызвать ActiveSheet.UsedRange и выбрать его там. Надеюсь, что поможет

вы можете использовать все ячейки как объект:

X теперь является объектом диапазона, который содержит весь рабочий лист

у вас есть несколько вариантов:

  • Использование свойства UsedRange
  • найдите последнюю используемую строку и столбец
  • используйте мимику сдвига и сдвига вправо

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

Вот как вы это сделаете, используя свойство UsedRange:

Этот оператор выберет все используемые диапазоны на листе, обратите внимание, что иногда это не очень хорошо работает при удалении столбцов и строк.

Альтернативой является поиск самой последней ячейки, используемой на листе

Что делает этот код:

  • Найти последнюю ячейку, содержащую любое значение
  • выберите ячейку (1,1) до последней ячейки

Я бы рекомендовал записывать макрос, например, найденный в этом сообщении;

Но если вы хотите найти конец своих данных, а не конец рабочей книги, если нет пустых ячеек между началом и концом ваших данных, я часто использую что-то вроде этого:

Вы остаетесь с R = до номера строки после окончания ваших данных. Это также можно использовать для столбца, а затем вы можете использовать что-то вроде Cells (C, R). Выберите, если вы сделали C представление столбца.

Вот то, что я использовал, я знаю, что это может использовать некоторые усовершенствования, но я думаю, что это поможет другим…

Возможно, это может сработать:

Sh.Range( “A1”, Sh.Range( “A” и Rows.Count).End(xlUp))

Обращаясь к самому первому вопросу, я изучаю то же самое.
Результат, который я получаю, записывая макрос, начинается с выбора ячейки A76:

Использовать с ActiveSheet:

Другой способ выбора всех ячеек в диапазоне, если данные непрерывны, состоит в использовании Range(«A1», Range(«A1»).End(xlDown).End(xlToRight)).Select .

Я обнаружил, что метод “.UsedRange” на рабочем листе во многих случаях лучше для решения этой проблемы. Я боролся с проблемой усечения, которая является нормальным поведением метода .CurrentRegion. Использование [Worksheets (“Sheet1”). Range (“A1”). CurrentRegion] не дает желаемых результатов, когда рабочий лист состоит из одного столбца с пробелами в строках (и пробелы требуются). В этом случае “.CurrentRegion” будет обрезаться при первой записи. Я реализовал работу вокруг, но недавно нашел еще лучшую; см. код ниже, который позволяет скопировать весь набор на другой лист или идентифицировать фактический адрес (или только строки и столбцы):

Источник

Как выбрать весь лист Excel с помощью Range с помощью VBA?

Как это сделать в VBA?

Обычно я выбираю данные, используя «Ctrl + Shift над стрелкой, стрелка вниз», чтобы выбрать весь диапазон ячеек. Когда я запускаю это в макросе, он, например, кодирует A1: Q398247930. Мне нужно, чтобы это было просто

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

изменить:
Есть и другие части, в которых я мог бы использовать тот же код, но диапазон говорит «C3: Конец строк и столбцов». Есть ли способ в VBA получить местоположение последней ячейки в документе?

11 ответов

Я считаю, что вы хотите найти текущую область A1 и окружающих ячеек — не обязательно все ячейки на листе. Если так — просто используйте . Диапазон («A1»). CurrentRegion

Вы можете просто использовать cells.select для выбора всех ячеек на листе. Вы можете получить действительный адрес, сказав Range(Cells.Address) .

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

У вас есть несколько вариантов:

  1. Использование свойства UsedRange
  2. найти последнюю использованную строку и столбец
  3. используйте имитацию сдвига вниз и вправо

Я лично использую Используемый диапазон и большую часть времени нахожу метод последней строки и столбца.

Вот как это сделать с помощью свойства UsedRange:

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

Альтернатива — найти самую последнюю ячейку, используемую на листе.

Что делает этот код:

  1. Найдите последнюю ячейку, содержащую любое значение
  2. выберите ячейку (1,1) до последней ячейки

Другой способ выбрать все ячейки в диапазоне, если данные являются смежными, — использовать Range(«A1», Range(«A1»).End(xlDown).End(xlToRight)).Select .

Я бы порекомендовал записать макрос, как в этом посте;

Но если вы хотите найти конец ваших данных, а не конец необходимой книги, если между началом и концом ваших данных нет пустых ячеек, я часто использую что-то вроде этого;

У вас остается R = номер строки после окончания ваших данных. Это также можно использовать для столбца, а затем вы можете использовать что-то вроде Cells (C, R). Выберите, если вы сделали C представлением столбца.

Для использования с ActiveSheet:

Вот то, что я использовал, я знаю, что это можно улучшить, но я думаю, что это поможет другим .

Я обнаружил, что метод рабочего листа «.UsedRange» во многих случаях лучше подходит для решения этой проблемы. Я боролся с проблемой усечения, которая является нормальным поведением метода «.CurrentRegion». Использование [Worksheets («Sheet1»). Range («A1»). CurrentRegion] не дает желаемых результатов, когда рабочий лист состоит из одного столбца с пробелами в строках (а пробелы требуются). В этом случае «.CurrentRegion» будет усечен на первой записи. Я реализовал обходной путь, но недавно нашел еще лучший вариант; см. код ниже, который позволяет скопировать весь набор на другой лист или определить фактический адрес (или только строки и столбцы):

Источник

Как выбрать весь лист excel с диапазоном, используя макрос в VBA?

Я нашел аналогичное решение этого вопроса в c#. См. ссылку ниже

Как выбрать все ячейки на листе в Excel.Объект диапазона c#?

у кого-нибудь есть фрагмент, чтобы сделать это в VBA? Я не очень хорошо знаком с VBA, поэтому это было бы полезно. Вот что у меня есть.

Я обычно выбираю данные, используя «ctrl+shift over arrow, стрелка вниз», чтобы выбрать весь диапазон ячеек. Когда я запускаю это в макросе, он кодирует например, out A1: Q398247930. Мне нужно, чтобы это было просто

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

edit: Есть другие части, где я мог бы использовать тот же код, но диапазон говорит «C3:конец строк и столбцов». Есть ли способ в VBA получить местоположение последней ячейки в документ?

8 ответов

Я считаю, что вы хотите найти текущую область A1 и окружающие ячейки — не обязательно все ячейки на листе. Если да-просто используйте. Диапазон («A1»).CurrentRegion

вы можете просто использовать cells.select выберите все ячейки на листе. Вы можете получить действительный адрес, сказав Range(Cells.Address) .

если вы хотите найти последние Used Range где вы сделали некоторые изменения форматирования или ввели значение в вы можете вызвать ActiveSheet.UsedRange и выбрать его оттуда. Надеюсь, это поможет

вы можете использовать все ячейки в качестве объекта, как это:

X теперь является объектом диапазона, который содержит весь рабочий лист

у вас есть несколько вариантов здесь:

  1. использование свойства UsedRange
  2. найти последнюю строку и столбец, используемый
  3. используйте имитацию shift down и shift right

Я лично использую используемый диапазон и большую часть времени нахожу метод последней строки и столбца.

вот как вы это сделаете, используя свойство UsedRange:

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

альтернативой является поиск самой последней ячейки, используемой в листе

что делает этот код:

  1. найти последнюю ячейку, содержащую любое значение
  2. выберите ячейку (1,1) до последней ячейки

Я бы рекомендовал записать макрос, как в этом посте;

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

вы остаетесь с R = на номер строки после завершения ваших данных. Это может быть использовано и для столбца, и тогда вы можете использовать что-то вроде ячеек(C , R).Выберите, если вы сделали с представлением столбца.

возможно, это может сработать:

ВГ.Range(«A1», Sh.Диапазон («A» И Строки.Рассчитывать.)End (xlUp))

ссылаюсь на первый вопрос, я смотрю на то же самое. Результат, который я получаю, записывая макрос, начинается с выбора ячейки A76:

для использования с ActiveSheet:

Источник

Как удалить все листы, кроме активного

Что делает макрос: Макрос может удалить все листы, кроме активного рабочего листа.

Как макрос работает

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

Код макроса

Как работает код

  1. Объявляем переменную WS, которая будет хранить имя каждого листа.
  2. На шаге 2 макрос начинает цикл по всем рабочим листам в этой книге. Существует разница между ThisWorkbook и ActiveWorkbook. Объект ThisWorkbook относится к книге, в которой написан код макроса. ActiveWorkbook относится к книге, которая в данный момент активна. Они часто возвращают один и тот же объект, но, если рабочая книга работает, а код находится не в активной рабочей книге, они возвращают различные объекты. В этом случае, мы не хотим рисковать удалением листов в других книгах, так что мы используем ThisWorkbook.
  3. На этом этапе сравниваем активное имя листа с листом, который определяется с помощью цикла.
  4. Если имена листов различны, макрокоманда удаляет лист. Мы используем DisplayAlerts, чтобы подавить любые проверки подтверждения из Excel (чтобы не появлялось системное сообщение с вопросом: «Вы действительно хотите удалить лист?»)
  5. На шаге 5, переходим к следующему листу книги и повторяем проверку снова. После того, как пробежались по всем листам, макрос завершается.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код во вновь созданном модуле.

Обратите внимание, что при использовании ThisWorkbook в макросе вместо ActiveWorkbook, вы не сможете запустить макрос из личных макросов. Это потому, что ThisWorkbook относится к Personal Macro Workbook, а не рабочей книги, к которому следует применить макрос.

Источник

Microsoft Excel

трюки • приёмы • решения

Как создать список всех листов, содержащихся в книге Excel при помощи макрофункции

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

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

  1. Вставьте новый лист, на котором будет находиться список.
  2. Выполните команду Формулы ► Присвоить имя, чтобы открыть диалоговое окно Создание имени.
  3. Впишите в поле Имя название Список.
  4. Введите следующую формулу в поле Диапазон (рис. 9.1): =ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ(«]»;ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));»») .
  5. Осталось нажать ОК, чтобы закрыть диалоговое окно Создание имени.

Рис. 9.1. Работа с окном Создание имени для создания именованной формулы

Обратите внимание: в формуле используется функция ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ, которая не относится к числу стандартных функций рабочего листа. Это макрофункция, написанная в сравнительно старом XLM-стиле и предназначенная для применения на специальном листе макросов. При использовании аргумента 1 она возвращает массив имен листов, причем перед именем каждого листа указано название книги, откуда он взят. Функции ЗАМЕНИТЬ и НАЙТИ удаляют имя книги, сопутствующее названию листа. Чтобы сгенерировать имена листов, введите в ячейку А1 следующую формулу, а затем скопируйте ее ниже по столбцу: =ИНДЕКС(Список;СТРОКА()) .

На рис. 9.2 приведена данная формула для диапазона А1:А10. В книге семь листов, поэтому формула возвращает ошибку #ССЫЛКА! при попытке отобразить имя несуществующего листа. Чтобы избежать этого, измените формулу следующим образом: =ЕСЛИОШИБКА(ИНДЕКС(Список;СТРОКА());»») .

Рис. 9.2. Использование формулы для отображения списка имен листов

Список названий листов можно откорректировать, если вы будете добавлять, удалять или переименовывать листы, но это не происходит автоматически. Чтобы принудительно обновить формулы, нажмите Ctrl+Alt+F9. Если вы хотите, чтобы имена листов автоматически обновлялись при пересчете книги, измените именованную формулу следующим образом, чтобы сделать ее меняющейся: =ЗАМЕНИТЬ(ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1);1;НАЙТИ(«]»;ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1));»»)&Т(ТДАТА()) .

Рис. 9.3. Создание списка гиперссылок

Зачем может понадобиться список названий листов? На рис. 9.3 показано оглавление, созданное с помощью ссылки ГИПЕРССЫЛКА. В ячейке В1 записана следующая формула: =ГИПЕРССЫЛКА(«#»&A1&»!A1″;»Перейти по ссылке») . Щелкнув на гиперссылке, вы активизируете лист и выделяете ячейку А1. К сожалению, Excel не поддерживает гиперссылок, ведущих на лист с диаграммами, поэтому при попытке сослаться на такой лист программа выдаст ошибку.

Если вы пользуетесь такими приемами, то книгу нужно сохранить как файл с поддержкой макросов (в формате *.xlsm или *.xls).

Источник

Аннотация

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

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

Apkaxa

0 / 0 / 0

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

Сообщений: 23

1

Как выделить несколько листов?

24.05.2011, 12:17. Показов 11172. Ответов 11

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


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

Понимаю, что ламерский вопрос, но тем не менее:

Нужные ячейки я выделяю командой

Visual Basic
1
Range(cells(1,1),cells(1,j)

Подскажите, плиз, подобный код, но только для листов.



0



Apkaxa

0 / 0 / 0

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

Сообщений: 23

24.05.2011, 15:38

 [ТС]

2

Извиняюсь. Не закончил код.

Visual Basic
1
Range(Cells(1,1),Cells(1,j).Select

Хочу как-нибудь также выделить диапазон листов.



0



Терминатор

24.05.2011, 15:45

3

Visual Basic
1
2
3
Sub Выделить()
    Sheets(Array('Лист1', 'Лист2', 'Лист3')).Select
End Sub

Лист1, Лист2, и т.д. это имена Листов.

Терминатор

24.05.2011, 16:01

4

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

Visual Basic
1
2
3
        Dim vars As Variant
        For Each vars In Workbooks.Item(1).Sheets
        MsgBox (vars.Name)

Item(1). Это я так написал, если Книг открыто много можно указать
имя нужной. Item(‘Пример.xls’)

0 / 0 / 0

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

Сообщений: 23

25.05.2011, 07:24

 [ТС]

5

to Terminator

Sheets(Array(‘Лист1’, ‘Лист2’, ‘Лист3’)).Select
не подходит, потому что их количество и названия могут меняться.



0



22 / 5 / 1

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

Сообщений: 370

26.05.2011, 06:57

6

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



0



0 / 0 / 0

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

Сообщений: 23

26.05.2011, 08:18

 [ТС]

7

Блин.
Я знаю индекс первого листа — Sheets(1),
знаю индекс последнего i = Sheets.Count

Неужели в VBA нет простого способа выделить все листы книги: с первого по последний?

Что-нибудь типа Sheets Array(1 to i).Select



0



1 / 1 / 0

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

Сообщений: 80

26.05.2011, 13:21

8

Чтобы выделить все листы книги, надо выполнить инструкцию
Worksheets.Select



0



0 / 0 / 0

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

Сообщений: 23

27.05.2011, 05:35

 [ТС]

9

Спасибо, gleb.
А если не все нужно выделить а какой-то диапазон?



0



Терминатор

27.05.2011, 11:13

10

Apkaxa, ну ты даёшь! Диапазон с Листами.
Очень часто бывает что то что необходимо для выполнения, решается с другой стороны. Был как-то вопрос от одного юзера, которому надо было разместить 20 кнопок на одной форме и работать с ними. Конечно народ подсказал как это сделать, но чем дальше в лес тем больше дров, у него по ходу стало возникать всё больше и больше вопросов, а сама задача становилась всё более трудно выполнимой. В конце концов когда он описал полностью ту свою задачу, ему предложили всего 4-5 конопок (точно не помню) и код к ним. Он был счастлив.
У меня тоже что-то подобное было, поверь, я не с целью как-то пошутить, а с целью выроботки нового взгяда на твоё решение. Мошешь выложить проблему, наверняка кто-то из более опытных подскажет что-то более лучшее.

0 / 0 / 0

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

Сообщений: 23

28.05.2011, 12:51

 [ТС]

11

to terminator

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



0



Comanche

28.05.2011, 13:44

12

Ничего не группируя, даёшь юзеру ввести данные на первом листе. Потом пишешь ‘Sheets.FillAcrossSheets Worksheets(1).Range(‘A1:C5′)’.

Если всё же надо скрыть группу листов, то делаешь так:

Visual Basic
1
2
3
4
5
6
7
8
Sub HideAllExceptFirst
    Dim arr As Variant, i As Long
    ReDim arr(1 To Worksheets.Count - 1)
    For i = 2 To Worksheets.Count
        arr(i - 1) = Worksheets(i).Name
    Next
    Sheets(arr).Visible = False
End Sub

Terminator прав: для программного формирования ГРУППЫ листов — не обойтись без МАССИВОВ (и если конструкция Array не подходит в силу ‘изменчивости’ начинки массива, то приходится использовать обычные массивы и в итоге мы сразу попадаем на использование перебора в цикле).

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

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


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