Макрос для сортировки листов книги Excel по алфавиту

Sub SortSheets()
    ' сортировка листов книги по алфавиту
    Dim astrSheetNames() As String  ' Массив для хранения имен листов
    Dim intSheetCount As Integer, i As Integer, objActiveSheet As Object
    If ActiveWorkbook Is Nothing Then Exit Sub
    ' Проверка защищенности структуры рабочей книги
    If ActiveWorkbook.ProtectStructure Then MsgBox "Структура книги " & ActiveWorkbook.Name _
     & " защищена. Сортировка листов невозможна.", vbCritical: Exit Sub
    Set objActiveSheet = ActiveSheet    ' Сохраняем ссылку на активный лист книги
    ' Application.EnableCancelKey = xlDisabled' Отключение сочетания клавиш Ctrl+Pause Break
    Application.ScreenUpdating = False
    intSheetCount = ActiveWorkbook.Sheets.count
 
    ReDim astrSheetNames(1 To intSheetCount)    ' Заполнение массива astrSheetNames именами листов книги
    For i = 1 To intSheetCount
        astrSheetNames(i) = ActiveWorkbook.Sheets(i).Name
    Next i
 
    Call Sort(astrSheetNames)    ' Сортировка массива имен в порядке возрастания

    For i = 1 To intSheetCount    ' Перемещение листов книги
        ActiveWorkbook.Sheets(astrSheetNames(i)).Move ActiveWorkbook.Sheets(i)
    Next i
 
    objActiveSheet.Activate    ' Переход на исходный рабочий лист
    Application.ScreenUpdating = True
    ' Application.EnableCancelKey = xllnterrupt' Включение сочетания клавиш Ctrl+Pause Break
End Sub
 
Sub Sort(astrNames() As String)    ' Сортировка массива строк по алфавиту (в порядке возрастания)
    Dim i As Integer, j As Integer
    Dim strBuffer As String, fBuffer As Boolean
    For i = LBound(astrNames) To UBound(astrNames) - 1
        For j = i + 1 To UBound(astrNames)
            If astrNames(i) > astrNames(j) Then    ' Меняем i-й и j-й элементы массива местами
                strBuffer = astrNames(i): astrNames(i) = astrNames(j): astrNames(j) = strBuffer
            End If
        Next j
    Next i
End Sub

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Большое пребольшое спасибо - цены Вам нет!! Молодцы

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

Получите готовый макрос из 4 строк:

Sub ПечатьЛистовВЗаданномПорядке()
    Worksheets(1).PrintOut From:=1, To:=1, Copies:=1
    Worksheets(2).PrintOut From:=1, To:=1, Copies:=1
    Worksheets(1).PrintOut From:=2, To:=2, Copies:=1
    Worksheets(2).PrintOut From:=2, To:=2, Copies:=1
End Sub

Если листов много, и страниц на каждом листе тоже немало, — можно сделать цикл по листам,
взяв за основу предложенный выше макрос.

И ещё: в настройках печати Excel, есть опция «разобрать по копиям».
Возможно, она вам тоже пригодится.

Подскажите, пожалуйста, как вывести на печать листы в постраничном порядке с каждого листа. Т.е. у меня несколько листов в файле, мне хотелось бы, чтобы принтер печатал в таком порядке: первая страница с первого листа, второя страница со второго листа, потом 2 страница с первого листа, 2 страница со второго листа и т.д..
Спасибо!

Alex super, прога работает

Что-то сложновато...
Так, ИМХО, проще:

Private Sub СОРТИРОВАТЬ_ЛИСТЫ()   ' сортировка листов в активной книге (не сортирует скрытые листы)
   Dim i%, j%
   With ActiveWorkbook
      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)
         Next j
      Next i
   End With
End Sub

Или так:

Sub СОРТИРОВАТЬ_ВСЕ_ЛИСТЫ()   ' сортировка листов в активной книге (сортирует даже скрытые листы)
   Application.ScreenUpdating = False: Application.EnableEvents = False
   Dim iSht As Worksheet, oDict As Object, i%, j%
   Set oDict = CreateObject("Scripting.Dictionary")
   For Each iSht In ActiveWorkbook.Sheets   ' запомнить состояние видимости каждого из листов и сделать все видимыми
      oDict.Item(iSht.Name) = iSht.Visible: iSht.Visible = True
   Next
   With ActiveWorkbook   ' сортировка видимых листов
      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)
         Next j
      Next i
   End With
   For Each iSht In ActiveWorkbook.Sheets   ' восстановить исходное состояние видимости каждого из листов
      iSht.Visible = oDict.Item(iSht.Name)
   Next
   Application.EnableEvents = True: Application.ScreenUpdating = True
End Sub

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _   _                          ____   _____
| | | |__ _ __ ___ ___ / ___| |__ /
| | | '_ \ | '_ ` _ \ / __| | | _ / /
| | | | | | | | | | | | \__ \ | |_| | / /_
|_| |_| |_| |_| |_| |_| |___/ \____| /____|
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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