Доброго вечера, уважаемые Планетяне! В этой теме мне помогли автоматизировать разделение текста в ячейке по строкам через заданный разделитель. Однако, появилась проблема, сходная с этой темой, но специфическая… Прошу вашей помощи вот в чём (заполняю по шаблону акты скрытых работ): Существующее решение вставляет новые строки стандартным способом. А теперь встала проблема не просто "расцепить" по разделителю в новые строки, но и, чтобы эти строки в точности повторяли формат ячейки-источника (заливка, шрифт, выравнивание и даже объединение). Более того, строгие технадзоры заставляют нумеровать (индексировать) данные в каждой новой строке расцепления. Подробности и наглядность - в файле-примере Может вы подскажете другой путь решения этой проблемы, нежели описанный мной… Всем заранее спасибо!
Способ №2. Решено уважаемой JeyCi в #32 или #34. Файл-пример последней версии здесь Способ №1. НЕ Решено. Другой подход реализован ТУТ
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Всем доброго утра. Тема, видимо, не цепляет. Своих наработок у меня не появилось, зато появилась идея, как решить проблему с другой стороны. В общем, если привести базу-исходник к другому виду (расцепив по общим идентификаторам), это решит, хоть и не полностью, главную часть проблемы. В файле примере привёл вероятный первый шаг - вставка пустых строк с запасом после каждой строки значений (делаю сам макросом отсюда). Затем я заполнил в столбце ИДЕНТИФИКАТОР пустые строки значениями верхних (сделаю сам). Всё, что нужно - как-то разбить НЕпустые ячейки в выделенной области (все столбцы, кроме идентификатора) в СВОБОДНЫЕ снизу ячейки по заданному разделителю. Потом удалить полностью пустые строки (это тоже сам сделаю стандартными средствами). Вполне достаточно, чтобы макрос работал с Selection - области без проблем буду задавать самостоятельно. Помогите, VBAшники, пожалуйста…
Дополнил файл пошаговым примером (от макроса нужна только разбивка вниз без сдвига строк в диапазоне)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
в них будет разбиваться ячейка (описание в #8,хотя, может я вас, конечно, не правильно понял. Если способ разбивки макроса не менять, то при разбивке нескольких столбцов получается каша (см. скрин разбивки столбцов слева-направо). Каша из-за того, что макрос при разбивке ВСТАВЛЯЕТ новые строки. Это нужно для других задач, но в данном случае, мешает. Если подскажете, как разбивать просто вниз (там будут пустые строки с запасом), то думаю, это решит часть проблемы
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
перевложила файл на всякий случай в #9 у меня работает - Jack Famous у меня времени не много (если вы не уточняете, что не работает, где, какие нюансы и картинками пытаетесь убедить) - НУЖНЫЕ ПУСТЫЕ СТРОКИ ФОРМИРУЮТСЯ ПО КОДУ - применение макроса на пустые строки не проверяла, не вижу оптимальности... из темы ушла (вашего файла, что не работает, нет)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, мой косяк - использовал "перенос", т.к. обычно или он, или символы, коды которых не хочу искать. Использовав 10 всё перенеслось, однако начала теряться Схема1 (см. скрин) + сбилось соответствие с идентификатором (всё выделено оранжевым) Примечание: 4, 5 и 6 - это копии 1, 2 и 3. Подозреваю, что "потери" из-за нехватки места (что я пытался решить пустыми строками). Проблема в том, что количество данных, которые будут разбиты может варьироваться во всех столбцах (то есть самой "объёмной" из каждой строки могут быть ячейки совершенно разных столбцов). Может быть можно решить с пустыми строками, добавив условие пропуска пустых ячеек в макрос?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
JeyCi написал: из темы ушла (вашего файла, что не работает, нет)
мой файл, который не работает тот же что и ваш (на вашем скрине также схема потеряна). Прикрепляю ещё раз (убрал вообще запрос на разделитель - это нюанс, с которым я самостоятельно разберусь. Текущий разделитель - перенос строки)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
поправила работу с массивом - перевложила в #9 (не даёте мне уйти )... если хотите слово "перенос" - то верните прежние строки... но у вас ведь тема наз. "через произвольный разделитель"- по коду символа считаю оптимальным, либо сами по коду макроса прописывайте все символы разделителей возможных и придумывайте им названия... успехов P.S. и (на будущее) прекращайте рисовать картинки - места занимает много, посты получаются длинные, не удобно читать. причину проблемы всё равно не вскрыть... всегда сразу выкладывайте проблемный файл - в нём всё и так видно... картинки в крайнем случае того, чего нет в файле
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, всё понял)))) про разделитель - это больше для тех, кто искать будет)))) к сожалению, всё ещё не до конца работает (((( теряется соответствие - то есть разбивает туда, где по идентификатору должен уже начинаться новый
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: к сожалению, всё ещё не до конца работает ((((
- я пас... у вас с соответствием и так проблемы по файлу - т.к. слово Схема сбивает всё соответствие (потом идут номера документов 1 и т.д.), в др столбцах сразу док-ты (1 и т.д.) - думать об этом надо на этапе постановки вопроса, переделывать много раз?? (я здесь не живу!!) ... колдуйте дальше сами успехов (вникать, куда вы хотите деть это слово не готова - это надо было указать в 1-м посте, какое соответствие не устраивает из первоначального макроса)... много писанины - остаётся мало времени на код - #9 отработал в примере #9... на 18-м посте я его ошибку не замечу... не хочу... вы всё ещё не цените время (особенно чужое)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, но макрос по-прежнему некорректно разбивает
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: надо было указать в 1-м посте, какое соответствие не устраивает из первоначального макроса
в 1 посте 2 подхода. Первый мы с вами даже не затрагивали. Второй (преобразование базы данных) я расписал - исходник и что хотелось бы получить в итоге((( Даже предложил самый простой (на мой взгляд) вариант - добавить заведомо бОльшее количество пустых строк после каждой строки исходника (чтобы строк было больше, чем количество сцеплённых данных в любой ячейке). Потом просто разбить выделенный диапазон (каждую ячейку вниз без сдвига) Насчёт времени: здесь помогают на добровольной основе и, как минимум, одно ваше решение уже экономит много времени (вот это). Поэтому если нет возможности, то увы((( вы и так первая, кто предложил вариант в этой теме. Спасибо даже уже за это… Дополнил файл пошаговым примером (от макроса нужна только разбивка вниз без сдвига строк в диапазоне)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: Насчёт времени: здесь помогают на добровольной основе
'это не значит, что с вашей проблемой готовы разбираться весь день, потому что вы не формулируете мысли чётко и кратко (а 9 постов показываете, что не работает), наша жизнь не всё для конкретного юзера (др. ветки тоже нуждаются в помощи)... возможно, кто-то окажется более свободным и заинтересованным в вашей теме, но вы можете пробовать сами
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
нет даже малейшей базы. В регулярках ещё пытаюсь что-то экспериментировать, а тут беда((
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
беда в том, что даже не пытаетесь понять имеющиеся варианты и Доработать под Свои потребности... столько постов убили на объяснения, ЧТО вам надо - ЭТО в раздел Работа с таким подходом, вместо того, чтобы начать писать КАК ВЫ это делаете, и КАКАЯ строка приводит к ошибочному итогу... на добровольной основе помогают, а не решают всё за вас... (у вас не беда, у вас нежелание думать и желание распоряжаться чужим временем, как своим, - это страшнее беды с файлом) ... в файле адаптация: т.к. после Split в массив кол-во строк разное по столбцам, то сначала надо определить max, и добавить кол-во строк под максимальную длину массива... логично? p.s. возможно, предварительное написание себе тех.задания вам в дальнейшем будет помогать намного больше, чем несколько примеров "стыренных" ... если не получается их адаптировать - то зачем им уделять столько времени?.. может, сами ещё лучше напишите, если начнёте *** P.P.S доработано в #30
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
JeyCi, вроде всё чётко работает - спасибо Вам большое за помощь!))))
Цитата
JeyCi написал: вместо того, чтобы начать писать КАК ВЫ это делаете, и КАКАЯ строка приводит к ошибочному итогу
макрос, который я приводил в начале от webley и JayBhagavan полностью рабочий, просто использовался в других целях. На момент его создания просто не было необходимости в такой сложной разбивке ,как сейчас. Сам я макросы не пишу (разве только макрорекордером), иногда могу кое-какие макросы подпилить (типа InputBox для ввода любого разделителя - научился этому как раз из исходного макроса), но очень и очень редко. Хочу изучить VBA, т.к. это мне очень нужно, но этот год тяжёлый по работе (меняю часто) и времени совсем нет.
Цитата
JeyCi написал: после Split в массив кол-во строк разное по столбцам, то сначала надо определить max, и добавить кол-во строк под максимальную длину массива... логично?
из этого понял только то, что вы, кажется, выбираете из всех ячеек (построчно) какая максимально заполнена, и уже столько пустых добавляете. Это логично, как и логично также (хоть и гораздо более топорно) было бы просто разбивать вниз в заранее подготовленные пустые строки с запасом, как предлагал я (я бы это хоть попробовал бы понять). Но, ещё раз повторю, Ваше решение намного проще для работы, но не для понимания мной.
Цитата
JeyCi написал: предварительное написание себе тех.задания вам в дальнейшем будет помогать намного больше, чем несколько примеров "стыренных" ... если не получается их адаптировать - то зачем им уделять столько времени?.. может, сами ещё лучше напишите, если начнёте
техзадание было составлено, просто вариант решения, как всегда, не один (и это прекрасно) примеры мои, как и исходный макрос (не мой, но из моей темы). Не если, но КОГДА начну писать на VBA меня уже будет не остановить )))))))
Ещё раз огромное спасибо за решение проблемы!
P.S.: Буду рад, если подскажете, куда смотреть по поводу решения способа №1 (они оба нужны, для разных целей)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: кажется, выбираете из всех ячеек (построчно)
по-другому... при обработке каждой строки - сначала проверка по столбцам, потом вставка нужного количества строк, потом разнос строки начальной на все строки вставленные
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Способ №2. Решено уважаемой JeyCi. (Для указания в качестве разделителя "перенос строки" ввести "10")
Код
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)
If strDelim = "" Then End
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
'***
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)
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 With
Next j
Next i
Application.ScreenUpdating = True
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
JeyCi, вот видите - даже элементарное с трудом))))) и это я ещё русским языком написал… Что будет на VBA страшно представить. А ещё я боюсь, что у меня макрос если и получится для конкретного случая, то на реальной задаче он где-то запорется, а я даже не узнаю об этом - вот это реальная проблема...
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Доброго утра, планетяне! Подскажите пожалуйста, как подправить код, чтобы не выдавал таких ошибок (см. скрин). Как я понял, ошибка возникает, если в диапазоне содержатся ячейки, не содержащие разделителя… (в данном случае в полях "РД" и "НД")
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
JayBhagavan, спасибо за отклик! Прошу прощения - не добавил последнюю версию кода в файл (исправил и дублирую сюда). Раскомментировал "& strDelim", но не получается добавить "If a>1" - возникает путаница с блоками "With…End With" и "Next"
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
For j = 1 To rng.Columns.Count
With rng(i, j)
strTmp = .Value & strDelim
Arr = Split(strTmp, strDelim)
Set rngTmp = .Resize(UBound(Arr))
For k = 0 To UBound(Arr) - 1
If j = 1 Then: For l = 1 To Max: rngTmp(l, 1).Value = Arr(k): Next
rngTmp(k + 1, 1).Value = Arr(k)
Next k
End With
Next j
И обратите внимание на то, как у вас закрашиваются строки 3-го идентификатора(не разбирался)
из #21 можно одну небольшую проверку (на max) в нужном месте цикла (Логически!!) (если разделитель отсутствует во всех яч строки по всем столбцам) сразу к следующему шагу... т.е. к метке nx (строка42)
Код
Sub Text_ToRows_InSelection()
Dim cl As Range, rng As Range, rngTmp As Range
Dim strDelim$, strTmp$
Dim Arr() As String
Dim i&, n&, j&, k&, a&
Delim = InputBox("Введите символ-разделитель") 'код символа!!
strDelim = Chr(Delim)
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, мне жаловаться (как в #25) не надо на рус.яз - лучше уже пробуйте сами выстраивать логические цепочки проверки условий и выстраивания шагов последовательности (Логической) - языковые навыки сами нарисуются на горизонте... успехов! (в поисках Своих решений, а не своих оправданий) p.s. найдите отличия с #21 ... обратите внимание на их место в логической последовательности действий по коду - поймёте, что адаптировать было не сложно... проверив в нужных местах ТО, ЧТО вы Верно заметили как Причину!
Цитата
Jack Famous написал: не содержащие разделителя… (в данном случае в полях "РД" и "НД")
в данном случае - это была скорее шапка! (которая у вас тоже была в Selection).. потому что остальные столбцы в строке, где одиночные РД и НД, всё-таки могли быть разделены в массив по разделителю (с последующей вставкой строк)... последовательность действий я вам написала в #23 (проверка max выполняется меньшим количеством строк, чем проверка a - внесла соотв. изменения - строка 26)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)