Выделить несколько листов vba excel

 

Haken

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

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

Что-то от жары голова не варит…  
Подскажите, какую команду написать, чтобы выделить n листов в книге.  
Объясняю пример: в книге всегда 3k+1 листов. Хочу в макросе прописать, чтобы в другую книгу копировались листы с 1 (свод) по k+1 (в данном случае до листа с именем «4» включительно).  
Дело в том, что в разных книгах названия листов и количество разные.

 

Попробуйте записать макрорекордером выделение нужных Вам листов. Удерживая нажатой Ctrl. Проанализируйте код. Пример:    
Sheets(Array(«Лист1», «Лист2», «Лист3»)).Select

 

Haken

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

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

Ну вот в том-то и дело, что рекодер выделяет по именам. И в другой книге макрос не будет работать, поскольку там названия листов другие и количество. Я думал, как бы это сделать через индексы какие-нибудь.  
Т.е. если в примере 4*3+1=13 листов, то в другой книге для обработки их может быть например 5*3+1=16. вот мне надо скопировать с 1 по 6 (т.е. свод и 5 основных листов). Листы идут подряд.  

  Работает команда Sheets(1).Select — для выделения одного листа или Sheets(Array(1, 2, 3)).Select — для выделения трёх *четко установленных листов*  
Как написать «диапазоном» — с 1 по k. k посчитать же можно k=((sheets.count-1)/3)

 

1. Если обратите внимание, то увидите, что у листов в VBE два имени. Первое — присвоенное самой программой, второе — присвоенное Вами. А чтобы копировать только нужные (с … по …) нужно сначала их посчитать (макросом).

 

{quote}{login=Юрий М}{date=17.08.2008 05:21}{thema=}{post}1. Если обратите внимание, то увидите, что у листов в VBE два имени. Первое — присвоенное самой программой, второе — присвоенное Вами. А чтобы копировать только нужные (с … по …) нужно сначала их посчитать (макросом).{/post}{/quote}  
согласен. Вот мне и нужно выделить листы с 1 по (sheets.count-1)/3

 

Я делал так:  
n = Sheets.Count  
For i = 2 To n — 2  
Т.е. в обработку попадали листы со второго по последний-2.

 

Haken

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

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

{quote}{login=Юрий М}{date=17.08.2008 05:40}{thema=}{post}Я делал так:  
n = Sheets.Count  
For i = 2 To n — 2  
Т.е. в обработку попадали листы со второго по последний-2.{/post}{/quote}  
ммм… а можно полностью? что с этим циклом дальше-то делать? для обработки данных на заданных листах он годится, а копировать их все как в новую книгу?

 

Sheets(Array(1, 2, 3)).Select

 

Вот такая идея:  
Sub Макрос1()  
Dim s()  
k = 2  
ReDim s(1 To k)  

  For i = 1 To k  
s(i) = i  
Next  
Sheets(s).Select  
End Sub  
Сначала получаем массив с номерами листов.  
Только надо предварительно определить k.  
Чтобы в массиве не было пустых элементов — даст ошибку.

 

Haken

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

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

{quote}{login=Лузер™}{date=18.08.2008 08:27}{thema=}{post}Вот такая идея:  
Sub Макрос1()  
Dim s()  
k = 2  
ReDim s(1 To k)  

  For i = 1 To k  
s(i) = i  
Next  
Sheets(s).Select  
End Sub  
Сначала получаем массив с номерами листов.  
Только надо предварительно определить k.  
Чтобы в массиве не было пустых элементов — даст ошибку.{/post}{/quote}  

  Спасибо! То что надо!

 

RED

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

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

Не могу понять, почему у меня не работает этот макрос,    
Ругается на Worksheets(dlt).Delete, пишет Subscript out of range.    
Есть идеи?  
Sub test1()  

  Dim dlt()  
ReDim dlt(20)  
v = 1  
For x = 1 To Sheets.Count  
Sheets(x).Select  
If Range(«B6») <> «» Then  
dlt(v) = x  
v = v + 1  
End If  
Next x  
ReDim Preserve dlt(v — 1)  
‘For i = Sheets.Count To i Step -1  
‘Cells(1, 1) = dlt(3)  
‘Sheets(dlt).Select  
Sheets(dlt).Select  
‘a = dlt(1)  
‘Worksheets(dlt).Delete  
‘Next i  
‘Application.DisplayAlerts = False  
‘Worksheets(Array(dlt)).Delete  
‘Application.DisplayAlerts = True  

  End Sub

 

RED

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

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

Извиняюсь, вот так:  
Sub test1()  
Dim dlt()  
ReDim dlt(20)  
v = 1  
For x = 1 To Sheets.Count  
Sheets(x).Select  
If Range(«B6») <> «» Then  
dlt(v) = x  
v = v + 1  
End If  
Next x  
ReDim Preserve dlt(v — 1)  
Worksheets(dlt).Delete  
End Sub

 

KuklP

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

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

E-mail и реквизиты в профиле.

Че так заморочено…  
Sub test1()  
   Dim x  
   For x = Sheets.Count To 2 Step -1  
       If Sheets(x).Range(«B6») <> «» Then Sheets(x).Delete  
   Next x  
End Sub

Я сам — дурнее всякого примера! …

 

RED

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

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

{quote}{login=KukLP}{date=05.11.2011 04:46}{thema=}{post}Че так заморочено…  
Sub test1()  
   Dim x  
   For x = Sheets.Count To 2 Step -1  
       If Sheets(x).Range(«B6») <> «» Then Sheets(x).Delete  
   Next x  
End Sub{/post}{/quote}  
Это условие я для простоты написал, мне важно чтобы номера листов брались из массива.

 

Hugo

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

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

Можно так Ваш код подправить, но конечно замороченно…  
Но номера из массива :)  
А я ещё недавно думал — кому может понадобиться в массив имена листов собирать, чтоб потом сразу все удалить, если это можно делать проще сразу по-одному?  
А вот подиж ты…  

    Sub test1()  
   ReDim dlt(0)  
   v = 1  
   For x = 1 To Sheets.Count  
       If Sheets(x).Range(«B6») <> «» Then  
           If v = 1 Then  
               dlt(v — 1) = x  
           Else  
               ReDim Preserve dlt(UBound(dlt) + 1)  
               dlt(v — 1) = x  
           End If  
           v = v + 1  
       End If  
   Next x  
   Worksheets(dlt).Delete  
End Sub  

    Ещё DisplayAlerts вероятно нужно отключить.

 

RED

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

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

Hugo. Ну это тоже самое, проблем с тем чтобы набрать номера страниц в массив у меня нет, проблема именно в том, что worksheets не хочет переваривать в себе этот dlt выдаёт ошибку out of range.

 

nerv

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

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

Worksheets(dlt(0)).Delete

 

Hugo

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

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

Похоже, что мою редакцию Вы не проверили…

 

RED

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

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

#19

05.11.2011 23:13:56

Всё, разобрался, всем спасибо.

Выделить несколько листов при заданном условии

Kamikadze_N

Дата: Вторник, 26.07.2016, 08:12 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 75


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

Добрый день. В рабочей книге есть несколько листов (их названия не меняются). На одном из листов есть форма формирующая новые листы, названия которых 6ти значные числа.
Нужно выделять эти сформированные листы, отправить их на печать и удалить.
Подскажите пожалуйста, как прописать условие чтобы выделялись все листы попадающие под условие.[vba]

Код

For i = 1 To Sheets.Count Step 1
        If Sheets(i).Name <> «Виды работ» And Sheets(i).Name <> «Справочник МТП» And Sheets(i).Name <> «Трактор номер и водитель» And Sheets(i).Name <> «412-АПК» _
        And Sheets(i).Name <> «Пустой Бланк» And Sheets(i).Name <> «Учет Работы» And Sheets(i).Name <> «Рабочая форма» Then
        arr(i) = Worksheets(i).Name
        End If
    Next
    Sheets(arr).Select

[/vba]
Самое то странное, что ранее код был вот такой.
[vba]

Код

x = 1
    For i = 1 To Sheets.Count
        If Sheets(i).Name <> «Виды работ» And Sheets(i).Name <> «Справочник МТП» And Sheets(i).Name <> «Трактор номер и водитель» And Sheets(i).Name <> «412-АПК» _
        And Sheets(i).Name <> «Пустой Бланк» And Sheets(i).Name <> «Учет Работы» And Sheets(i).Name <> «Рабочая форма» Then
            If x = 1 Then
                Sheets(i).Select
            Else
                Sheets(i).Select Replace:=False
            End If
            x = x + 1
        End If
    Next

[/vba]
И он работал, а в один прекрасный момент перестал работать и выделяется только один лист.

 

Ответить

KuklP

Дата: Вторник, 26.07.2016, 08:28 |
Сообщение № 2

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

У Вас одна переменная и для счетчика листов и для индекса массивов. Это неправильно. Дальше и обсуждать не стоит. Что за массив arr? Хотите помощи — не обрывки своего ваяния выкладывайте, а пример согласно Правил.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Kamikadze_N

Дата: Вторник, 26.07.2016, 09:06 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 75


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

KuklP, Вот файл с примером, Нужно что бы при нажатии на кнопку выделялись только листы которые были ей же и созданы.

К сообщению приложен файл:

2357853.xlsm
(22.7 Kb)

 

Ответить

RAN

Дата: Вторник, 26.07.2016, 09:25 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Код

    ‘Выделяем все я листы, кроме «Вид работ» и т.д т.е. все ячейки название которых не соответствует шаблонам
    Dim k&
    ReDim arr(k)
    For i = 1 To Sheets.Count Step 1
        If Sheets(i).Name <> «БазаДанных» And Sheets(i).Name <> «Просто лист» Then
            ReDim Preserve arr(k)
            arr(k) = Sheets(i).Name
            k = k + 1
        End If
    Next
    Sheets(arr).Select

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

Kamikadze_N

Дата: Вторник, 26.07.2016, 09:27 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 75


Репутация:

6

±

Замечаний:
0% ±


Excel 2010

RAN, Огромное спасибо!

 

Ответить

Apkaxa

0 / 0 / 0

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

Сообщений: 23

1

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

24.05.2011, 12:17. Показов 11188. Ответов 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 не подходит в силу ‘изменчивости’ начинки массива, то приходится использовать обычные массивы и в итоге мы сразу попадаем на использование перебора в цикле).

1 выберите метод

1.1 Метод Range.Select (Выбрать объект.)

  • Метод Select, применяемый к объектам Shape и ShapeRange.
  • Выберите указанный объект.
  • грамматика
  • Expression.Select (Заменить), выражение является обязательным. Это выражение возвращает предыдущий объект.
  • Выражение — это переменная, представляющая объект Range.
  • Заменить тип варианта, необязательно.При добавлении графики, если он имеет значение True, выбранный контент будет заменен; если он равен False, новая графика будет добавлена ​​к выбранному контенту.Метод Select применяется ко всем остальным объектам в списке «Применить к».
  •  
  • Возвращаемое значение: вариант
  • Примечание. Чтобы выделить ячейку или диапазон ячеек, используйте метод Select. Чтобы сделать одну ячейку активной ячейкой, используйте метод Activate.

1 Как выбрать сразу несколько листов

1.0 Ручное управление Excel, выберите несколько таблиц

  • Выберите несколько листов: удерживайте ctrl + несколько листов
  • Активировать рабочий лист: активировать только один лист за раз, чтобы стать активным, всегда есть только одна активная книга и активный лист

1.1 Код 1: выберите несколько фиксированных листов одновременно (никакие скрытые листы не сообщат об ошибке)

  • Можем ли мы использовать фиксированный размер массива? Нет, просто вероятность ошибки относительно мала
Sub test_select2()

Dim arr1()

ReDim arr1(1 To 3)
For i = 1 To 3
    arr1(i) = Worksheets(i).Name
Next


Worksheets(arr1).Select


End Sub

1.2 Код 2: Все выбранные листы, если среди них есть скрытые листы, будет легко ошибиться

  • Если в книге есть скрытая книга, и она не является скрытой, с этим кодом будет сообщено об ошибке: метод выбора листов недействителен
  • Должно быть так, что скрытый лист нельзя выбрать.
  • Поэтому, если вы столкнулись с этой проблемой, сначала проверьте: скрыты ли какие-то листы, но их необходимо выбрать в коде.
Sub test_select2()

Dim arr1()

ReDim arr1(1 To Worksheets.Count)
For i = 1 To Worksheets.Count
    arr1(i) = Worksheets(i).Name
Next


Worksheets(arr1).Select

End Sub

1.3 Для выбора нескольких листов можно использовать несколько методов

способ 1

Sub test_select3()
 
Dim arr1()
 
ReDim arr1(1 To Worksheets.Count)
For i = 1 To Worksheets.Count
    arr1(i) = Worksheets(i).Name
Next
 
Worksheets(arr1).Select

End Sub

Способ 2

Sub test_select4()
 
Worksheets.Select

End Sub

Способ 3

  • Если вы не выберете false, в конце будет выбран только один лист.
  • select ture Значение по умолчанию — ture, что означает замену содержимого

Sub test_select5()
 
Dim i As Object

For Each i In Worksheets
         i.Select False'Если вы не добавляете параметр select false, каждый раз выбирается только 1 лист
Next


End Sub

2 Выбор обычно относится только к содержимому листа, обычно это диапазон

2.1 selection

  • Атрибут Application.Selection
  • Возвращает объект, выбранный в активном окне для объекта Application.
  • грамматика
  • Выражение. Выбор
  • Выражение Переменная, представляющая объект Application.
  • Тип возвращаемого объекта зависит от текущего выделения (например, если ячейка выбрана, это свойство вернет объект Range). Если ничего не выбрано, свойство Selection вернет Nothing.
  • Без использования идентификаторов объектов использование этого свойства эквивалентно использованию Application.Selection.
     

2.2 Кажется, что выбор — это то, что вы выбираете, но что на самом деле измеряется? Чтобы

  • Само выделение является атрибутом, а его родительский объект: приложение, окна
  • Теоретически его возвращаемое значение — это объект, и какой бы объект ни был выбран, он возвращает, какой объект — но фактическое измерение не является ————- может потребоваться проверка
  • Метод создания атрибута выбора: select, конечно, пользователь также может использовать мышь, клавиатуру и другие операции для создания

Измеренный рабочий лист. Выберите, но выбор все еще находится в диапазоне

Sub t1()

Worksheets("sheet4").Select
MsgBox "The selection object type is " & TypeName(Selection)

End Sub

2.2 Как правило, выбор — это только диапазон на листе

  • select
  • select может выбрать диапазон wb sh и так далее
  • Фактическое содержание выделения не является естественным = XX .select
  •  
  • выбор относится конкретно к диапазону на листе

Тестовый код

Sub test_select3()
 
Dim arr1()
 
ReDim arr1(1 To Worksheets.Count)
For i = 1 To Worksheets.Count
    arr1(i) = Worksheets(i).Name
Next
 
Worksheets(arr1).Select

'Несмотря на то, что выбрано несколько листов, выбор не относится к содержимому выбранного листа
 'Следующее сообщит об ошибке
'Dim j As Worksheet
'For Each j In Selection
'    Debug.Print j.Name
'Next
 

 'Кажется, что выделение относится конкретно к области выделения на листе, которая относится конкретно к диапазону
Selection.Font.Color = vbRed
Selection.Font.Bold = True
Selection.Interior.ColorIndex = 6


End Sub

2.3 выбор может также быть другим содержанием в листе

Sub test117()

MsgBox "The selection object type is " & TypeName(Selection)

End Sub

Selection.Copy

Selection.ClearContents

Один, объект Range

Объект Range представляет собой непрерывную область на странице. С помощью объекта Range вы можете получить или изменить любую область на странице.

Во-вторых, объект Selection

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

Получите объект Selection с помощью оператора:

var selection = document.getselection();
 

Формулировка задачи:

Понимаю, что ламерский вопрос, но тем не менее:
Нужные ячейки я выделяю командой

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

Код к задаче: «Как выделить несколько листов?»

textual

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

Полезно ли:

5   голосов , оценка 3.600 из 5

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Выделить неповторяющиеся значения в excel
  • Выделенный текст vba excel
  • Выделить не пустой диапазон excel vba
  • Выделенные ячейки в excel нет на печати
  • Выделенные ячейки excel delphi

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии