Function Unescape$(uStr$) With CreateObject("scriptcontrol") .Language = "JScript" Unescape = .Eval("unescape(""" & uStr & """)") End With End Function
[/vba] и, на всякий случай, с помощью того же scriptcontrol можно парсить json, например вот UPD. Исправил косяк в коде
а у мну вот такая функция есть [vba]
Код
Function Unescape$(uStr$) With CreateObject("scriptcontrol") .Language = "JScript" Unescape = .Eval("unescape(""" & uStr & """)") End With End Function
[/vba] и, на всякий случай, с помощью того же scriptcontrol можно парсить json, например вот UPD. Исправил косяк в кодеkrosav4ig
Совсем без макроса не получилось, ибо если делать формулами, то нужно постоянно следить за количеством строк в таблицах и протягивать формулы, что никак не вяжется с
все ненулевые (ошибки тоже распознаются как 0) строки из таблиц с листа Лист1 собираются подключением (Данные>подключения) в таблицу на листе Лист2 Таблица обновляется так же, как и сводная (ПКМ>Обновить) сделал макрос для обновления параметров подключения и автообновления таблицы в модуле Лист2[vba]
Код
Public WithEvents QTbl As QueryTable Private Sub QTbl_BeforeRefresh(Cancel As Boolean) Dim arr() As Variant, i&, strSQL$, LO As ListObject For Each LO In Sheets("Лист1").ListObjects i = i + 1 ReDim Preserve arr(i) arr(i) = LO.Range.Address(0, 0, 1, 1) Next With Application arr = .Substitute(.ReplaceB(arr, 1, Len(ThisWorkbook.Name) + 2, ""), "!", "$") End With strSQL = "select * from (" & Mid(Join(arr, "] union all select * from ["), 13) & "]) where Сумма" QTbl.Connection = "ODBC;DSN=Excel Files;DriverId=1046;DBQ=" & Parent.FullName QTbl.CommandText = strSQL End Sub Private Sub Worksheet_Activate() Init QTbl.Refresh End Sub
[/vba]в модуле ЭтаКнига [vba]
Код
Private Sub Workbook_Open() Call Init End Sub
[/vba]в стандартном модуле[vba]
Код
Public tbl As QueryTable Sub Init() If tbl Is Nothing Then Set Лист2.QTbl = Лист2.ListObjects(1).QueryTable Set tbl = Лист2.QTbl End Sub
[/vba]
Совсем без макроса не получилось, ибо если делать формулами, то нужно постоянно следить за количеством строк в таблицах и протягивать формулы, что никак не вяжется с
все ненулевые (ошибки тоже распознаются как 0) строки из таблиц с листа Лист1 собираются подключением (Данные>подключения) в таблицу на листе Лист2 Таблица обновляется так же, как и сводная (ПКМ>Обновить) сделал макрос для обновления параметров подключения и автообновления таблицы в модуле Лист2[vba]
Код
Public WithEvents QTbl As QueryTable Private Sub QTbl_BeforeRefresh(Cancel As Boolean) Dim arr() As Variant, i&, strSQL$, LO As ListObject For Each LO In Sheets("Лист1").ListObjects i = i + 1 ReDim Preserve arr(i) arr(i) = LO.Range.Address(0, 0, 1, 1) Next With Application arr = .Substitute(.ReplaceB(arr, 1, Len(ThisWorkbook.Name) + 2, ""), "!", "$") End With strSQL = "select * from (" & Mid(Join(arr, "] union all select * from ["), 13) & "]) where Сумма" QTbl.Connection = "ODBC;DSN=Excel Files;DriverId=1046;DBQ=" & Parent.FullName QTbl.CommandText = strSQL End Sub Private Sub Worksheet_Activate() Init QTbl.Refresh End Sub
[/vba]в модуле ЭтаКнига [vba]
Код
Private Sub Workbook_Open() Call Init End Sub
[/vba]в стандартном модуле[vba]
Код
Public tbl As QueryTable Sub Init() If tbl Is Nothing Then Set Лист2.QTbl = Лист2.ListObjects(1).QueryTable Set tbl = Лист2.QTbl End Sub
Sub ChangeProps() Dim note$: note = "АБВГ" Dim FIO$: FIO = "Иванов" With CreateObject("DSOFile.OleDocumentProperties") .Open "D:\Шаблон.dwt", , 2 With .CustomProperties On Error Resume Next .Add "ФИО", FIO .Add "Обозначение", note Err.Clear: On Error GoTo 0 .Item("ФИО") = FIO .Item("Обозначение") = note End With .Save: .Close End With End Sub
[/vba] для работы нужно скачать и установить DSOfile
Здравствуйте Как-то так можно [vba]
Код
Sub ChangeProps() Dim note$: note = "АБВГ" Dim FIO$: FIO = "Иванов" With CreateObject("DSOFile.OleDocumentProperties") .Open "D:\Шаблон.dwt", , 2 With .CustomProperties On Error Resume Next .Add "ФИО", FIO .Add "Обозначение", note Err.Clear: On Error GoTo 0 .Item("ФИО") = FIO .Item("Обозначение") = note End With .Save: .Close End With End Sub
Sub test() Dim shtX As Worksheet Dim rngNew As Range Dim rngOld As Range
Set shtX = ThisWorkbook.Worksheets(1) Set rngNew = shtX.Range("vNew") Set rngOld = shtX.Range("vOld")
If UBound(Filter(Application.CountIf(rngNew, rngOld.Value), 0)) = -1 Then MsgBox "значения совпадают" 'если все значения массива совпадают Else MsgBox "значения различаются" 'если хотя бы одно не совпадает End If
End Sub
[/vba]
еще вариант
[vba]
Код
Sub test() Dim shtX As Worksheet Dim rngNew As Range Dim rngOld As Range
Set shtX = ThisWorkbook.Worksheets(1) Set rngNew = shtX.Range("vNew") Set rngOld = shtX.Range("vOld")
If UBound(Filter(Application.CountIf(rngNew, rngOld.Value), 0)) = -1 Then MsgBox "значения совпадают" 'если все значения массива совпадают Else MsgBox "значения различаются" 'если хотя бы одно не совпадает End If
kollega, имхо, в у вас файле не совсем правильный подсчет количества вариантов. формулы вычисления количества и генерации комбинаций были спёрты отсюда
kollega, имхо, в у вас файле не совсем правильный подсчет количества вариантов. формулы вычисления количества и генерации комбинаций были спёрты отсюдаkrosav4ig
Это я немного ступил, не из той оперы. Нету Nil в vba, там должен быть "" или vbnullstring или empty. А нужно это для того, чтобы перед единицей тоже вставился разделитель [vba]
Код
"," & s
[/vba], а [vba]
Код
mid(join( ... , ...),2)
[/vba] нужно чтобы убрать лишнюю запятую в начале И есть еще один нюанс. Если при объявлении строковой переменной задана длина, то компилятор по дефолту присваивает этой переменной значение [vba]
Код
String(n," ")
[/vba],т.е. строка, состоящая из n пробелов, где n = объявленная длина. Поэтому вместо [vba]
Это я немного ступил, не из той оперы. Нету Nil в vba, там должен быть "" или vbnullstring или empty. А нужно это для того, чтобы перед единицей тоже вставился разделитель [vba]
Код
"," & s
[/vba], а [vba]
Код
mid(join( ... , ...),2)
[/vba] нужно чтобы убрать лишнюю запятую в начале И есть еще один нюанс. Если при объявлении строковой переменной задана длина, то компилятор по дефолту присваивает этой переменной значение [vba]
Код
String(n," ")
[/vba],т.е. строка, состоящая из n пробелов, где n = объявленная длина. Поэтому вместо [vba]
Select Case Left(s, 1) Case "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] или вот так [vba]
Код
f = Left(s, 1) Select Case True Case f = "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case f = "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] а если при объявлении переменной задать длину, то можно и не использовать Left() [vba]
Код
Sub sort() Dim CusOrd As String Dim f As String * 1 Dim LC As Integer Set twb = ActiveSheet 'ActiveWorkbook.Worksheets(1) With twb LC = .Cells(Rows.Count, 1).End(xlUp).Row f = .Range("c1").Value Select Case f Case "M", "М" CusOrd = Mid(Join(Array(Nil, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & f), 2) Case Else Exit Sub End Select .sort.SortFields.Clear .sort.SortFields.Add Key:=Range("C1:C" & LC), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CusOrd, DataOption:=xlSortNormal With .sort .SetRange Range("A1:D" & LC) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With End Sub
[/vba]
Здравствуйте, у вас ошибка в блоке [vba]
Код
Select Case ... End Select
[/vba] вот так будет правильно [vba]
Код
Select Case Left(s, 1) Case "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] или вот так [vba]
Код
f = Left(s, 1) Select Case True Case f = "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case f = "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] а если при объявлении переменной задать длину, то можно и не использовать Left() [vba]
Код
Sub sort() Dim CusOrd As String Dim f As String * 1 Dim LC As Integer Set twb = ActiveSheet 'ActiveWorkbook.Worksheets(1) With twb LC = .Cells(Rows.Count, 1).End(xlUp).Row f = .Range("c1").Value Select Case f Case "M", "М" CusOrd = Mid(Join(Array(Nil, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & f), 2) Case Else Exit Sub End Select .sort.SortFields.Clear .sort.SortFields.Add Key:=Range("C1:C" & LC), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CusOrd, DataOption:=xlSortNormal With .sort .SetRange Range("A1:D" & LC) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With End Sub