Sub sortirovka() 'Раскрытие таблицы Dim b As Boolean, r As Range, col as range With [Таблица1].ListObject Set r = .Range.CurrentRegion For Each col In r.Columns If col.Column = r.Column Then .Resize col.Next.Resize(2) ElseIf Not b Then b = True .Resize r.Resize(2, 2) .Resize r.Resize(2, 1) End If With Intersect(.Parent.UsedRange, col.EntireColumn) .sort .Cells(1), xlAscending, Header:=1 End With Next .Resize r.Resize(r.Rows.Count - IsEmpty(r.Cells(2, 1))) End With End Sub
[/vba]
[vba]
Код
Sub sortirovka() 'Раскрытие таблицы Dim b As Boolean, r As Range, col as range With [Таблица1].ListObject Set r = .Range.CurrentRegion For Each col In r.Columns If col.Column = r.Column Then .Resize col.Next.Resize(2) ElseIf Not b Then b = True .Resize r.Resize(2, 2) .Resize r.Resize(2, 1) End If With Intersect(.Parent.UsedRange, col.EntireColumn) .sort .Cells(1), xlAscending, Header:=1 End With Next .Resize r.Resize(r.Rows.Count - IsEmpty(r.Cells(2, 1))) End With End Sub
Sub fffff() dim r as Range With ActiveSheet On Error Resume Next .Outline.ShowLevels 1 Set r = .Columns(1).SpecialCells(2, 23).SpecialCells(12) Set r = Union(.Rows("1:25"), r, r.Offset(1)) .Outline.ShowLevels 8: r.EntireRow.Hidden = True .UsedRange.SpecialCells(12).EntireRow.Delete: r.EntireRow.Hidden = 0 Application.Goto .[A26], 1 End With End Sub
[/vba]
[vba]
Код
Sub fffff() dim r as Range With ActiveSheet On Error Resume Next .Outline.ShowLevels 1 Set r = .Columns(1).SpecialCells(2, 23).SpecialCells(12) Set r = Union(.Rows("1:25"), r, r.Offset(1)) .Outline.ShowLevels 8: r.EntireRow.Hidden = True .UsedRange.SpecialCells(12).EntireRow.Delete: r.EntireRow.Hidden = 0 Application.Goto .[A26], 1 End With End Sub
конструкция ( ... , ... ) - это кортеж, представляющий пересечение двух размерностей куба/множеств/кортежей [Код], он же [Код].[All] - непосредственно поле Код, [Код].children - значения поля Код Кстати, такая формула тоже работает [vba]
конструкция ( ... , ... ) - это кортеж, представляющий пересечение двух размерностей куба/множеств/кортежей [Код], он же [Код].[All] - непосредственно поле Код, [Код].children - значения поля Код Кстати, такая формула тоже работает [vba]
Всем привет! Набросал я тут код для формирования сортированного списка уникальных значений для проверки данных, в планах по такому же принципу реализовать каскадные выпадающие списки, но как-то времени все нет.
[vba]
Код
'--------------------------------------------------------------------------------------- ' Module : DistinctListDataValidation ' Author : Андрей Лящук aka krosav4ig http://www.excelworld.ru/index/8-krosav4ig ' Date : 27.02.2019 ' Purpose : Генерация сортированного списка уникальных значений для проверки данных '--------------------------------------------------------------------------------------- '--------------------------------------------------------------------------------------- ' function : DistinctValues ' Purpose : Возвращает диапазон со списком уникальных значений ' Arguments : R1 - Верхняя ячейка диапазона с исходным списком ' R2 - Верхняя ячейка диапазона, в который будет помещен список уникальных значений '--------------------------------------------------------------------------------------- Function DistinctValues(R1 As Range, R2 As Range) As Range Dim sR1$, sR2$, sR3$ If IsEmpty(R1) Then Exit Function With Application .Volatile True sR1 = R1.Address(, , .ReferenceStyle, 1) sR2 = R2.Address(, , .ReferenceStyle, 1) sR3 = .Caller.Address(, , .ReferenceStyle, 1) Evaluate "DistinctListDataValidation.PopulateRange(" & sR1 & "," & sR2 & "," & sR3 & ")" .ScreenUpdating = 0 Set DistinctValues = ExtendDown(R2) DoEvents .ScreenUpdating = 1 End With End Function '--------------------------------------------------------------------------------------- ' Procedure : PopulateRange ' Purpose : Заполняет диапазон сгенерированным списком уникальных значений ' Arguments : R1 - Верхняя ячейка диапазона с исходным списком ' R2 - Верхняя ячейка диапазона, в который будет помещен список уникальных значений ' R3 - Application.Caller, в текущем контексте - активная ячейка с выпадающим списком '--------------------------------------------------------------------------------------- Private Sub PopulateRange(R1 As Range, R2 As Range, R3 As Range) Dim v As Variant With ExtendDown(R1) If .Cells.Count = 1 Then ExtendDown(R2).Value = Empty R2 = R1: Exit Sub End If End With With CreateObject("scripting.dictionary") For Each v In ExtendDown(R1).Value .Item(v) = "" Next v = BubbleSort(.keys()) If R3.Value <> "" Then v = Filter(v, R3.Value, False) End With ExtendDown(R2).Value = Empty Application.EnableEvents = 0 R2.Resize(UBound(v) + 1).Value = Application.Transpose(v) Application.EnableEvents = 1 End Sub '--------------------------------------------------------------------------------------- ' Function : BubbleSort ' Purpose : Возвращает массив, отсортированный пузырьковым алгоритмом ' Arguments : v - Исходный массив '--------------------------------------------------------------------------------------- Private Function BubbleSort(v As Variant) As Variant Dim i&, j& For i = LBound(v) To UBound(v) - 1: For j = i To UBound(v) Swap v(i), v(j) Next j, i BubbleSort = v End Function Private Sub Swap(ByRef a As Variant, ByRef b As Variant) If a > b Then: Dim c: c = a: a = b: b = c End Sub '--------------------------------------------------------------------------------------- ' Function : ExtendDown ' Purpose : Возвращает диапазон расширенный вниз до последней непустой ячейки ' Arguments : R - верхняя ячейка диапазона '--------------------------------------------------------------------------------------- Private Function ExtendDown(r As Range) As Range If IsEmpty(r.Offset(1)) Then Set ExtendDown = r Else Set ExtendDown = r.Resize(r.End(xlDown).Row - r.Row + 1) End If End Function
Проверка данных ссылается на эти имена. Тестировал в версиях Excel с 2003 по 2013, во всех работает.
UPD. Убрал лишнюю строку и массив из процедуры PopulateRange
Всем привет! Набросал я тут код для формирования сортированного списка уникальных значений для проверки данных, в планах по такому же принципу реализовать каскадные выпадающие списки, но как-то времени все нет.
[vba]
Код
'--------------------------------------------------------------------------------------- ' Module : DistinctListDataValidation ' Author : Андрей Лящук aka krosav4ig http://www.excelworld.ru/index/8-krosav4ig ' Date : 27.02.2019 ' Purpose : Генерация сортированного списка уникальных значений для проверки данных '--------------------------------------------------------------------------------------- '--------------------------------------------------------------------------------------- ' function : DistinctValues ' Purpose : Возвращает диапазон со списком уникальных значений ' Arguments : R1 - Верхняя ячейка диапазона с исходным списком ' R2 - Верхняя ячейка диапазона, в который будет помещен список уникальных значений '--------------------------------------------------------------------------------------- Function DistinctValues(R1 As Range, R2 As Range) As Range Dim sR1$, sR2$, sR3$ If IsEmpty(R1) Then Exit Function With Application .Volatile True sR1 = R1.Address(, , .ReferenceStyle, 1) sR2 = R2.Address(, , .ReferenceStyle, 1) sR3 = .Caller.Address(, , .ReferenceStyle, 1) Evaluate "DistinctListDataValidation.PopulateRange(" & sR1 & "," & sR2 & "," & sR3 & ")" .ScreenUpdating = 0 Set DistinctValues = ExtendDown(R2) DoEvents .ScreenUpdating = 1 End With End Function '--------------------------------------------------------------------------------------- ' Procedure : PopulateRange ' Purpose : Заполняет диапазон сгенерированным списком уникальных значений ' Arguments : R1 - Верхняя ячейка диапазона с исходным списком ' R2 - Верхняя ячейка диапазона, в который будет помещен список уникальных значений ' R3 - Application.Caller, в текущем контексте - активная ячейка с выпадающим списком '--------------------------------------------------------------------------------------- Private Sub PopulateRange(R1 As Range, R2 As Range, R3 As Range) Dim v As Variant With ExtendDown(R1) If .Cells.Count = 1 Then ExtendDown(R2).Value = Empty R2 = R1: Exit Sub End If End With With CreateObject("scripting.dictionary") For Each v In ExtendDown(R1).Value .Item(v) = "" Next v = BubbleSort(.keys()) If R3.Value <> "" Then v = Filter(v, R3.Value, False) End With ExtendDown(R2).Value = Empty Application.EnableEvents = 0 R2.Resize(UBound(v) + 1).Value = Application.Transpose(v) Application.EnableEvents = 1 End Sub '--------------------------------------------------------------------------------------- ' Function : BubbleSort ' Purpose : Возвращает массив, отсортированный пузырьковым алгоритмом ' Arguments : v - Исходный массив '--------------------------------------------------------------------------------------- Private Function BubbleSort(v As Variant) As Variant Dim i&, j& For i = LBound(v) To UBound(v) - 1: For j = i To UBound(v) Swap v(i), v(j) Next j, i BubbleSort = v End Function Private Sub Swap(ByRef a As Variant, ByRef b As Variant) If a > b Then: Dim c: c = a: a = b: b = c End Sub '--------------------------------------------------------------------------------------- ' Function : ExtendDown ' Purpose : Возвращает диапазон расширенный вниз до последней непустой ячейки ' Arguments : R - верхняя ячейка диапазона '--------------------------------------------------------------------------------------- Private Function ExtendDown(r As Range) As Range If IsEmpty(r.Offset(1)) Then Set ExtendDown = r Else Set ExtendDown = r.Resize(r.End(xlDown).Row - r.Row + 1) End If End Function
[moder]Андрей, спасибо за то, что ты указал автору на нарушение Правил, но это вовсе не означает, что прямо здесь можно и ответ давать Удалил я его, ты уж извиняй
ComiC, для оформления формул в постах есть кнопка
[moder]Андрей, спасибо за то, что ты указал автору на нарушение Правил, но это вовсе не означает, что прямо здесь можно и ответ давать Удалил я его, ты уж извиняйkrosav4ig
Интересно сравнить аналогичное с работой PowerQuery
Ну пока anvg молчит попробую я чего-нить путного изобразить [vba]
Код
let Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], Отбор = Table.AddColumn( Источник, "Строка", each let клиент=[Номер клиента], закрыто=[Дата закрытия], тема=[Тема обращения] in Table.First( Table.SelectRows( Источник, each [Номер клиента]=клиент and [Дата создания]>закрыто and [Тема обращения]=тема ) ) ), Повтор = Table.FromRecords( Table.TransformRows( Отбор, each Record.TransformFields( _ , let r = _ in { "Повтор", each try if ((r[Строка][Дата создания]-r[Дата закрытия]))<#duration(0,48,1,0) then "Повторное" else "Единичное" otherwise "Единичное" } ) ) ), #"Удаленные столбцы" = Table.RemoveColumns(Повтор,{"Строка"}), #"Измененный тип" = Table.TransformColumnTypes(#"Удаленные столбцы",{{"Код.обращения", Int64.Type}, {"Номер клиента", Int64.Type}, {"Дата создания", type datetime}, {"Дата закрытия", type datetime}, {"Тема обращения", type text}, {"Повтор", type text}}) in #"Измененный тип"
Интересно сравнить аналогичное с работой PowerQuery
Ну пока anvg молчит попробую я чего-нить путного изобразить [vba]
Код
let Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], Отбор = Table.AddColumn( Источник, "Строка", each let клиент=[Номер клиента], закрыто=[Дата закрытия], тема=[Тема обращения] in Table.First( Table.SelectRows( Источник, each [Номер клиента]=клиент and [Дата создания]>закрыто and [Тема обращения]=тема ) ) ), Повтор = Table.FromRecords( Table.TransformRows( Отбор, each Record.TransformFields( _ , let r = _ in { "Повтор", each try if ((r[Строка][Дата создания]-r[Дата закрытия]))<#duration(0,48,1,0) then "Повторное" else "Единичное" otherwise "Единичное" } ) ) ), #"Удаленные столбцы" = Table.RemoveColumns(Повтор,{"Строка"}), #"Измененный тип" = Table.TransformColumnTypes(#"Удаленные столбцы",{{"Код.обращения", Int64.Type}, {"Номер клиента", Int64.Type}, {"Дата создания", type datetime}, {"Дата закрытия", type datetime}, {"Тема обращения", type text}, {"Повтор", type text}}) in #"Измененный тип"
let Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], Пользовательская1 = Table.FromRecords(Table.TransformRows(Источник,each [Данные=[Данные],Результат=try Text.Combine(List.Transform(List.Select(Text.Split([Данные],","),each Text.Contains(_,"DC")),Text.Trim),", ") otherwise ""])) in Пользовательская1
[/vba]
вариант через Power Query
[vba]
Код
let Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], Пользовательская1 = Table.FromRecords(Table.TransformRows(Источник,each [Данные=[Данные],Результат=try Text.Combine(List.Transform(List.Select(Text.Split([Данные],","),each Text.Contains(_,"DC")),Text.Trim),", ") otherwise ""])) in Пользовательская1