Здравствуйте! Прошу помощи ибо ни времени, ни сил на освоение всех бездонных возможностей exel нет. Есть таблица (экспортированная база данных), в столбце (строк от 2-2296) G текст, в тексте встречаются вот такое [attach]645[/attach] - дескрипторы вложенных файлов их id цифры разной длины, может так, а может и так [attach]1346,1347,1348,1349,1350,1351,1352,1353,1354[/attach] Задача найти и прибавить ко всем цифрам определенную цифру. то есть совершить арифметическое действие - сложение, ничего не меняя больше. Реальная ли это задача? Спасибо, если что посоветуете..
Doc77 написал: Задача найти и прибавить ко всем цифрам определенную цифру. то есть совершить арифметическое действие - сложение, ничего не меняя больше. Реальная ли это задача?
нет, задача не реальна, к цифрам арифметически цифры не прибавляются. Арифметика работает с числами. Она становится более не реальной после этого
Цитата
Doc77 написал: Текст в кодировке UTF-8, ексель не понимает его, но это не важно
Ну пошутили и ладно ,что конкретно должно получится было [attach]645[/attach], что к чему прибавляем и что получаем?
ко всем числам столбца, к каждой отдельно, обрамленным [attach]3,5,6[/attach] прибавляем, например, 10 и получим [attach]13,15,16[/attach], если [attach]645[/attach] то получим [attach]655[/attach]
цифры не могут быть разной длины, цифра одна. Числа могут. Разделитель чисел - какой знак? В формате UTF-16 сможете достать/выгрузить/конвертнуть первичные данные? Проще будет работать.
Да, конечно, числа. У вас тут с числами "на вы". Разделители запятые если несколько чисел и понятно ничего, если одна. Сейчас посмотрю по кодировке. Выгрузка из mysql базы автоматическая. Если можно то сделаю.
Function Increm(ByVal source As String, Delta As Long)
Dim i As Integer, j As Integer
Dim a() As String
Dim b() As String
Dim c() As String
a = Split(source, "[attach]")
If UBound(a) > 0 Then
For i = 1 To UBound(a)
b = Split(a(i), "[/attach]")
If UBound(b) > 0 Then
c = Split(b(0), ",")
For j = 0 To UBound(c)
c(j) = CLng(c(j)) + Delta
Next
b(0) = Join(c, ",")
End If
a(i) = Join(b, "[/attach]")
Next
End If
Increm = Join(a, "[attach]")
End Function
Function qwq(s$, d$)
Dim ss$, i&, spl
ss = Mid(s, InStr(s, "[attach]") + 8, InStr(s, "[/attach]") - InStr(s, "[attach]") - 8)
spl = Split(ss, ",")
For i = LBound(spl) To UBound(spl)
spl(i) = CLng(spl(i)) + d
Next
qwq = Replace(s, ss, Join(spl, ","))
End Function
RAN, Андрей, а если несколько групп? Я собственно от instr отказался именно по этому. но вот нашел ошибку и у себя и у Вас. Поменяйте местами теги открытия и закрытия или удалите один из них. Хотя наверно реальные данные будут без таких изысков. А вот это не понял и ошибка For i = LBound(spl) To LBound(spl)
Да я его писал :-). Оба варианта это функция, их можно использовать на листе. Чтоб изменить существующие значения, нужно писать небольшое обрамление или в соседнем столбце получить значения и копи-пэст поверх. RAN, а первый то зачем вычислять. Он же независимо от бэйз будет 0?
Doc77 написал: Там фрагмент 5 строк. Текст в кодировке UTF-8, ексель не понимает его, но это не важно.
Здорово. Но в тексте из примера нет чисел. Там про лептоспироз у щенков алабая...
Если ориентироваться на строку вида "[attach]1346,1347,1348,1349,1350,1351,1352,1353,1354[/attach]" или любой другой текст вперемешку с целыми числами, не привязываясь к тегу attach, то вот так:
Код
Function IncrNumbers(ByVal txt As String, iDelta As Long) As String
Set myRegExp = CreateObject("VBScript.RegExp")
With myRegExp
.Pattern = "\d+"
.Global = True
.MultiLine = True
End With
Set mc = myRegExp.Execute(txt)
For Each n In mc
txt = Mid(txt, 1, n.FirstIndex) & (CLng(n.Value) + iDelta) & Mid(txt, n.FirstIndex + n.Length + 1, Len(txt))
Next n
IncrNumbers = txt
End Function
не нашел файл-примера (как надо): рабочий вариант функции vvv или иллюстративная функция bbb
Код
Function bbb$(t$,delta)
With CreateObject("VBScript.RegExp"): .Pattern = "\d+": .Global = True
bbb = .Replace(t, "$&+" & delta)
End With
End Function
Function vvv$(t$)
With CreateObject("scriptcontrol"): .Language = "JScript"
vvv = .eval("'" & t & "'.replace(/\d+/g,function(t1) { return Number(t1)+10;})")
End With
End Function
Function vvv$(t$)
With CreateObject("scriptcontrol"): .Language = "JScript"
vvv = .eval("'" & t & "'.replace(/\d+/g,function(t1) { return Number(t1)+10;})")
End With
End Function