Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Сортировка листов(вкладок) по алфавиту


Автор: olga90 20.3.2008, 09:57
Как программно отсортировать листы(вкладки) по алфавиту

Автор: olga90 20.3.2008, 14:01
Мне нужно сделать сортировку всех листов по алфавиту по возрастанию А, Б, В (через макрос), исключив из этой сортировки 2 листа с названием, например, "Лист1" и "Лист23" ?

Делаю так
Код

Public Sub SortSheets(st1 As String, st2 As String)
    Dim SheetNames() As String
    Dim i As Integer
    Dim SheetCount As Integer
    Dim VisibleWins As Integer
    Dim Item As Object
    Dim OldActive As Object

    SheetCount = ActiveWorkbook.Sheets.Count
    
'   объявление массива
    ReDim SheetNames(1 To SheetCount)

'   настройка связи с активным листом
    Set OldActive = ActiveSheet
   
'   заполнение массива именами видимых листов
    For i = 1 To SheetCount
        If (ActiveWorkbook.Sheets(i).CodeName <> st1) And _
        (ActiveWorkbook.Sheets(i).CodeName <> st2) And _
        (ActiveWorkbook.Sheets(i).Visible = True) Then
            SheetNames(i) = ActiveWorkbook.Sheets(i).Name
        End If
    Next i
   
'   вызов основной функции сортировки листов
    Call BubbleSort(SheetNames)
   
'   Turn off screen updating
    Application.ScreenUpdating = False
    
'   Перемещение листов
    For i = 1 To SheetCount
        ActiveWorkbook.Sheets(SheetNames(i)).Move ActiveWorkbook.Sheets(i)
    Next i

'   Reactivate the original active sheet
    OldActive.Activate
End Sub


Код

Sub BubbleSort(List() As String)
'  сортировка вкладок книги
    Dim First As Integer, Last As Integer
    Dim i As Integer, j As Integer
    Dim Temp
   
    First = LBound(List)
    Last = UBound(List)
    For i = First To Last - 1
        For j = i + 1 To Last
            If UCase(List(i)) > UCase(List(j)) Then
                Temp = List(j)
                List(j) = List(i)
                List(i) = Temp
            End If
        Next j
    Next i
End Sub


Код

Private Sub CommandButton3_Click()
    SortSheets "Лист23", "Лист1"
End Sub


материться на ActiveWorkbook.Sheets(SheetNames(i)).Move ActiveWorkbook.Sheets(i)

Добавлено через 13 минут и 54 секунды
Код

MsgBox SheetNames(i)


ничего не возвращает :(
Показывает пустоту

Автор: Akina 20.3.2008, 15:29
Код

Dim i As Integer
Dim j As Integer

For i = 1 To Sheets.Count - 1
   For j = i + 1 To Sheets.Count
      If Sheets(j).Name < Sheets(i).Name Then
         Sheets(j).Move Before:=Sheets(i)
      End If
   Next j
Next i

Автор: olga90 20.3.2008, 16:03
спасибо

а как сделать сортировку всех листов по алфавиту по возрастанию А, Б, В (через макрос), исключив из этой сортировки 2 листа с названием, например, "Лист1" и "Лист23"  и только видимые?

Код

Public Sub SortSheets(st1 As String, st2 As String)
Dim i As Integer
Dim j As Integer

For i = 1 To Sheets.Count - 1
   For j = i + 1 To Sheets.Count
      If (ActiveWorkbook.Sheets(i).CodeName <> st1) And _
         (ActiveWorkbook.Sheets(i).CodeName <> st2) And _
         (ActiveWorkbook.Sheets(i).Visible = True) Then
            
             If Sheets(j).Name < Sheets(i).Name Then
                 Sheets(j).Move Before:=Sheets(i)
             End If
        
       End If
   Next j
Next i
   
End Sub


Private Sub CommandButton3_Click()
    SortSheets "Лист23", "Лист1"
End Sub



так сработает? или я с индексами перепутала?

Автор: olga90 21.3.2008, 11:40
up

Автор: Akina 21.3.2008, 12:22
Цитата(olga90 @  20.3.2008,  17:03 Найти цитируемый пост)
как сделать сортировку всех листов по алфавиту по возрастанию А, Б, В (через макрос), исключив из этой сортировки 2 листа с названием, например, "Лист1" и "Лист23"  и только видимые?

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

Автор: olga90 21.3.2008, 13:24
2) как перед сортировкой узнать позицию нужных мне вкладок чтобы после сортировки вернуть на место - т.е. имитировать как будто они не включены в сортировку

Автор: Akina 21.3.2008, 13:47
Цитата(olga90 @  21.3.2008,  14:24 Найти цитируемый пост)
как перед сортировкой узнать позицию нужных мне вкладок

Создать динамический массив.
Пройти по коллекции листов. Для каждого листа, если он должен быть исключен из сортировки (по имени или скрытости), запоминать в массив имя и порядковый номер.
Отсортировать массив по возрастанию исходных позиций листов (впрочем, если выгребать их, проходя по индексу, он будет сразу сортирован именно так).
Затем пройти по массиву, и каждый лист из него перемещать в конец книги.
Посчитать количество листов в массиве и в книге, выяснить, сколько листов надо сортировать.
Выполнить сортировку листов.
Опять пройти по массиву, восстанавливая положение листов, исключенных из сортировки, в порядке возрастания исходных номеров. При этом листы брать по имени, а не по индексу.
Все. 

Автор: olga90 21.3.2008, 14:02
слишком сложно для меня :(

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

ругается  на  ActiveWorkbook.Sheets(SheetNames(i)).Move ActiveWorkbook.Sheets(i)

Автор: olga90 22.3.2008, 15:17
up

Автор: olga90 27.3.2008, 08:09
???

Автор: mihanik 5.4.2008, 13:18
Цитата(olga90 @  21.3.2008,  14:02 Найти цитируемый пост)
объясните пожалуйста почему ошибка в коде, который я привела выше

ругается  на  ActiveWorkbook.Sheets(SheetNames(i)).Move ActiveWorkbook.Sheets(i) 


т.к. не хватает части оператора.
См. пример который привёл akina

Sheets(j).Move Before:=Sheets(i)


Цитата(olga90 @  21.3.2008,  14:02 Найти цитируемый пост)
ActiveWorkbook.Sheets(SheetNames(i)).Move <?> ActiveWorkbook.Sheets(


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)