Сортировка листов

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

Откройте редактор Visual Basic с помощью сочетания клавиш ALT+F11, вставьте новый модуль (меню Insert - Module) и скопируйте туда код этого макроса:

Sub SortSheets()
    Dim I As Integer, J As Integer

    For I = 1 To Sheets.Count - 1
        For J = I + 1 To Sheets.Count
            If UCase(Sheets(I).Name) > UCase(Sheets(J).Name) Then
                Sheets(J).Move Before:=Sheets(I)
            End If
        Next J
    Next I
End Sub 

Теперь этот макрос можно запустить через меню Сервис - Макрос - Макросы (Tools - Macro - Macros) или нажав сочетание клавиш ALT+F8 и выбрав команду Выполнить (Run) он быстро отсортирует все листы в текущей книге по возрастанию.

Ссылки по теме

 



Ольга
04.10.2012 00:07:01
Давно искала, как это сделать. Спасибо!
Вячеслав
04.10.2012 00:07:30
Спасибо. Годами перебирал листы и вдруг такое счастье.
amalta
04.10.2012 00:08:08
я Вас люблю!!!
все гениальное-просто!
предлагаю сделать рабочие дни до 17.00 для тех кто использует макросы)))).
БАТЯ
04.10.2012 00:08:59
МЕГА РЕСПЕКТ!!! Очень актуально для постоянной работы!
Rosi
04.10.2012 00:09:45
вау, спасибо! Было около 100 листов в книге! теперь порядок :)
15.01.2013 07:02:22
Очень хорошая и нужная штука, вот только одна проблема, имена листов только из цифр сортирует как текст, т.е. не 1, 2, 3...10,11... а 1,10,11...2,20,21... можно конечно присвоить 01, 02, 03... но собранные листы из других книг именно так автоматом именуются (там ИНДЕКС работает).
19.07.2014 10:52:00
Просто замените в коде в двух местах в 6-й строке UCase на Cint и проблема будет решена для числовых названий листов.
Правда с текстовыми названиями тогда макрос работать не сможет.
17.07.2014 14:00:48
Спасибо за такой отличный сайт, многому научилась. Но дойля до макросов - тупик. Копирую Макрос в "Модуль", он вставляет его строкой, а не в столбик и выдает ошибку. Прошу простить за столь неопытное описание проблемы. Подскажите, пожалуйста, как исправить?! Заранее спасибо.
19.07.2014 10:47:03
Наталья, лучше скачайте файл-пример с работающим макросом по ссылке в заголовке статьи и возьмите макрос оттуда  :)
30.09.2014 06:11:58
Добрый день. Скопированный макрос прекрасно работает , при замене в коде для сортировки по нумерации в двух местах в 6-й строке UCase на Cint выходит ошибка.  
03.10.2014 10:04:06
Значит где-то у вас в имени листа не только числа, а пробелы, например, или другие символы, т.е. макрос не может корректно произвести преобразование имени листа в число.
03.10.2014 13:17:50
Да , там и другие символы. Но наименование начинается с цифр. 2_КЭ , 123_КЭ и т.д.
03.10.2014 13:21:53
"123_КЭ" - это уже текст, а не число, так что вам подойдет только первый вариант макроса, но сортировать будет по всей строке, а не по номеру, конечно.

Если у вас установлена надстройка PLEX, то можно попробовать использовать функцию GetNumbers выделения чисел из текста, которая в ней есть. Тогда 6-я строчка будет выглядеть как:
If GetNumbers(Sheets(I).Name) > GetNumbers(Sheets(J).Name) Then
19.06.2015 10:16:39
Добрый день!
Отличный инструмент!
Единственное что бы хотелось добавить, но своими скромными силами так у меня и не вышло, так это вывод сообщения о защите паролем книги от изменения ее структуры, если таковая у книги есть, и вывода диалогового окна с полем ввода пароля для снятия защиты.
Если бы Вы расширили таким образом функционал данного макроса, был бы Вам очень признателен как с практической точки зрения, так и с познавательской - очень интересно, как это все-таки должно быть написано))
Заранее спасибо!
16.12.2015 13:29:57
Здравствуйте! Благодарю за хорошую статью!
Подскажите пожалуйста где нужно изменить код для того что бы листы шли по определенной структуре:
К примеру: Нужна сортировка листов (месяцев) не от А до Я: а по их очередности: Январь; Февраль; Март.... Декабрь...
     Интересует именно в этой структуре кода:
     так как с помощью макрорекордера удалось сообразить пока вот такой:
     Sub Сортировка_месяцев()
   
 Sub Сортировка_месяцев()
    On Error Resume Next 'для пропуска недостающих листов 
    Sheets("Сводный").Move Before:=Sheets(1)
    Sheets("Январь").Move Before:=Sheets(2)
    Sheets("Февраль").Move Before:=Sheets(3)
    Sheets("Март").Move Before:=Sheets(4)
    Sheets("Апрель").Move Before:=Sheets(5)
    Sheets("Май").Move Before:=Sheets(6)
    Sheets("Июнь").Move Before:=Sheets(7)
    Sheets("Июль").Move Before:=Sheets(8)
    Sheets("Август").Move Before:=Sheets(9)
    Sheets("Сентябрь").Move Before:=Sheets(10)
    Sheets("Октябрь").Move Before:=Sheets(11)
    Sheets("Ноябрь").Move Before:=Sheets(12)
    Sheets("Декабрь").Move Before:=Sheets(13)
    'можно еще прописать MsgBox - для подсчета количества листов _
    по умолчанию их должно быть 13
End Sub
Наверх