Страницы: 1
RSS
Отсортировать листы в книге по листам, не по названиям
 
Здравствуйте! Нашла много макросов и все они сортируют именно по названию. Могут по алфавиту расставить или по числам. А вот именно порядок листов, чтобы шел вначале "Лист 1, Лист 2...." не могут. Постоянно получается "Лист 1, Лист 10,.... Лист 2, Лист 20"
Кто нибудь может сталкивался или находил подобный макрос? это ведь по идее проще, а найти все равно не смогла
 
Доброе время суток.
Проще всего переименовать Лист1 в Лист01, Лист2 в Лист02 - тогда найденные макросы и будут сортировать в правильном порядке ;)
 
Allablond, здравствуйте! Когда числа "как текст" - сортировка идёт текста и порядок 1,10 - нормальный. Если будет Лист 01, Лист 02 - вот тогда и сортировка будет нормальная  ;)
Изменено: Jack Famous - 05.04.2018 11:21:13
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Allablond написал: Нашла много макросов
Ну можно же чуть доработать один из них и будет Вам счастье. Для того примера, который Вы озвучили. Все имена листов должны начинаться с 'Лист...'
Скрытый текст
Согласие есть продукт при полном непротивлении сторон
 
Андрей VG, Sanja, Jack Famous, Я может не совсем правильно описала. Смотрите у листов есть уже названия, они разные у всех. Но сам ексель у себя, их все равно называет "Лист 1, Лист 2 ...." А название когда вы смотрите на Листы может быть и городами, и цифрами и всем чем угодно. Так вот, как именно по эксель названиям отсортировать.
Когда заходишь в VBA там написано "Лист 1 (84849844), Лист 10 (47849261)...."
Все макросы, опираются на название (84849844) и тд. А хотелось бы чтобы на Лист 1, и тд (((((((
Я совершенно ничего не понимаю как тут сделать(
 
Allablond, не сортировка, а для общего развития:
Код
Sub aa()
Dim sh As Worksheet
Set sh = ActiveSheet
txt$ = sh.CodeName
End Sub
Прогоните в VBE этот микро-код через F8.
 
Anchoret,И что должно было произойти?
 
Цитата
Allablond написал:
И что должно было произойти?
это был вопрос к вам, чтобы вы сделали ,что вам предложили и поняли, о чём вообще идёт речь
Вот ещё почитать. Предупрежу, что сортировка по кодовому имени в пределах одной книги ещё возможна, а вот, если макрос "полезет" в другие файлы, то проблем не миновать
Изменено: Jack Famous - 05.04.2018 12:42:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Allablond, в окно Locals смотрели? Вы хотите отсортировать по кодовым (внутренним) именам листов. Это имеет практический смысл? Поиграйтесь с кодом от Sanja, и вместо iSh.Name - iSh.CodeName
 
Anchoret, В этом весь смысл моей работы и есть. Чтобы расставить листы по внутренним именам
 
Allablond, не работа, а мечта) см.выше
 
Что так что так. По внутреннему названию ничего не сортируется только по пользовательскому
 
М.б. так подойдет?
Код
Sub test()
    Dim sht As Worksheet, i&, arr()
    ReDim arr(1 To Worksheets.Count, 1)
    For Each sht In Worksheets
        i = i + 1
        arr(i, 1) = sht.Name
        arr(i, 0) = sht.CodeName
    Next sht
    For i = 1 To UBound(arr)
        arr(i, 0) = CInt(Replace(arr(i, 0), "Лист", ""))
    Next i
    arr = iSortArr(arr)
    For i = 1 To UBound(arr)
        Worksheets(arr(i, 1)).Move before:=Worksheets(i)
    Next i
End Sub

Function iSortArr(arr)
    Dim j&, i&, txt, x&
    For i = 1 To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If arr(i, 0) > arr(j, 0) Then
                For x = 0 To UBound(arr, 2)
                    txt = arr(i, x)
                    arr(i, x) = arr(j, x)
                    arr(j, x) = txt
                Next x
            End If
        Next j
    Next i
    iSortArr = arr
End Function
"Все гениальное просто, а все простое гениально!!!"
 
Allablond, произвольным образом переименуйте листы в книге-примере. Потом прогоните макрос еще раз. Порядок листов будет по возрастанию кодовых доп.индексов ("Лист" доп.индекс 1 и т.д.). А в VBE видимо такое отображение заложено изначально и неизменяемо, только если переименовать кодовые названия листов (как и писали раньше).

Да, и переименовать кодовые имена можно только редакторе.
Изменено: Anchoret - 05.04.2018 13:35:19
 
Nordheim,Ура! Все работает))) Спасибо ! :*  
 
Убрал один цикл в основной процедуре, результат тот же.
Код
Sub test()
    Dim sht As Worksheet, i&, arr()
    ReDim arr(1 To Worksheets.Count, 1)
    For Each sht In Worksheets
        i = i + 1
        arr(i, 1) = sht.Name
        arr(i, 0) = CInt(Replace(sht.CodeName, "Лист", ""))
    Next sht
    arr = iSortArr(arr)
    For i = 1 To UBound(arr)
        Worksheets(arr(i, 1)).Move before:=Worksheets(i)
    Next i
End Sub
Изменено: Nordheim - 05.04.2018 13:45:29
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, так ругается на iSortArr почему-то
 
Allablond, а вы функцию iSortArr из #13 оставили? Если нет, то добавьте, т.к. Nordheim имел ввиду изменения в процедуре (Sub), не трогая функцию. А так, функции у вас нет, а код к ней обращается - вот и ругань  :)

Nordheim, мне очень понравилась размерность 1 to n, 1 — это же то же самое, что 1 to n, 0 to 1? )))
Изменено: Jack Famous - 05.04.2018 14:08:22
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, ой, и правда, спасибо)  
 
Цитата
Jack Famous написал:
Nordheim , мне очень понравилась размерность 1 to n, 1 — это же то же самое, что 1 to n, 0 to 1? )))
В первой мерности пришлось бы играть с "+" или "-" т.к. нет листов с нулевым индексом. а вторая мерность ни к чему не обязывает  :D
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, как строится массив по которому листы расставляются?
 
Не понял вопрос.  8-0 , что значит строится?
"Все гениальное просто, а все простое гениально!!!"
 
Allablond, как я понял. Если что, автор может поправит и/или дополнит :)
Код
Sub test()
    Dim sht As Worksheet, i&, arr()
    ReDim arr(1 To Worksheets.Count, 1) ' объявляем 2 размерности массива (от 1 и до количества листов, от 0 до 1)
    For Each sht In Worksheets 'цикл по всем листам
        i = i + 1 'счётчик для следующего листа (первая размерность)
        arr(i, 1) = sht.Name 'пишем во второй элемент второй размерности имя ярлыка листа
        arr(i, 0) = CInt(Replace(sht.CodeName, "Лист", "")) 'пишем в первый элемент второй размерности программное/кодовое имя листа, убирая текст. Получаем целое число
    Next sht
    arr = iSortArr(arr) 'сортируем получившийся массив. Так как ПЕРВЫМИ элементами второй размерности являются целые числа, то сортировка корректна.
    For i = 1 To UBound(arr)
        Worksheets(arr(i, 1)).Move before:=Worksheets(i) 'переставляем листы, согласно нового порядка
    Next i
End Sub
То есть у нас получается массив из N листов, к каждому из которых (вторая размерность) "прикреплено" 2 параметра — Кодовое имя листа (убрали текст и получили целые числа) и имя ярлыка листа.
Вот ещё справочник по массивам. Вы уверены, что вам нужна эта информация?  :D
Изменено: Jack Famous - 05.04.2018 16:39:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Сама сортировка производится в той части которая называется iSortArr  (на которую у вас ругался макрос).
"Все гениальное просто, а все простое гениально!!!"
 
Jack Famous,  8-0 Не уверена что нужна. Но в будущем я думаю меня об этом спросят. Спасибо большое за комментарии к коду, пошла разбираться !!! :*
Nordheim, И вам спасибо за помощь, вы мои спасители, не знаю даже чтобы я делала без вашей помощи!!!
Страницы: 1
Наверх