А синтаксис описания массивов в VBA, к сожалению, иной и фигурные скобки не воспринимаются.
Требуется: присвоить содержимое вышеуказанной строки переменной, являющей двумерным массивом для последующей обработки строк и столбцов. К примеру - суммированию в цикле зарплат сотрудников, чей возраст менее 40 лет.
Проблема: описание массивов в VBA не воспринимает фигурные скобки. Можно было бы через RegExp привести строку к виду
и применить (бы) evaluate, но Evaluate в VBA обрабатывает только арифметические выражения...
Я пытался воспользоваться другим редактором:
Код
Dim d As New MSScriptControl.ScriptControl
d.Language = "VBScript"...
но он так же отличается от VB и не воспринимает синтаксис массива с применением фигурных скобок.
Уважаемые коллеги, подскажите, какие есть идеи или варианты на Ваш взгляд, кроме простого перебора строки и заполнения в цикле двумерного массива для приведения его к виду
Цитата
Василий Инженер 55000 35 Михаил Юрист 65000 42 Светлана Офис-менеджер 35000 27
Скорость работы решения важна, поскольку файл - большого размера.
Я думаю незачем собирать двумерный массив - перебираем в цикле строки, каждую сплитим в одномерный массив, затем в цикле его в другой массив, сразу проверяем критерий - если запись нужна, то тут же её и обрабатываем.
Код
Sub tt()
Dim s$, arr1, arr2, el
s = "{{""Василий"",""Инженер"",55000,35},{""Михаил"",""Юрист"",65000,42},{""Светлана"",""офис-менеджер"",35000,27}}"
s = Replace(s, "},{", "|")
s = Replace(s, "{", "")
arr1 = Split(s, "|")
For Each el In arr1
arr2 = Split(el, ",")
If arr2(3) < 40 Then MsgBox arr2(0)
Next
End Sub
Function JArray(S, Age_, Summ) As Double
bRes = False
Set RegExp = CreateObject("VBScript.RegExp")
RegExp.Global = True
RegExp.Pattern = "\{""(.+?)"",""(.+?)"",(.+?),(\d+)\}"
bRes = RegExp.test(S)
If bRes Then
Set oMatches = RegExp.Execute(S)
For n = 0 To oMatches.Count - 1
Age = Val(oMatches(n).SubMatches(3))
If Age_ > Age Then Summ = Summ + CDbl(oMatches(n).SubMatches(2))
Next
End If
JArray = Summ
End Function
Ну в моём варианте я думаю как приладить суммирование понятно. И кстати если нужны только суммы - то убивать "{" лишнее, т.е. строка s = Replace(s, "{", "") не нужна.
Sub tt()
Dim s$, arr1, arr2, el
s = "{{""Василий"",""Инженер"",55000,35},{""Михаил"",""Юрист"",65000,42},{""Светлана"",""офис-менеджер"",35000,27}}"
s = Mid$(s, 3, Len(s) - 4)
arr1 = Split(s, "},{")
For Each el In arr1
arr2 = Split(el, ",")
If arr2(3) < 40 Then MsgBox arr2(0)
Next
End Sub
Alex.Karev написал: но Evaluate в VBA обрабатывает только арифметические выражения
Доказательство ложности утверждения:
Код
Sub Test1()
Dim S As String, Arr
S = [B4]
Arr = Evaluate(Replace(Mid(S, 2, Len(S) - 2), "},{", ";"))
[B6].Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr
End Sub