Страницы: 1
RSS
Сведение в ячейку - слов, начинающихся с буквы "А" и заканчивающихся символами "+" или ","
 
Здравствуйте, дорогие друзья.
У меня возник вопрос...

В ячейку C7 вписан абстрактный текст, примерно вот такого содержания:
et344h h34f8734n 8778  A1текст+А4слово, f347fg3478fb83 fb64f 63f 3fb634gf346 fbf34bf6 634fb34bf А2слово, 783bf b4f4fb43f bf34 b3fb347fb A8образец, 3fb3 fb3 f3847fb b3

Как вы можете заметить - в тексте встречается текст с таким отличительным признаком - сперва идет буква "А", потом какое-то число, а потом некое слово.
А по правую сторону каждого подобного слова - стоит либо "+", либо запятая ","

Так вот вопрос - как формулой или макросом сложить числа из однотипного текста и вписать полученный результат - в ячейку C10 ?

Примерно в ячейке C10 должен получится вот такой результат - "A1текст+А6слово+A8образец"
 
Учтите, что символ "A" должен быть на латинице
Скрытый текст
 
Цитата
OlegSmirnov написал:
сперва идет буква "А", потом какое-то число
Какой диапазон чисел возле 'А', или только от 0 до 9, или больше, например: 112, 548, 965 985 985 985 ... ?
 
Код
Function SumA$(s$)
  Dim re, ms, dc, i&, ks
  Set re = CreateObject("VBScript.RegExp"): re.Global = True: re.Pattern = "A(\d+)([^+,]+)"
  Set ms = re.Execute(s):  Set dc = CreateObject("Scripting.Dictionary")
  For i = 0 To ms.Count - 1
    dc(ms(i).submatches(1)) = Val(dc(ms(i).submatches(1))) + Val(ms(i).submatches(0))
  Next
  ks = dc.keys
  For i = 0 To UBound(ks)
    SumA = SumA & "+" & "A" & dc(ks(i)) & ks(i)
  Next
  SumA = Right(SumA, Len(SumA) - 1)
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
ocet p написал:
Какой диапазон чисел возле 'А',
Ну в общем-то число - это всегда целое, не дробное.
Может быть однозначное - например 9, а может быть двузначное - например 12.
 
magistor8, нет, такой подход в корне неверен.

Вы указываете такие слова как "текст","слово","образец" - но они неизвестны.
Вместо этих слов могут быть любые другие слова.

Отличительный признак здесь - это буква "А" и какое-то однозначное или двузначное число после него. А завершающий ограничитель - это знак "+" или знак ","
 
Ігор Гончаренко, проверил ваш макрос. Он выдает результат "A1текст+A8образец". Хотя по идее вроде там же еще одно слово должно быть : "A1текст+А6слово+A8образец"
 
OlegSmirnov, сложить это значит сцепить? И откуда взялось "А6слово"? Ну и до кучи - сцепляем/складываем все слова начинающиеся с "А"?
Изменено: Anchoret - 15.02.2019 18:24:35
 
Anchoret, там в тексте - два однотипных слова "А4слово"  и "А2слово".
Если их сложить - то будет "А6слово"
 
Цитата
OlegSmirnov написал:
а может быть двузначное - например 12
Какое наибольшее число после "А" ?
Может быть 111222333 (A111222333) ?
 
ocet p, ну наверное А99 для двузначного числа.

Anchoret, да все слова, начинающиеся - с буквы А и числа после этой буквы - нужно сцепить.
 
Цитата
OlegSmirnov написал:
Ігор Гончаренко , проверил ваш макрос.Он выдает результат "A1текст+A8образец"
замените кириллическую А на латинскую A - увидите разницу
в моем макросе по-барабану сколько цифр написано после А, но А должна быть латинской
хотя... добавить в pattern пару символовв и будет и макросу будет по-барабану, какое там А
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
С заменой русской "А" на латинскую в начале:
Код
Sub aaa()
Dim Dc As Object, a&, dt$, t1$, t2$, arr()
a = 1: dt = [C7]: dt = Replace(dt, "А", "A")
Set Dc = CreateObject("Scripting.Dictionary")
Do While InStr(a, dt, "A")
  a = InStr(a, dt, "A"): a = a + 1: t1 = vbNullString: t2 = t1
  Do While Mid$(dt, a, 1) Like "#": t1 = t1 & Mid$(dt, a, 1): a = a + 1: Loop
  Do While Mid$(dt, a, 1) <> "," And Mid$(dt, a, 1) <> "+"
    t2 = t2 & Mid$(dt, a, 1): a = a + 1
  Loop
  If Len(t1) > 0 And Len(t2) > 0 Then
    If Not Dc.exists(t2) Then Dc.Add t2, CDbl(t1) Else Dc.Item(t2) = Dc.Item(t2) + CDbl(t1)
  End If
  If a > Len(dt) Then Exit Do
Loop
If Dc.Count > 0 Then
  arr = Dc.keys: t1 = vbNullString
  For a = 0 To UBound(arr)
    t1 = t1 & "A" & Dc.Item(arr(a)) & arr(a) & "+"
  Next
  t1 = Left$(t1, Len(t1) - 1)
End If
[C10] = t1
End Sub
 
Ігор Гончаренко, да.
Вот когда заменил на латиницу букву А - то все стало считаться.

А как сделать этот макрос - реагирующим на кирилицу.
Потому что - текст всей этой строки - вводится единым кирилическим текстом.
 
для разных А
Код
Function SumA$(s$)
  Dim re, ms, dc, i&, ks
  Set re = CreateObject("VBScript.RegExp"): re.Global = True: re.Pattern = "(A|А)(\d+)([^+,]+)"
  Set ms = re.Execute(s):  Set dc = CreateObject("Scripting.Dictionary")
  For i = 0 To ms.Count - 1
    dc(ms(i).submatches(2)) = Val(dc(ms(i).submatches(2))) + Val(ms(i).submatches(1))
  Next
  ks = dc.keys
  For i = 0 To UBound(ks)
    SumA = SumA & "+" & "A" & dc(ks(i)) & ks(i)
  Next
  SumA = Right(SumA, Len(SumA) - 1)
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Anchoret, Ігор Гончаренко, спасибо.
Оба макроса работают.
Страницы: 1
Наверх