Option Explicit Sub AdjustColmns() Dim AL As Object, oWsh As Worksheet, r As Range, sColName As Variant, i&, calc& Set AL = CreateObject("system.collections.arraylist") 'объект ArrayList, в него будем собирать заголовки столбцов With Application .ScreenUpdating = 0: .EnableEvents = 0: calc = .Calculation: .Calculation = xlCalculationManual With ThisWorkbook 'книга, из которой запущен макрос For Each oWsh In .Sheets ' перебираем листы книги 'перебираем области диапазона непустых ячеек из первой строки листа For Each r In oWsh.UsedRange.Rows(1).SpecialCells(2, 23).Areas For Each sColName In r.Value 'перебираем значения из ячеек из области 'если значение еще не добавлено в AL, то добавляем If Not AL.contains(sColName) Then AL.Add sColName Next sColName, r, oWsh AL.Sort 'сортируем полученный список заголовков столбцов For Each oWsh In .Sheets ' перебираем листы i = 1 For Each sColName In AL 'перебираем значения из списка заголовков With oWsh.Rows(1) ' работаем с первой строкой листа 'ищем заголовок Set r = .Find(sColName, , , xlWhole, , , False, , False) If r Is Nothing Then ' если не найдено 'добавляем заголовок справа .End(xlToRight).Offset(, 1) = sColName Set r = .End(xlToRight) End If If r.Column <> i Then 'если номер столбца с искомым заголовком не равен позиции заголовка в AL 'перемещаем столбец в нужную позицию r.EntireColumn.Cut: .Columns(i).Insert Shift:=xlToRight End If i = i + 1 End With Next sColName, oWsh End With .ScreenUpdating = 1: .EnableEvents = 1: .Calculation = calc End With Set AL = Nothing: Set r = Nothing End Sub
Option Explicit Sub AdjustColmns() Dim AL As Object, oWsh As Worksheet, r As Range, sColName As Variant, i&, calc& Set AL = CreateObject("system.collections.arraylist") 'объект ArrayList, в него будем собирать заголовки столбцов With Application .ScreenUpdating = 0: .EnableEvents = 0: calc = .Calculation: .Calculation = xlCalculationManual With ThisWorkbook 'книга, из которой запущен макрос For Each oWsh In .Sheets ' перебираем листы книги 'перебираем области диапазона непустых ячеек из первой строки листа For Each r In oWsh.UsedRange.Rows(1).SpecialCells(2, 23).Areas For Each sColName In r.Value 'перебираем значения из ячеек из области 'если значение еще не добавлено в AL, то добавляем If Not AL.contains(sColName) Then AL.Add sColName Next sColName, r, oWsh AL.Sort 'сортируем полученный список заголовков столбцов For Each oWsh In .Sheets ' перебираем листы i = 1 For Each sColName In AL 'перебираем значения из списка заголовков With oWsh.Rows(1) ' работаем с первой строкой листа 'ищем заголовок Set r = .Find(sColName, , , xlWhole, , , False, , False) If r Is Nothing Then ' если не найдено 'добавляем заголовок справа .End(xlToRight).Offset(, 1) = sColName Set r = .End(xlToRight) End If If r.Column <> i Then 'если номер столбца с искомым заголовком не равен позиции заголовка в AL 'перемещаем столбец в нужную позицию r.EntireColumn.Cut: .Columns(i).Insert Shift:=xlToRight End If i = i + 1 End With Next sColName, oWsh End With .ScreenUpdating = 1: .EnableEvents = 1: .Calculation = calc End With Set AL = Nothing: Set r = Nothing End Sub
Sub Овал1_Щелчок() Dim r As Range, col As Variant With ActiveSheet.UsedRange With Intersect(.Offset(5), .Cells) For Each r In .Rows For Each col In Array("Q", "Z") With r.Columns(col) If .Value <> "" Then Macr = .Offset(, -7).Address(, , , 1) Application.Run .Value Application.Wait Now + #12:00:05 AM# End If End With Next col, r End With End With End Sub
[/vba]
[vba]
Код
Sub Овал1_Щелчок() Dim r As Range, col As Variant With ActiveSheet.UsedRange With Intersect(.Offset(5), .Cells) For Each r In .Rows For Each col In Array("Q", "Z") With r.Columns(col) If .Value <> "" Then Macr = .Offset(, -7).Address(, , , 1) Application.Run .Value Application.Wait Now + #12:00:05 AM# End If End With Next col, r End With End With End Sub
сделал вариант в Power Query, дабы освежить знания в памяти На Листе2 ПКМ по ячейке таблицы -> Обновить
[vba]
Код
let f1 = (a as table) as table=>let b=Table.ColumnNames(a){0} in Table.Sort(Table.SelectColumns(Table.Distinct(a, b), b), b), f2 = (a as text, optional b as any) as function=>let c = Splitter.SplitTextByDelimiter(a), d = Splitter.SplitTextByEachDelimiter({a}, 0, Logical.From(b)) in if b is null then c else d, f3 = (a as text) as text=>Text.Insert(a, Text.PositionOfAny(a, f4(0, 10)), "-"), f4 = (a as number, b as number) as list=>List.Transform(List.Numbers(a, b), each Text.From(_)), f5 = (a as table, b as any) as list=>let c = Table.ColumnNames(a), d = List.Count(c) in Table.ToRows(Table.FromColumns({c, List.Repeat({b}, d)})), f6=()=>each try Number.From(_) otherwise _, f7=(a as table)=>let b=Table.TransformColumns(a, f5(a, f6())), c=Table.Sort(b, f5(b, Order.Ascending)) in Table.TransformColumns(c, f5(c, Text.From)), f8 = (a as table, b as list, optional c as number) => let c = if c is null then 0 else c, d = try b{c}{2} otherwise b{c}{0}{0}, e = if b{c}{1} is list then Combiner.CombineTextByEachDelimiter else Combiner.CombineTextByDelimiter, f = Table.CombineColumns(a, b{c}{0}, e(b{c}{1}, 0), d) in if c+1 < List.Count(b) then @f8(f, b, c+1) else f, f9=(a as table, b as text, c as text)as table=>let d = Character.FromNumber(160), e = each Text.Replace(Text.Replace(Text.Trim(Text.Replace(Text.Replace(_, " ", d), c, " ")), " ", c), d, " ") in Table.TransformColumns(a, {b, e}), t0 = List.Transform({"Таблица1", "Таблица2"}, each Excel.CurrentWorkbook(){[Name=_]}[Content] as table), l1 = f4(4, List.Max(List.Transform(t5[4], each List.Count(Text.Split(_, "."))))), l2 = Table.ColumnNames(t0{0}), t1 = Table.SplitColumn(Table.TransformColumns(t0{0}, {l2{1}, f3}), l2{1}, f2("-"), f4(1, 2)), t2 = Table.AddIndexColumn(f8(f7(Table.TransformColumns(t1, f5(t1, f6()))), {{f4(1, 2), ""}}), "2", 0, 1), t3 = Table.Group(t2, {l2{0}}, {{"list", each Table.ToList(Table.SelectColumns(Table.Sort(_, {{"2", 0}}), "1")), type list}}), t4 = Table.SplitColumn(Table.SplitColumn(f1(t0{1}), l2{0}, f2("-", 0), {"1", "3"}), "1", f2("/", 0), f4(1, 2)), t5 = Table.SplitColumn(Table.TransformColumns(t4, {"3", each f3(_)}), "3", f2("-", 1), f4(3, 2)), t6 = f9(f8(f7(Table.SplitColumn(t5, "4", f2("."), l1)), {{l1, "."}, {f4(1, 4), {"/", "-"}, l2{0}}}), l2{0}, "."), t7 = Table.RenameColumns(Table.NestedJoin(t6, l2{0}, t3, l2{0}, "list", 1), {{"list", l2{1}}}), t8 = Table.ExpandListColumn(Table.TransformColumns(t7, {l2{1}, each try _[list]{0} otherwise {}}), l2{1}) in t8
[/vba]
сделал вариант в Power Query, дабы освежить знания в памяти На Листе2 ПКМ по ячейке таблицы -> Обновить
[vba]
Код
let f1 = (a as table) as table=>let b=Table.ColumnNames(a){0} in Table.Sort(Table.SelectColumns(Table.Distinct(a, b), b), b), f2 = (a as text, optional b as any) as function=>let c = Splitter.SplitTextByDelimiter(a), d = Splitter.SplitTextByEachDelimiter({a}, 0, Logical.From(b)) in if b is null then c else d, f3 = (a as text) as text=>Text.Insert(a, Text.PositionOfAny(a, f4(0, 10)), "-"), f4 = (a as number, b as number) as list=>List.Transform(List.Numbers(a, b), each Text.From(_)), f5 = (a as table, b as any) as list=>let c = Table.ColumnNames(a), d = List.Count(c) in Table.ToRows(Table.FromColumns({c, List.Repeat({b}, d)})), f6=()=>each try Number.From(_) otherwise _, f7=(a as table)=>let b=Table.TransformColumns(a, f5(a, f6())), c=Table.Sort(b, f5(b, Order.Ascending)) in Table.TransformColumns(c, f5(c, Text.From)), f8 = (a as table, b as list, optional c as number) => let c = if c is null then 0 else c, d = try b{c}{2} otherwise b{c}{0}{0}, e = if b{c}{1} is list then Combiner.CombineTextByEachDelimiter else Combiner.CombineTextByDelimiter, f = Table.CombineColumns(a, b{c}{0}, e(b{c}{1}, 0), d) in if c+1 < List.Count(b) then @f8(f, b, c+1) else f, f9=(a as table, b as text, c as text)as table=>let d = Character.FromNumber(160), e = each Text.Replace(Text.Replace(Text.Trim(Text.Replace(Text.Replace(_, " ", d), c, " ")), " ", c), d, " ") in Table.TransformColumns(a, {b, e}), t0 = List.Transform({"Таблица1", "Таблица2"}, each Excel.CurrentWorkbook(){[Name=_]}[Content] as table), l1 = f4(4, List.Max(List.Transform(t5[4], each List.Count(Text.Split(_, "."))))), l2 = Table.ColumnNames(t0{0}), t1 = Table.SplitColumn(Table.TransformColumns(t0{0}, {l2{1}, f3}), l2{1}, f2("-"), f4(1, 2)), t2 = Table.AddIndexColumn(f8(f7(Table.TransformColumns(t1, f5(t1, f6()))), {{f4(1, 2), ""}}), "2", 0, 1), t3 = Table.Group(t2, {l2{0}}, {{"list", each Table.ToList(Table.SelectColumns(Table.Sort(_, {{"2", 0}}), "1")), type list}}), t4 = Table.SplitColumn(Table.SplitColumn(f1(t0{1}), l2{0}, f2("-", 0), {"1", "3"}), "1", f2("/", 0), f4(1, 2)), t5 = Table.SplitColumn(Table.TransformColumns(t4, {"3", each f3(_)}), "3", f2("-", 1), f4(3, 2)), t6 = f9(f8(f7(Table.SplitColumn(t5, "4", f2("."), l1)), {{l1, "."}, {f4(1, 4), {"/", "-"}, l2{0}}}), l2{0}, "."), t7 = Table.RenameColumns(Table.NestedJoin(t6, l2{0}, t3, l2{0}, "list", 1), {{"list", l2{1}}}), t8 = Table.ExpandListColumn(Table.TransformColumns(t7, {l2{1}, each try _[list]{0} otherwise {}}), l2{1}) in t8
Повесил срез на таблицу Реестр (справа от таблицы), добавил UDF[vba]
Код
Public Function СрезВыбор(sName As String) As Variant Dim oSi As SlicerItem, i&, arr() As Variant On Error Resume Next Application.Volatile With ThisWorkbook.SlicerCaches(sName) For Each oSi In .SlicerItems If oSi.Selected Then ReDim Preserve arr(i) arr(i) = oSi.Value i = i + 1 End If Next End With СрезВыбор = arr() End Function
собственно, в этой формуле можно заменить ссылки на умные таблицы ссылками на диапазоны
Повесил срез на таблицу Реестр (справа от таблицы), добавил UDF[vba]
Код
Public Function СрезВыбор(sName As String) As Variant Dim oSi As SlicerItem, i&, arr() As Variant On Error Resume Next Application.Volatile With ThisWorkbook.SlicerCaches(sName) For Each oSi In .SlicerItems If oSi.Selected Then ReDim Preserve arr(i) arr(i) = oSi.Value i = i + 1 End If Next End With СрезВыбор = arr() End Function
Юрий_Нд, нужно скачать и установить по ссылке (сверу справа Free Download) надстройку Formuladesk. После ее установки идем на ленте на вкладку FormulaDesk, включаем Math wiever и выделяем нужную ячейку с формулой. Для того, чтобы в формуле отображались имена аргументов вместо адресов ячеек я слева от каждой ячейки вписал их имена. Для того, чтобы далее в формуле вместо имен появились значения, продублировал на листе формулами значения аргументов и написал макрос, который обновляет вычисленные значения в ячейках слева от них. После того, как получили нужную формулу, выбираем Копировать как уравнение(Copy as equation) из выпадающего списка на кнопке копирования (выбрав один раз, в дальнейшем можно не выбирать, просто тыкать по иконке копирования). Теперь можно скопированную формулу вставлять в Word. Сразу после вставки, ничего не выделяя, меняем размер шрифта. По желанию, если нужно динамическое обновление формул, делаем связи с соответствующими ячейками в Excel. Например, в Excel копируем ячейку B1 в уравнении в ворде, в двух местах выделяем тройку(там, где 32 и где 3+5) и вставляем специальной вставкой (Связать, неформатированный текст).
Юрий_Нд, нужно скачать и установить по ссылке (сверу справа Free Download) надстройку Formuladesk. После ее установки идем на ленте на вкладку FormulaDesk, включаем Math wiever и выделяем нужную ячейку с формулой. Для того, чтобы в формуле отображались имена аргументов вместо адресов ячеек я слева от каждой ячейки вписал их имена. Для того, чтобы далее в формуле вместо имен появились значения, продублировал на листе формулами значения аргументов и написал макрос, который обновляет вычисленные значения в ячейках слева от них. После того, как получили нужную формулу, выбираем Копировать как уравнение(Copy as equation) из выпадающего списка на кнопке копирования (выбрав один раз, в дальнейшем можно не выбирать, просто тыкать по иконке копирования). Теперь можно скопированную формулу вставлять в Word. Сразу после вставки, ничего не выделяя, меняем размер шрифта. По желанию, если нужно динамическое обновление формул, делаем связи с соответствующими ячейками в Excel. Например, в Excel копируем ячейку B1 в уравнении в ворде, в двух местах выделяем тройку(там, где 32 и где 3+5) и вставляем специальной вставкой (Связать, неформатированный текст).krosav4ig
ruslantigr, и вам здрасьте перешел по ссылке из файла, нет на этой странице ничего похожего на те данные, которые в файле. Давайте ссылку на конкретную страницу, откуда нужно грузить данные. Или вы считаете что мы тут должны искать по всему сайту?
ruslantigr, и вам здрасьте перешел по ссылке из файла, нет на этой странице ничего похожего на те данные, которые в файле. Давайте ссылку на конкретную страницу, откуда нужно грузить данные. Или вы считаете что мы тут должны искать по всему сайту?krosav4ig
только компоновать формулами уравнения в линейном формате в соответствии со спецификацией и уже потом связью или слиянием внедрять их в ворд
Или уравнения создать в ворде (например, с помощью панели математического ввода Win+r>mip>ok, подключив любой андроид девайс как устройство графического ввода) и в них помещать вычисленные значения
только компоновать формулами уравнения в линейном формате в соответствии со спецификацией и уже потом связью или слиянием внедрять их в ворд
Или уравнения создать в ворде (например, с помощью панели математического ввода Win+r>mip>ok, подключив любой андроид девайс как устройство графического ввода) и в них помещать вычисленные значенияkrosav4ig
Sub выбрать_1() Const sPath$ = "d:\Desktop\Реестр договоров.accdb" Dim sConn, oRS As Object 10 sConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath 20 On Error GoTo err 30 Set oRS = CreateObject("adodb.recordset") 40 For i = 1 To 5 50 rr = oRS.Open("select * from " & i, sConn) 60 With Sheets(i & "") 70 .UsedRange.Delete 80 With .ListObjects.Add(xlSrcQuery, oRS, , , .[A1]) 90 .Refresh: .Unlink 100 End With 110 End With 120 oRS.Close 130 Next 140 Set oRS = Nothing 150 On Error GoTo 0 160 Exit Sub err: 170 MsgBox "An error #" & err.Number & " (" & err.Description & ") has occurred in procedure выбрать_1 on line " & Erl End Sub
[/vba]
[vba]
Код
Sub выбрать_1() Const sPath$ = "d:\Desktop\Реестр договоров.accdb" Dim sConn, oRS As Object 10 sConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sPath 20 On Error GoTo err 30 Set oRS = CreateObject("adodb.recordset") 40 For i = 1 To 5 50 rr = oRS.Open("select * from " & i, sConn) 60 With Sheets(i & "") 70 .UsedRange.Delete 80 With .ListObjects.Add(xlSrcQuery, oRS, , , .[A1]) 90 .Refresh: .Unlink 100 End With 110 End With 120 oRS.Close 130 Next 140 Set oRS = Nothing 150 On Error GoTo 0 160 Exit Sub err: 170 MsgBox "An error #" & err.Number & " (" & err.Description & ") has occurred in procedure выбрать_1 on line " & Erl End Sub