сортировать книгу по первой букве имени каждого листа?

Программирование на Visual Basic for Applications
sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

сортировать книгу по первой букве имени каждого листа?

Сообщение sonata » 18.04.2003 (Пт) 17:00

Есть excel-файл c огромным кол-вом листов.
Необходимо сортировать данную книгу по первой букве имени каждого листа.
Можно такое осуществить?

Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol

Сообщение Calvin » 18.04.2003 (Пт) 17:14

RayShade давал хороший совет - создать невидимый листбокс, а потом можно отсортировать имена листов в нем и переставить листы с учетом сортировки.;-)

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 18.04.2003 (Пт) 17:23

Это не смотрите, смотрите алгоритм ниже в топике, тут неверно!
Sub nn()
n = Application.ThisWorkbook.Worksheets.Count
Workbooks(ThisWorkbook.Name).Activate
For j = 1 To n - 1
For i = 1 To n
If Sheets(i).Name < Sheets(1).Name Then
Sheets(i).Select
Sheets(i).Move Before:=Sheets(1)
End If
Next i
Next j
End Sub

Вот как :wink:
Последний раз редактировалось Vitaly1 18.04.2003 (Пт) 18:33, всего редактировалось 3 раз(а).

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 18.04.2003 (Пт) 17:25

2 Vitaly1

Способ хороший, но очень медленный. На действительно большом кол-ве личтов все вмрет просто.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 18.04.2003 (Пт) 17:34

Пардон господа! были ощибки в алгоритмах, поправил!
Rayshade -Тогда ускорим так:

Sub nn()
Dim v As Variant, flag As Variant
Workbooks(ThisWorkbook.Name).Activate
Do
flag = False
namelist = Sheets(1).Name
For Each v In Workbooks(ThisWorkbook.Name).Worksheets
If v.Name < namelist Then
Sheets(v.Name).Move Before:=Sheets(1)
flag = True
End If
namelist = v.Name
Next v
Loop Until flag = False

End Sub

:)
Последний раз редактировалось Vitaly1 18.04.2003 (Пт) 18:57, всего редактировалось 1 раз.

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 18.04.2003 (Пт) 18:42

а я бы сделал так :roll: :roll:
Код: Выделить всё
Sub dd()
Dim i As Integer, j As Integer, n As Integer
Dim st As String
ReDim mas(ThisWorkbook.Sheets.Count) As String
n = ThisWorkbook.Sheets.Count
For i = 1 To n
    mas(i) = ThisWorkbook.Sheets(i).Name
Next
For j = 2 To n
    st = mas(j)
    i = j - 1
    Do While i > 0 And mas(i) > st
        mas(i + 1) = mas(i)
        i = i - 1
    Loop
    mas(i + 1) = st
Next
For i = 1 To n
    ThisWorkbook.Sheets(mas(i)).Move Before:=Sheets(i)
Next
End Sub

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 18.04.2003 (Пт) 18:47

Corgi -

Мне кажется, что будет медленнее чем у меня!
Я даже уверен в этом!

corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва

Сообщение corgi » 18.04.2003 (Пт) 19:24

я бы не был так уверен :wink:
ps можно конечно в моем коде сделать все без массива(тогда мой код 100% быстрей), но с массивом мне кажется просто правильней для написания


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList