Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/103: Рейтинг темы: голосов - 103, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 23
1

Удалить все листы кроме первого

04.07.2013, 15:24. Показов 18699. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Visual Basic
1
2
3
4
5
6
7
8
Sub Dell_all()
Application.DisplayAlerts = 0
Dim i As Integer
For i = 2 To Worksheets.Count
    Worksheets(i).Delete
    Next i
Application.DisplayAlerts = 1
End Sub
Удаляет все парные листы, а потом ругается:
script out of range
а в VBA выделяет строку
Visual Basic
1
Worksheets(i).Delete
Что не так делаю?)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2013, 15:24
Ответы с готовыми решениями:

Удалить все листы, кроме заданных
доброго дня всем Есть книга в которую юзеры добавляют Листы какие им вздумается Какой макрос...

(excel_2010_VBA) Удалить все листы кроме активного
Здравствуйте. Нашел макрос но у меня что-то не хочет работать, помогите человеку далекому от...

Массив: из заданного массива удалить все дубликаты, кроме первого и последнего вхождения...
Добрый день! Есть следующий массив: 1 1 2 2 2 2 3

Записать значения во все листы , кроме
Всем привет, У меня имеется лист в файле Экселя с названием "Источник" В этот лист будут...

10
54 / 39 / 3
Регистрация: 25.01.2013
Сообщений: 368
04.07.2013, 15:57 2
- Если у листа, который Вы планируете удалить, значение свойства Visible установлено как xlVeryHidden/xlSheetVeryHidden, то попытка его удаления приведёт к ошибке, которую можно избежать, если перед удалением сделать лист видимым, т.е. установить значение свойства Visible = True/xlSheetVisible
- После удаления листа, в рабочей книге должен остаться, как минимум, один видимый лист - Нельзя удалить лист, если рабочая книга является общей
- Нельзя удалить лист, если структура рабочей книги защищена

Добавлено через 7 минут
это то что по правилам,
а ксательно вашего примера вы подсчитываете количество листов, а удалять хотите по его индексу
Visual Basic
1
Worksheets(Array("Лист2", "Лист3", "Лист4")).Delete
0
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
04.07.2013, 16:20 3
Попробуйте так
Visual Basic
1
2
3
4
5
6
7
8
9
Sub Dell_all()
    Dim i As Integer
        Application.DisplayAlerts = 0
        For i = Worksheets.Count To 2 Step -1
            Worksheets(i).Visible = xlSheetVisible
            Worksheets(i).Delete
        Next i
        Application.DisplayAlerts = 1
End Sub
1
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
04.07.2013, 16:25 4
Нужно перевернуть цикл. Ошибка возникает потому, что когда Вы удаляете лист № 2, порядковые номера листов смещаются. Когда цикл доходит до конца, то листа с номером Worksheets.Count (на тот момент) уже не существует.

Visual Basic
1
2
3
4
5
6
7
8
9
Sub Dell_all()
Application.DisplayAlerts = false
Worksheets(1).activate
Dim i As Integer
For i = Worksheets.Count to 2 step -1
    Worksheets(i).Delete
Next i
Application.DisplayAlerts = true
End Sub
Добавлено через 44 секунды
Опередили.
1
0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 23
04.07.2013, 16:36  [ТС] 5
Цитата Сообщение от Султанов Посмотреть сообщение
- Если у листа, который Вы планируете удалить, значение свойства Visible установлено как xlVeryHidden/xlSheetVeryHidden, то попытка его удаления приведёт к ошибке, которую можно избежать, если перед удалением сделать лист видимым, т.е. установить значение свойства Visible = True/xlSheetVisible
- После удаления листа, в рабочей книге должен остаться, как минимум, один видимый лист - Нельзя удалить лист, если рабочая книга является общей
- Нельзя удалить лист, если структура рабочей книги защищена
Ни один из листов не скрывался, то есть должны быть видимы по умолчанию. Книга не защищена - все по умолчанию.
А сам макрос делался для того чтобы удалить все листы кроме первого, то есть в любом случае, как минимум один лист остается.

Цитата Сообщение от Султанов Посмотреть сообщение
а касательно вашего примера вы подсчитываете количество листов, а удалять хотите по его индексу
А разве индекс устанавливается не по порядку листов? То есть, подсчет количества листов должен быть аналогичен индексу последнего листа.
Цикл на удаления по задумке должен удалять все листы с индексом от второго до последнего по порядку из существующих.

Добавлено через 3 минуты
Цитата Сообщение от Dragokas Посмотреть сообщение
Нужно перевернуть цикл. Ошибка возникает потому, что когда Вы удаляете лист № 2, порядковые номера листов смещаются. Когда цикл доходит до конца, то листа с номером Worksheets.Count (на тот момент) уже не существует.
Блин, а ведь точно же)) все как всегда элементарно просто...
Спасибо большое, ребят)
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
04.07.2013, 16:39 6
Цитата Сообщение от AleX_X891 Посмотреть сообщение
все как всегда элементарно просто...
ага. Ради прикола:

Visual Basic
1
2
3
For i = 1 to Worksheets.Count-1
    Worksheets(2).Delete
Next i
0
0 / 0 / 0
Регистрация: 08.05.2013
Сообщений: 23
04.07.2013, 16:49  [ТС] 7
Цитата Сообщение от Dragokas Посмотреть сообщение
ага. Ради прикола:

Visual Basic
1
2
3
For i = 1 to Worksheets.Count-1
    Worksheets(2).Delete
Next i
Получается удаляет каждый второй лист пока не останется лишь один. Очень даже неплохо)
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
05.07.2013, 07:25 8
Лучший ответ Сообщение было отмечено как решение

Решение

если удалять листы по очереди - слишком долго, то можно поступить так:
Visual Basic
1
2
3
4
5
6
7
Sub t()
  Dim s$, i%
  For i = 2 To Worksheets.Count
    s = s & "/" & Worksheets(i).Name
  Next
  Sheets(Split(Mid(s, 2), "/")).Delete
End Sub
4
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
05.07.2013, 10:29 9
ikki, да, это будет наиболее быстро.
Тогда еще и вначале добавить:
Visual Basic
1
2
application.screenupdating = false
Application.DisplayAlerts = false
и в конец:
Visual Basic
1
2
Application.DisplayAlerts = true
application.screenupdating = true
0
54 / 39 / 3
Регистрация: 25.01.2013
Сообщений: 368
05.07.2013, 11:00 10
у меня вот вопрос по этой теме, вот визуально в ленте листов допустим первый лист "Первый", а вот в редакторе VBA он Лист 19 (Первый) на пятом месте, а если нужно оставить Лист1, а остальные удалить?
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
05.07.2013, 11:11 11
Тогда так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub tt()
  Dim s$, i%, ExcludeList$
  ExcludeList = "Лист1"
  Sheets(ExcludeList).activate  
  with application
    .screenupdating = false
    .DisplayAlerts = false
  For i = 1 To Worksheets.Count
    if Worksheets(i).name <> ExcludeList then
      s = s & "/" & Worksheets(i).Name
    end if
  Next
  Sheets(Split(Mid(s, 2), "/")).Delete
    .DisplayAlerts = true
    .screenupdating = true
  end with
End Sub
0
05.07.2013, 11:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2013, 11:11
Помогаю со студенческими работами здесь

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

Удалить все ячейки кроме одинаковых
Офис 2007 Есть 3 столбца с наименованиями товаров, напротив каждого товара еще столбец с ценой....

Удалить в строках все, кроме цифр
Написать функцию MyFunction на Бейсике, которая по данной строке (в качестве параметра) удаляет в...

Удалить всё, кроме параграфов, которые содержат введённый текст
Доброго времени суток! Подскажите, пожалуйста: Есть макрос, который удаляет параграфы,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru