Страницы: 1 2 След.
RSS
Разбить текст в ячейке по строкам через произвольный разделитель
 
Доброго вечера, уважаемые Планетяне! В этой теме мне помогли автоматизировать разделение текста в ячейке по строкам через заданный разделитель.
Однако, появилась проблема, сходная с этой темой, но специфическая
Прошу вашей помощи вот в чём (заполняю по шаблону акты скрытых работ):
Существующее решение вставляет новые строки стандартным способом. А теперь встала проблема не просто "расцепить" по разделителю в новые строки, но и, чтобы эти строки в точности повторяли формат ячейки-источника (заливка, шрифт, выравнивание и даже объединение).
Более того, строгие технадзоры заставляют нумеровать (индексировать) данные в каждой новой строке расцепления.
Подробности и наглядность - в файле-примере
Может вы подскажете другой путь решения этой проблемы, нежели описанный мной… Всем заранее спасибо!

Способ №2. Решено уважаемой JeyCi в #32 или #34. Файл-пример последней версии здесь
Способ №1. НЕ Решено. Другой подход реализован ТУТ
Изменено: Jack Famous - 22.08.2016 11:51:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
А что - за 615 сообщений так и не научились писать код?
There is no knowledge that is not power
 
SuperCat,сделал  ;) А если вы про самостоятельное написание, то нет - к сожалению пока только чужие немного править могу ((
Изменено: Jack Famous - 26.07.2016 20:08:49
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: к сожалению пока только чужие немного править могу ((
Ну хоть так
There is no knowledge that is not power
 
Новый день - новый ап))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Всем доброго утра. Тема, видимо, не цепляет. Своих наработок у меня не появилось, зато появилась идея, как решить проблему с другой стороны. В общем, если привести базу-исходник к другому виду (расцепив по общим идентификаторам), это решит, хоть и не полностью, главную часть проблемы.
В файле примере привёл вероятный первый шаг - вставка пустых строк с запасом после каждой строки значений (делаю сам макросом отсюда). Затем я заполнил в столбце ИДЕНТИФИКАТОР пустые строки значениями верхних (сделаю сам).
Всё, что нужно - как-то разбить НЕпустые ячейки в выделенной области (все столбцы, кроме идентификатора) в СВОБОДНЫЕ снизу ячейки по заданному разделителю. Потом удалить полностью пустые строки (это тоже сам сделаю стандартными средствами). Вполне достаточно, чтобы макрос работал с Selection - области без проблем буду задавать самостоятельно. Помогите, VBAшники, пожалуйста…

Дополнил файл пошаговым примером (от макроса нужна только разбивка вниз без сдвига строк в диапазоне)
Изменено: Jack Famous - 28.07.2016 13:25:33
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
чем не понравился код из #1 - TextOnRowsInRange, если его адаптировть? (см.файл)
слово "перенос" у вас означает Chr(10), как разделитель
Код
    strDelim = InputBox("Введите символ-разделитель")
    If strDelim = "перенос" Then strDelim = Chr(10)
хотя для универсальности ПЕРЕДЕЛАЛА на:
Код
    Delim = InputBox("Введите символ-разделитель")
    strDelim = Chr(Delim)
    If strDelim = "" Then End
тогда символ кода разделителя вводить числом 10 (как chr(10) или др - узнать можно формулой в яч J1)
Изменено: JeyCi - 28.07.2016 12:22:48
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, большое спасибо за ответ и способ упрощения ввода :idea:  Решение не работает для диапазона - только ручками каждую ячейку - а их очень много(((

файлы удалены: превышение допустимого размера вложения [МОДЕРАТОР]
Изменено: Jack Famous - 06.08.2016 18:04:52
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: не работает для диапазона(((
из #11 зачем вам эта куча пустых строк? в реальном файле она есть?
Цитата
JeyCi написал: TextOnRowsInRange, если его адаптировть
#9 не работает? - откройте файл и запустите макрос по диапазону, уже выделенному...  
Изменено: JeyCi - 28.07.2016 11:43:23
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: зачем вам эта куча пустых строк?
в них будет разбиваться ячейка (описание в #8,хотя, может я вас, конечно, не правильно понял. Если способ разбивки макроса не менять, то при разбивке нескольких столбцов получается каша (см. скрин разбивки столбцов слева-направо). Каша из-за того, что макрос при разбивке ВСТАВЛЯЕТ новые строки. Это нужно для других задач, но в данном случае, мешает. Если подскажете, как разбивать просто вниз (там будут пустые строки с запасом), то думаю, это решит часть проблемы
Цитата
JeyCi написал: #9 не работает
взял ваш файл и делал в нём - не получилось((
Изменено: Jack Famous - 06.08.2016 18:05:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
перевложила файл на всякий случай в #9
у меня работает - Jack Famous у меня времени не много  ;) (если вы не уточняете, что не работает, где, какие нюансы и картинками пытаетесь убедить)  - НУЖНЫЕ ПУСТЫЕ СТРОКИ ФОРМИРУЮТСЯ ПО КОДУ - применение макроса на пустые строки не проверяла, не вижу оптимальности... из темы ушла (вашего файла, что не работает, нет)
Изменено: JeyCi - 28.07.2016 12:00:06
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, мой косяк - использовал "перенос", т.к. обычно или он, или символы, коды которых не хочу искать.
Использовав 10 всё перенеслось, однако начала теряться Схема1 (см. скрин) + сбилось соответствие с идентификатором (всё выделено оранжевым)
Примечание: 4, 5 и 6 - это копии 1, 2 и 3.
Подозреваю, что "потери" из-за нехватки места (что я пытался решить пустыми строками). Проблема в том, что количество данных, которые будут разбиты может варьироваться во всех столбцах (то есть самой "объёмной" из каждой строки могут быть ячейки совершенно разных столбцов). Может быть можно решить с пустыми строками, добавив условие пропуска пустых ячеек в макрос?
Изменено: Jack Famous - 28.07.2016 12:20:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
JeyCi написал:
из темы ушла (вашего файла, что не работает, нет)
мой файл, который не работает тот же что и ваш (на вашем скрине также схема потеряна). Прикрепляю ещё раз (убрал вообще запрос на разделитель - это нюанс, с которым я самостоятельно разберусь. Текущий разделитель - перенос строки)
Изменено: Jack Famous - 28.07.2016 12:18:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
поправила работу с массивом - перевложила в #9 (не даёте мне уйти  8))... если хотите слово "перенос" - то верните прежние строки... но у вас ведь тема наз. "через произвольный разделитель" - по коду символа считаю оптимальным, либо сами по коду макроса прописывайте все символы разделителей возможных и придумывайте им названия... успехов
P.S. и (на будущее) прекращайте рисовать картинки - места занимает много, посты получаются длинные, не удобно читать. причину проблемы всё равно не вскрыть... всегда сразу выкладывайте проблемный файл - в нём всё и так видно... картинки в крайнем случае того, чего нет в файле
Изменено: JeyCi - 28.07.2016 18:16:30
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, всё понял)))) про разделитель - это больше для тех, кто искать будет)))) к сожалению, всё ещё не до конца работает ((((
теряется соответствие - то есть разбивает туда, где по идентификатору должен уже начинаться новый
Изменено: Jack Famous - 28.07.2016 12:33:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: к сожалению, всё ещё не до конца работает ((((
- я пас... у вас с соответствием и так проблемы по файлу - т.к.  слово Схема сбивает всё соответствие (потом идут номера документов 1 и т.д.), в др столбцах сразу док-ты (1 и т.д.) - думать об этом надо на этапе постановки вопроса, переделывать много раз?? (я здесь не живу!!) ... колдуйте дальше сами  ;) успехов (вникать, куда вы хотите деть это слово не готова - это надо было указать в 1-м посте, какое соответствие не устраивает из первоначального макроса)...  много писанины - остаётся мало времени на код - #9 отработал в примере #9... на 18-м посте я его ошибку не замечу... не хочу... вы всё ещё не цените время  :( (особенно чужое)
Изменено: JeyCi - 28.07.2016 12:55:43
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, но макрос по-прежнему некорректно разбивает  :cry:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
надо было указать в 1-м посте, какое соответствие не устраивает из первоначального макроса
в 1 посте 2 подхода. Первый мы с вами даже не затрагивали. Второй (преобразование базы данных) я расписал - исходник и что хотелось бы получить в итоге(((
Даже предложил самый простой (на мой взгляд) вариант - добавить заведомо бОльшее количество пустых строк после каждой строки исходника (чтобы строк было больше, чем количество сцеплённых данных в любой ячейке). Потом просто разбить выделенный диапазон (каждую ячейку вниз без сдвига)
Насчёт времени: здесь помогают на добровольной основе и, как минимум, одно ваше решение уже экономит много времени (вот это). Поэтому если нет возможности, то увы((( вы и так первая, кто предложил вариант в этой теме. Спасибо даже уже за это… :idea:
Дополнил файл пошаговым примером (от макроса нужна только разбивка вниз без сдвига строк в диапазоне)
Изменено: Jack Famous - 28.07.2016 13:03:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: Насчёт времени: здесь помогают на добровольной основе
'это не значит, что с вашей проблемой готовы разбираться весь день, потому что вы не формулируете мысли чётко и кратко (а 9 постов показываете, что не работает), наша жизнь не всё для конкретного юзера  ;) (др. ветки тоже нуждаются в помощи)... возможно, кто-то окажется более свободным и заинтересованным в вашей теме, но вы можете пробовать сами
Изменено: JeyCi - 28.07.2016 13:12:34
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: вы не формулируете мысли чётко
это точно))) борюсь .но пока безрезультатно. Но в файле-то всё, вроде, теперь понятно…
Цитата
JeyCi написал: вы можете пробовать сами
нет даже малейшей базы. В регулярках ещё пытаюсь что-то экспериментировать, а тут беда((
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:  а тут беда((
беда в том, что даже не пытаетесь понять имеющиеся варианты и Доработать под Свои потребности... столько постов убили на объяснения, ЧТО вам надо - ЭТО в раздел Работа с таким подходом, вместо того, чтобы начать писать КАК ВЫ это делаете, и КАКАЯ строка приводит к ошибочному итогу... на добровольной основе помогают, а не решают всё за вас... (у вас не беда, у вас нежелание думать и желание распоряжаться чужим временем, как своим, - это страшнее беды с файлом)  :cry: ...
в файле адаптация: т.к. после Split в массив кол-во строк разное по столбцам, то сначала надо определить max, и добавить кол-во строк под максимальную длину массива... логично?
p.s. возможно, предварительное написание себе тех.задания вам в дальнейшем будет помогать намного больше, чем несколько примеров "стыренных"  ;) ... если не получается их адаптировать - то зачем им уделять столько времени?.. может, сами ещё лучше напишите, если начнёте  8)
***
P.P.S доработано в #30  :excl:
Изменено: JeyCi - 07.08.2016 06:01:28
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi, вроде всё чётко работает - спасибо Вам большое за помощь!))))
Цитата
JeyCi написал:
вместо того, чтобы начать писать КАК ВЫ это делаете, и КАКАЯ строка приводит к ошибочному итогу
макрос, который я приводил в начале от webley и JayBhagavan полностью рабочий, просто использовался в других целях. На момент его создания просто не было необходимости в такой сложной разбивке ,как сейчас. Сам я макросы не пишу (разве только макрорекордером), иногда могу кое-какие макросы подпилить (типа InputBox для ввода любого разделителя - научился этому как раз из исходного макроса), но очень и очень редко. Хочу изучить VBA, т.к. это мне очень нужно, но этот год тяжёлый по работе (меняю часто) и времени совсем нет.
Цитата
JeyCi написал:
после Split в массив кол-во строк разное по столбцам, то сначала надо определить max, и добавить кол-во строк под максимальную длину массива... логично?
из этого понял только то, что вы, кажется, выбираете из всех ячеек (построчно) какая максимально заполнена, и уже столько пустых добавляете. Это логично, как и логично также (хоть и гораздо более топорно) было бы просто разбивать вниз в заранее подготовленные пустые строки с запасом, как предлагал я (я бы это хоть попробовал бы понять). Но, ещё раз повторю, Ваше решение намного проще для работы, но не для понимания мной.
Цитата
JeyCi написал:
предварительное написание себе тех.задания вам в дальнейшем будет помогать намного больше, чем несколько примеров "стыренных"   ... если не получается их адаптировать - то зачем им уделять столько времени?.. может, сами ещё лучше напишите, если начнёте  
техзадание было составлено, просто вариант решения, как всегда, не один (и это прекрасно) примеры мои, как и исходный макрос (не мой, но из моей темы). Не если, но КОГДА начну писать на VBA меня уже будет не остановить ))))))) :D

Ещё раз огромное спасибо за решение проблемы!  :idea: 8)

P.S.: Буду рад, если подскажете, куда смотреть по поводу решения способа №1 (они оба нужны, для разных целей)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: кажется, выбираете из всех ячеек (построчно)
по-другому... при обработке каждой строки - сначала проверка по столбцам, потом вставка нужного количества строк, потом разнос строки начальной на все строки вставленные
Изменено: JeyCi - 28.07.2016 15:27:48
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Способ №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



Изменено: Jack Famous - 28.07.2016 15:32:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
JeyCi, вот видите - даже элементарное с трудом))))) и это я ещё русским языком написал… Что будет на VBA страшно представить. А ещё я боюсь, что у меня макрос если и получится для конкретного случая, то на реальной задаче он где-то запорется, а я даже не узнаю об этом - вот это реальная проблема...
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Доброго утра, планетяне! Подскажите пожалуйста, как подправить код, чтобы не выдавал таких ошибок (см. скрин).
Как я понял, ошибка возникает, если в диапазоне содержатся ячейки, не содержащие разделителя… (в данном случае в полях "РД" и "НД")
Изменено: Jack Famous - 05.08.2016 11:23:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, фрагмента со скрина в файле не обнаружил. Советую:
1) раскомментировать "& strDelim"
2) ресайз делать при условии, что "а" больше 1.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, спасибо за отклик! Прошу прощения - не добавил последнюю версию кода в файл (исправил и дублирую сюда).
Раскомментировал "& strDelim", но не получается добавить "If a>1" - возникает путаница с блоками "With…End With" и "Next"
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, так попробуйте:
Код
        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)
Изменено: JeyCi - 07.08.2016 06:04:33
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1 2 След.
Наверх