Страницы: 1
RSS
Сложная сортировка по годам с дополнительными условиями, макрос, код год VBA макрос
 
Здравствуйте, столкнулся с сложным условием сортировки по годам, есть данные
их надо расставить по коду внутри слеша /**/ , по годам и по числам, чтобы вышло так
нажав кнопку сортировать данные получили результат такой
2-10201/1/2012
2-0057/1/2013
2-1590/6/2014
2-0033/7/2014
2-0202/7/2015
2-061/8/2014
2-0253/11/2010
2-170/17/2014
2-0121/22/2011
2-1771/70/2007

пример для обработки взят из этих данных

2-1590/6/2014
2-0033/7/2014
2-0057/1/2013
2-0121/22/2011
2-170/17/2014
2-10201/1/2012
2-0202/7/2015
2-0253/11/2010
2-1771/70/2007
2-061/8/2014
Изменено: next777pro - 29.07.2016 09:24:39
 
Макрос писать Вам не буду, но предложу в соседнюю от первой ячейки со значениями прописать формулу
Код
=ПОДСТАВИТЬ(ПСТР(B2;ПОИСК("/";B2)+1;100);"/";",") 
протянуть вниз и отсортировать по этому столбцу.
 
Код
Option Explicit

Sub сортируйМеняПолностью()
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim r As Range
    Dim r1 As Range
    Dim iY As Integer
    Dim s1 As String
    Dim i As Integer
    Dim j As Integer
    
    Application.ScreenUpdating = False
    
    Set sh1 = ActiveSheet
    Sheets.Add after:=Sheets(Sheets.Count)
    Set sh2 = Sheets(Sheets.Count)
    
    With sh1
        Set r = Intersect(.UsedRange, .Range(.Cells(2, 2), .Cells(Rows.Count, 2)))
    End With
    
    r.Copy sh2.Cells(1)
    
    With sh2
'        .UsedRange.Resize(, 4).NumberFormat = "@"
        For iY = 1 To .UsedRange.Rows.Count
            s1 = .Cells(iY, 1).Text
            s1 = Mid(s1, 3)
            i = InStr(s1, "/")
            If i > 0 Then
                j = InStr(s1, "-")
                .Cells(iY, 2).Value = Left(s1, i - 1)
                If j > 0 Then
                    .Cells(iY, 2).Value = Left(s1, j - 1)
                Else
                    .Cells(iY, 2).Value = Left(s1, i - 1)
                End If
                                
                s1 = Mid(s1, i + 1)
                i = InStr(s1, "/")
                If i > 0 Then
                    .Cells(iY, 3).Value = Left(s1, i - 1)
                    
                    .Cells(iY, 4).Value = Mid(s1, i + 1)
                End If
                
                
                
            End If
        Next
        
        With .Sort
            With .SortFields
                .Clear
                .Add Key:=Intersect(.Parent.Parent.UsedRange, .Parent.Parent.Columns(4)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .Add Key:=Intersect(.Parent.Parent.UsedRange, .Parent.Parent.Columns(3)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                .Add Key:=Intersect(.Parent.Parent.UsedRange, .Parent.Parent.Columns(2)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            End With
            
            .SetRange .Parent.UsedRange
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        
        Intersect(.UsedRange, .Columns(1)).Copy r
        
    End With
    
    Application.DisplayAlerts = False
    sh2.Delete
    Application.DisplayAlerts = True
    sh1.Activate
    Application.ScreenUpdating = True
    
End Sub

Изменено: МатросНаЗебре - 29.07.2016 10:09:25
 
не могу понять почему не работает ?
МатросНаЗебре, он по годам делает только
после сортировки года, как отсортировать по коду в слеше
/7/
/1/

чтобы вышло
/1/
/7/  
Изменено: next777pro - 29.07.2016 17:40:25
 
Цитата
next777pro написал: а по он годам делает только
Магистру Йода привет :)

Макрос сортирует сначала по годам, потом по числу между двумя слэшами, потом по числу, находящемуся после минуса.
Если макрос так не работает, приложите, пожалуйста, файлы: до сортировки, и после сортировки.
Изменено: МатросНаЗебре - 29.07.2016 17:40:42
 
Цитата
МатросНаЗебре написал:
Макрос сортирует сначала по годам, потом по числу между двумя слэшами
получил такой результат
2-0121/7/2011
2-0201/1/2012
2-0057/1/2013
2-1590/6/2014
2-0033/7/2014
2-0170/7/2014

по коду в конце хотел так
2-0201/1/2012
2-0057/1/2013
2-1590/6/2014
2-0121/7/2011
2-0033/7/2014
2-0170/7/2014

файл приложил до и после и как надо
 
дубль 2
 
МатросНаЗебре, круче я еще никогда не видел, супер
замечательно решил
 
МатросНаЗебре, есть сложная таблица, как применить туда код, чтобы сдвигались отсортированные строки с данными
2-0000//201
такие не сортировать, т.е. их не трогать пусть стоят на месте, их слеше ничего не записано // внутри

сортировать начиная с 445 строки и все что "сдано" было выше "не сдано"
 
как-то так
 
МатросНаЗебре, всю строку с данными не перемещает вместе с сортировкой
 
вроде так
 
МатросНаЗебре, А у вас вышло? у меня на месте все стоит, не сортирует таблицу
 
у меня сортирует
 
похоже я понял, макрос сортирует только то, что "не сдано"
 
next777pro, прошу Вас сначала подумать, потом написать сообщение.Если так не получилось, ничего страшного - можно вернуться в сообщение и дополнить его, а не плодить очереди и давать работу модераторам.
 
vikttur, принято
Страницы: 1
Наверх