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... лучше задавайте конкретные! вопросы о том, что не получается у вас... а не о том, что надо ... - наУчитесь кодировать сами
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Jungl спасибо большое за участие и отклик. При замене соответствующего блока возникает ошибка. Закрашивал вручную для визуализации - не задача макроса. JeyCi до функции InStr(In String) как проверки на наличие разделителя (только что узнал из справочника) я бы своим умом на данном уровне точно не допёр бы (а всё ж посложнее получилось, чем просто If a>1 проверить). Напротив, введение места кода nx, (куда переносит, когда во всех ячейках строки отсутствуют разделители) выглядит очень просто
Цитата
JeyCi написал: ЦитатаJack Famous написал: не содержащие разделителя… (в данном случае в полях "РД" и "НД")в данном случае - это была скорее шапка! (которая у вас тоже была в Selection)
как по мне, учить коды символов или смотреть их функцией КОДСИМВОЛ не очень удобно (тем более, для обычных юзеров - они вообще испугаются этих кодов), поэтому код оставлю только для переноса (10). т.к. коротко. Остальные же сочетания символов в качестве разделителя предоставлю право вводить напрямую По замечаниям и советам: постараюсь учесть всё, что вы сказали. В этом коде увидел несколько новых приёмов - постараюсь как-нибудь применить их на практике построения другого макроса. И снова огромное спасибо Вам за помощь и подробное объяснение!!! P.S.: приятный сюрприз - старый код иногда генерировал полностью пустые строки, что легко удалялось вручную и не вызывало особых проблем. Теперь (во всяком случае пока что) этого не выявлено )))
Привожу тело макроса (за исключением введения разделителя и шапки с авторами - копия из #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 написал: поэтому код оставлю только для переноса (10).
тогда выходите из процедуры во Всех остальных случаях (не только при "")
Код
strDelim = InputBox("Введите символ-разделитель")
If strDelim = 10 Then
strDelim = Chr(10) 'ввести "10" для использования в качестве разделителя "перенос строки"
Else: Exit Sub
End If
т.к. по вашему коду вы рассматриваете только 2 случая - 10 и ""... но могут быть и другие (введут всё что угодно)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi написал: вы рассматриваете только 2 случая - 10 и ""... но могут быть и другие (введут всё что угодно)
Доброго утра, уважаемая JeyCi,! Выбор разделителей не ограничен 2мя - разделителем может быть любой символ или сочетание нескольких, иногда даже слова-маркеры. Но процедуру выхода знать необходимо - записал себе. Спасибо за подсказку! Jungl, спасибо за вариант, но заполнение пустых ячеек значениями из верхних не было проблемой))) в #6 я сказал, что это делается отдельным макросом. Ещё раз спасибо за то, что не прошли мимо
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄