Страницы: 1
RSS
Разложить многострочный текст в ячейке по строкам c условием, Как разложить многострочнвй текст в ячейке с условием?
 
Здравствуйте!
Прошу помощи с макросом. В общем имеется таблица данных (ооочень большая) по объектам недвижимости, необходимо
пройти по всем ячейкам и вытащить из каждой номер ID объекта с ошибкой. Пример прикрепляю.
Заранее благодарю!

Пример2 прикреплен
Изменено: Nexus - 25.12.2013 07:48:00 (пример2)
 
В чем конкретно нужна помощь? Что сделано самостоятельно и что не получается?
Я сам - дурнее всякого примера! ...
 
Ну учитывая то что я в макросах ничего не шарю, то помощь нужна комплексная))
Пока умею прогнать цикл по всем ячейкам. Не могу понять как реализовать цикл в самой ячейке.
надо 1. сохранить в переменную номер 1-го ID (найти ID по маске), далее по строке скопировать все ошибки данного ID в столбец
2. перейти на следующую строку ячейки. Вот как-то так  :)  
Может подскажете какие функции мне помогут? и как они работают?
Изменено: Nexus - 24.12.2013 08:59:22
 
Все понятно, надо сделать все с нуля за Вас.
Учитывая, что в данных у Вас полный бардак, в одной ячейке по нескольку ID, разделители разные(запятая, точка с запятой), может есть смысл сделать заказ здесь:
http://www.planetaexcel.ru/forum/?PAGE_NAME=list&FID=7
?
Я сам - дурнее всякого примера! ...
 
пардоньте, разделитель там везде один это " ; ", просто я для примера поставил, не подумавши...
 
Тем не менее. ИМХО в рамки помощи задача не укладывается. Это заказ, ТЗ. Но Вы можете ждать, может кому-то будет ну очень скучно.. :)
Я сам - дурнее всякого примера! ...
 
Тогда может подскажете какими функциями оперировать?
 
split, right, mid, len, trim, instr, ubound и т.д.
Я сам - дурнее всякого примера! ...
 
спасибо!!
 
еще вопросик, как организовать цикл в самой ячейке?
необходимо построчная проверка
 
Например

Код
Sub tt()
    Dim s$, arr
    s = Selection.Value
    arr = Split(s, vbLf)
End Sub
 
Получаете массив строк ячейки.
Далее цикл по массиву, сплитом можно выбрать номер и примечание.
Изменено: Hugo - 24.12.2013 13:57:42
 
Счс буду пробовать!
Спасибо!
 
Подскажите плиз, как с помощью InStr найти номер вхождения по маске "(#########)" или "(?????????)" - в данном случае не принципиально.
 
Ищите номер вхождения "(", а далее проверяйте следующие символы по Like
 
Цитата
кому-то будет ну очень скучно..
каюсь - было скучно. о-о-очень  :)

как вариант - с регулярками:
Код
Sub t()
  Set r1 = CreateObject("vbscript.regexp")
  Set r2 = CreateObject("vbscript.regexp")
  
  r1.Pattern = "\((\d*)\)"
  r2.Pattern = "[);]\s*([^;]*)": r2.Global = True
  For Each c In Sheets(1).[b2:b4]
    x = Split(c.Text, vbLf)
    For Each s In x
      Set m1 = r1.Execute(s)
      If m1.Count Then
        ss = m1(0).submatches(0)
        Set m2 = r2.Execute(s)
        For i = 0 To m2.Count - 1
          j = j + 1
          Sheets(2).Cells(j, 1) = ss
          Sheets(2).Cells(j, 2) = m2(i).submatches(0)
        Next
      End If
    Next
  Next
End Sub


разделители ошибок в исх.данных, конечно, подразумеваются одинаковые - точка с запятой.
Изменено: ikki - 24.12.2013 22:49:04
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
split, right, mid, len, trim, instr, ubound и т.д.
хватит пары из указанных  :)
Код
Sub tt()
  For Each c In Sheets(1).[b2:b4]
    For Each s1 In Split(c.Text, vbLf)
      ss = Split(Split(s1, ")")(0), "(")(1)
      For Each s2 In Split(Split(s1, ")")(1), ";")
        j = j + 1
        Sheets(2).Cells(j, 1) = ss
        Sheets(2).Cells(j, 2) = Trim(s2)
      Next
    Next
  Next
End Sub
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
всем всем большое спасибо, особенно ikki!
ikki, ваш код просто шедевр, работает)
но есть небольшое "но", скобки в ячейках редко (это не критично, просто хотелось бы совершенный код), но появляются до ID, тогда по какому признаку делить?
в целом же задача решена!
еще раз спасибо!
 
Цитата
скобки в ячейках редко (это не критично, просто хотелось бы совершенный код), но появляются до ID
мне отсюда не видно - как именно они у вас появляются  :)
а варианты могут быть
возможно, по длине или по содержимому того, что находится в скобках
или брать последние скобки (с цифрами)

не вижу, честное слово.  :oops:
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
ikki, а сейчас видите?))
как поделить по маске?
 
код из поста #15 ваши "лишние" скобки из нового примера обрабатывает.
почти чисто.

единственное исключение - данные из ячейки B6
имхо - их можно подпилить напильником вручную после макроса.
 
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
впрочем, можно и шаблон подкорректировать (заодно очередное "новшевство" в ячейке B7 учтено - двоеточие после id в скобках)

вот этот кусочек:
Код
r2.Pattern = "(?:\(\d*\):*|;)\s*([^;]*)": r2.Global = True


ps обратите внимание на выделенное красным - если ваши "новшества" будут бесконечны, то автоматизировать в принципе нечего.
Изменено: ikki - 25.12.2013 11:37:41
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
имхо - их можно подпилить напильником вручную после макроса
да, да я рашпилем после макроса и прошелся.  :)

а так вы совершенно правы, автоматизировать нечего
задачку вы раскусили как орешек.
еще раз спасибо!
тему в принципе можно закрывать
Страницы: 1
Читают тему
Наверх