Страницы: 1
RSS
Группировка по месяцам, Сгруппировать даты в столбце по месяцам
 
Здравствуйте Уважаемые форумчани и гуру VBA  :)  
Поздравляю вас с переездом на новый движок и с Наступающим Новым 2013 годом!!! Ура  :!:  
Подскажите пожалуйста как можно сгруппировать даты в столбце B по месяцам, не добавляя при этом лишней информации в таблицу.
Изменено: Сеня - 24.12.2012 10:20:16
 
На листе "Результат" уже всё сделано...
Или я задание не понял? o_O
Автоматически должно группироваться? После ввода данных?
Современные языки программирования обязаны иметь встроенный метод ChuckNorris(),
который возвращает нужные тебе данные из любого объекта, даже если их там нет...
 
Лист "Результат" - показывает как должен выглядеть лист "Данные" после выполнения команды или макроса.
 
Код
Sub groupData()
    Dim iL As Long, lE As Long, i As Long
    Application.ScreenUpdating = False
    Cells.ClearOutline
    iL = [b65536].End(xlUp).Row: lE = iL: i = iL
    Do
        If Month(Cells(iL - 1, 1)) <> Month(Cells(iL, 1)) Then
            Range(Cells(lE, 2), Cells(IIf(i = iL, i, iL + 1), 2)).EntireRow.Group
            lE = iL - 1
        End If
        iL = iL - 1
        If (iL - 1) < 3 Then
            Range(Cells(lE, 2), Cells(iL, 2)).EntireRow.Group
            Exit Do
        End If
    Loop
    ActiveSheet.Outline.SummaryRow = xlAbove
    Application.ScreenUpdating = True
End Sub
Изменено: KuklP - 24.12.2012 11:02:38
Я сам - дурнее всякого примера! ...
 
Работает. но группирует август за 11 вместе с августом за 12
 
Код
Sub groupData()
    Dim iL As Long, lE As Long, i As Long
    Application.ScreenUpdating = False
    Cells.ClearOutline
    iL = [b65536].End(xlUp).Row: lE = iL: i = iL
    Do
        If Month(Cells(iL - 1, 2)) <> Month(Cells(iL, 2)) _
           Or Year(Cells(iL - 1, 2)) <> Year(Cells(iL, 2)) Then
            Range(Cells(lE, 2), Cells(IIf(i = iL, i, iL + 1), 2)).EntireRow.Group
            lE = iL - 1
        End If
        iL = iL - 1
        If (iL - 1) < 3 Then
            Range(Cells(lE, 2), Cells(iL, 2)).EntireRow.Group
            Exit Do
        End If
    Loop
    ActiveSheet.Outline.SummaryRow = xlAbove
    Application.ScreenUpdating = True
End Sub
Я сам - дурнее всякого примера! ...
 
Как-то так.
Код
Sub GroupByMonth()

    Dim connString As String, sql As String
    Dim rs As Object
    
    connString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                 "Data Source=" & ThisWorkbook.FullName & ";" & _
                 "Extended Properties=""Excel 8.0;HDR=Yes;"""
    
    sql = "SEL ECT [Дата операции], [Дата проводки] " & _
          "FR OM [Данные$A2:B15] " & _
          "GROUP BY MONTH([Дата проводки]), [Дата проводки], [Дата операции];"
    
    Set rs = CreateObject("ADODB.Recordset")
    rs.CursorLocation = 3
    rs.Open sql, connString, 0, 1, 1

    With Лист3
        .Cells(1, 1).CurrentRegion.Offset(1).Clear
        .Cells(2, 1).CopyFromRecordset rs
        .Activate
    End With
    
    rs.Close
    Set rs = Nothing

End Sub
Изменено: Johny - 24.12.2012 11:52:49
There is no knowledge that is not power
 
Вставляю "SELECT", а форум показывает "SEL ECT". Откуда пробел?  :(
Изменено: Johny - 24.12.2012 11:54:28
There is no knowledge that is not power
 
Johny, насколько я понял, тут речь о другой группировке :D
Я сам - дурнее всякого примера! ...
 
KuklP, Тогда это не группировка, а сортировка. :)
There is no knowledge that is not power
 
Да нет же, группировка строк.  В 2003 Меню - Данные - Группа и структура.
Я сам - дурнее всякого примера! ...
 
Johny не смог разобраться в вашем коде. у меня в 2007 он только копирует даты в лист "Результат Excel 2003" без всякой группировки.

KuklP Ваш код работает, но есть еще один нюансик. Как пропустить или исключить группировку, если дата в месяце только одна. Потому что код в этом случае группирует эту дату с предыдущем и следующем месяцем.
Страницы: 1
Наверх