Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка листов(вкладок) по алфавиту, Excel 
:(
    Опции темы
olga90
Дата 20.3.2008, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



Как программно отсортировать листы(вкладки) по алфавиту
PM MAIL   Вверх
olga90
Дата 20.3.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



Мне нужно сделать сортировку всех листов по алфавиту по возрастанию А, Б, В (через макрос), исключив из этой сортировки 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)


ничего не возвращает :(
Показывает пустоту
PM MAIL   Вверх
Akina
Дата 20.3.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



Код

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



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
olga90
Дата 20.3.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



спасибо

а как сделать сортировку всех листов по алфавиту по возрастанию А, Б, В (через макрос), исключив из этой сортировки 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 - 20.3.2008, 16:08
PM MAIL   Вверх
olga90
Дата 21.3.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



up
PM MAIL   Вверх
Akina
Дата 21.3.2008, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
olga90
Дата 21.3.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



2) как перед сортировкой узнать позицию нужных мне вкладок чтобы после сортировки вернуть на место - т.е. имитировать как будто они не включены в сортировку
PM MAIL   Вверх
Akina
Дата 21.3.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 26
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
olga90
Дата 21.3.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



слишком сложно для меня :(

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

ругается  на  ActiveWorkbook.Sheets(SheetNames(i)).Move ActiveWorkbook.Sheets(i)
PM MAIL   Вверх
olga90
Дата 22.3.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



up
PM MAIL   Вверх
olga90
Дата 27.3.2008, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



???
PM MAIL   Вверх
mihanik
Дата 5.4.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 9
Всего: 109



Цитата(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(




--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0990 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.