Страницы: Пред. 1 2
RSS
Разбить текст в ячейке по строкам через произвольный разделитель
 
Цитата
Jack Famous написал: но не получается добавить "If a>1" - возникает путаница с блоками "With…End With" и "Next"
If a>1 Then
    (что делать)
End if
(помню, бывает, путаница, когда отсутствует End If в нужных местах - xl пишет, что не понимает With и Next)... это у него путаница с пониманием ошибок конструкций If, With, For next - проверить на правильность надо все...
а вы вместо того, чтобы выложить ту свою ошибку, ЧТОБЫ разобраться с ней - снова попросили решение(доработку) за вас  :( в #28... лучше задавайте конкретные! вопросы о том, что не получается у вас... а не о том, что надо ... - наУчитесь кодировать сами  ;)
Изменено: JeyCi - 06.08.2016 07:38:55
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Jungl спасибо большое за участие и отклик. :idea:  При замене соответствующего блока возникает ошибка. Закрашивал вручную для визуализации - не задача макроса.
JeyCi до функции InStr(In String) как проверки на наличие разделителя (только что узнал из справочника) я бы своим умом на данном уровне точно не допёр бы (а всё ж посложнее получилось, чем просто If a>1 проверить). Напротив, введение места кода nx, (куда переносит, когда во всех ячейках строки отсутствуют разделители) выглядит очень просто  :oops:
Цитата
JeyCi написал:
ЦитатаJack Famous написал: не содержащие разделителя… (в данном случае в полях "РД" и "НД")в данном случае - это была скорее шапка! (которая у вас тоже была в Selection)
шапку я не выделял…
Цитата
JeyCi написал:
Delim = InputBox("Введите символ-разделитель")     'код символа!!
как по мне, учить коды символов или смотреть их функцией КОДСИМВОЛ не очень удобно (тем более, для обычных юзеров - они вообще испугаются этих кодов), поэтому код оставлю только для переноса (10). т.к. коротко. Остальные же сочетания символов в качестве разделителя предоставлю право вводить напрямую
По замечаниям и советам: постараюсь учесть всё, что вы сказали. В этом коде увидел несколько новых приёмов - постараюсь как-нибудь применить их на практике построения другого макроса.
И снова огромное спасибо Вам за помощь и подробное объяснение!!!  :idea:  8)
P.S.: приятный сюрприз - старый код иногда генерировал полностью пустые строки, что легко удалялось вручную и не вызывало особых проблем. Теперь (во всяком случае пока что) этого не выявлено :idea: )))

Привожу тело макроса (за исключением введения разделителя и шапки с авторами - копия из #32)
Код
Sub TextOnRowsInRangeHARD()
 
'Автор: webley
'Редактор: JayBhagavan
'Адаптация под сложный перенос и коррекция: JeyCi
'Тема на сайте: http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=80210&TITLE_SEO=80210-razbit-tekst-v-yacheyke-po-strokam-cherez-proizvolnyy-razdelitel#postform
'=====================================================================================================================================================================================
  
Dim cl As Range, rng As Range, rngTmp As Range
Dim strDelim$, strTmp$
Dim Arr() As String
Dim i&, n&, j&, k&, a&

    strDelim = InputBox("Введите символ-разделитель")
    If strDelim = 10 Then strDelim = Chr(10) 'ввести "10" для использования в качестве разделителя "перенос строки"
    If strDelim = "" Then Exit Sub
      
Application.ScreenUpdating = False
       
    If TypeName(Selection) = "Range" Then
        Set rng = Selection
    End If
      
    For i = rng.Rows.Count To 1 Step -1
    '***
        Max = 0
        For j = 1 To rng.Columns.Count
                strTmp = rng(i, j).Value & strDelim
                   Arr = Split(strTmp, strDelim)
                   a = UBound(Arr)
            Max = IIf(Max > a, Max, a)
        Next
        If Max <= 1 Then GoTo nx
    '***
        rng(i, 1).Offset(1, 0).Resize(Max - 1).EntireRow.Insert Shift:=xlDown ', CopyOrigin:=xlFormatFromLeftOrAbove
   For j = 1 To rng.Columns.Count
            With rng(i, j)
            If InStr(rng(i, j), strDelim) Then
                strTmp = .Value '& strDelim
                Arr = Split(strTmp, strDelim)
                a = UBound(Arr)
                    Set rngTmp = .Resize(a)
                    For k = 0 To a
                        rngTmp(k + 1, 1).Value = Arr(k)
                    Next k
            End If
            End With
        Next j
nx:
    Next i
    
Application.ScreenUpdating = True

End Sub
Изменено: Jack Famous - 06.08.2016 12:05:59
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, добрый день!
Мой блок кода не исправлял ошибку, он добавлял номера идентификаторов строкам: :)
Код
For k = 0 To UBound(Arr) - 1                        
If j = 1 Then: For l = 1 To Max: rngTmp(l, 1).Value = Arr(k): Next

 
Цитата
Jack Famous написал: поэтому код оставлю только для переноса (10).
тогда выходите из процедуры во Всех остальных случаях (не только при "")
Код
strDelim = InputBox("Введите символ-разделитель")
If strDelim = 10 Then
   strDelim = Chr(10) 'ввести "10" для использования в качестве разделителя "перенос строки"
Else: Exit Sub
End If
т.к. по вашему коду вы рассматриваете только 2 случая - 10 и ""... но могут быть и другие (введут всё что угодно)
Изменено: JeyCi - 07.08.2016 07:13:06
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
вы рассматриваете только 2 случая - 10 и ""... но могут быть и другие (введут всё что угодно)
Доброго утра, уважаемая JeyCi,! Выбор разделителей не ограничен 2мя - разделителем может быть любой символ или сочетание нескольких, иногда даже слова-маркеры. Но процедуру выхода знать необходимо - записал себе. Спасибо за подсказку! :idea:
Jungl, спасибо за вариант, но заполнение пустых ячеек значениями из верхних не было проблемой))) в #6 я сказал, что это делается отдельным макросом. Ещё раз спасибо за то, что не прошли мимо  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: Пред. 1 2
Наверх