Страницы: 1
RSS
сортировка листов книги
 
Помогите с макросом для сортировки листов.  
Суть такая. Есть листы, например А1,А10,А5,А21 (буква может быть любая) и КМД А1,КМД А5.., они все в перемешку. необходимо отсортировать так ..1,..2,..3,...10,..11,....,КМД ..1,КМД ..2, и т.д.  
 
буду благодарен за помощь.
 
Если хотите так сортировать - нельзя так называть листы. Или нужно усложнять код, чего я делать не хочу, ибо не окупаются затраты (не интересно).  
Ну а если назовёте листы вида А001 (число нулей по задаче), а не А1 - то вот наладил один подходящий код:  
 
 
Sub SortSheets()  
Dim SheetNames() As String  
Dim SheetCount As Integer  
Dim i As Integer  
   SheetCount = ActiveWorkbook.Sheets.Count  
   ReDim SheetNames(1 To SheetCount)  
       For i = 1 To SheetCount  
          SheetNames(i) = ActiveWorkbook.Sheets(i).Name  
        Next i  
   Call BubbleSort(SheetNames)  
     
   Sheets(SheetNames(1)).Move before:=Sheets(1)  
   For i = LBound(SheetNames) + 1 To UBound(SheetNames): Sheets(SheetNames(i)).Move after:=Sheets(i - 1): Next  
 
End Sub  
 
 
Sub BubbleSort(List() As String)  
Dim First As Integer, Last As Integer  
Dim i As Integer, j As Integer  
Dim Temp As String  
   First = LBound(List)  
   Last = UBound(List)  
       For i = First To Last - 1  
           For j = i + 1 To Last  
               If List(i) > List(j) Then  
                   Temp = List(j)  
                   List(j) = List(i)  
                   List(i) = Temp  
               End If  
           Next j  
       Next i  
End Sub
 
Ещё вариант, сортирующий по первой последовательности цифр в названии листа. Комбинируйте и добьётесь того, чего нужно  
Public Sub SortSheets(ByVal inBook As Excel.Workbook)  
   Dim RegExp As Object, i As Long, sName As String  
   Dim sortSheet As Excel.Worksheet  
   Dim vData() As Variant, regAnsweer As Object  
   Dim sortRange As Excel.Range, sortData As Variant  
     
   Application.ScreenUpdating = False  
   Set RegExp = CreateObject("VBScript.RegExp")  
   RegExp.Pattern = "\d+"  
   ReDim vData(1 To inBook.Worksheets.Count + 1, 1 To 2)  
   vData(1, 1) = "sheetName": vData(1, 2) = "Number"  
   Set sortSheet = inBook.Worksheets.Add(Before:=inBook.Worksheets(1))  
   For i = 2 To inBook.Worksheets.Count  
       sName = inBook.Worksheets(i).Name: vData(i, 1) = sName  
       Set regAnsweer = RegExp.Execute(sName)  
       If regAnsweer.Count > 0 Then vData(i, 2) = CLng(regAnsweer(0).Value)  
   Next i  
   Set sortRange = sortSheet.Range(sortSheet.Cells(1, 1), sortSheet.Cells(UBound(vData, 1), 2))  
   sortRange.Value = vData  
   sortRange.Sort Key1:=sortSheet.Range("B1"), Order1:=xlAscending, Header:=xlYes, DataOption1:=xlSortNormal  
   sortData = sortSheet.Range(sortSheet.Cells(2, 1), sortSheet.Cells(UBound(vData, 1), 1)).Value  
   For i = 1 To UBound(sortData, 1)  
       inBook.Worksheets(sortData(i, 1)).Move Before:=sortSheet  
   Next i  
   Application.DisplayAlerts = False  
   sortSheet.Delete  
   Application.DisplayAlerts = True  
   Application.ScreenUpdating = True  
End Sub
 
Еще вариант: за один цикл собрать все в коллекцию, сортируя при этом. Номера листов можно доставать регой.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
В "Приемах" много чего есть... http://www.planetaexcel.ru/tip.php?aid=75
 
спасибо за ответы. Попробуем разобраться.
Страницы: 1
Наверх