Объединение текста в одну строку по условию.

Автор ArtemkoKip, 19 апреля 2016, 16:10

0 Пользователи и 1 гость просматривают эту тему.

ArtemkoKip

Доброго дня. Помогите в составлении макроса для объединения теста в одну строку из одного столбца, значение другого столбца которого соответствует заданному условию. Пока нашел только макрос для excel:

Function MergeIf(TextRange As Range, SearchRange As Range, Condition As String)
    Dim Delimeter As String, i As Long
    Delimeter = ", " 'символы-разделители (можно заменить на пробел или ; и т.д.)
     
    'если диапазоны проверки и склеивания не равны друг другу - выходим с ошибкой
    If SearchRange.Count <> TextRange.Count Then
        MergeIf = CVErr(xlErrRef)
        Exit Function
    End If
     
    'проходим по все ячейкам, проверяем условие и собираем текст в переменную OutText
    For i = 1 To SearchRange.Cells.Count
        If SearchRange.Cells(i) Like Condition Then OutText = OutText & TextRange.Cells(i) & Delimeter
    Next i
     
    'выводим результаты без последнего разделителя
    MergeIf = Left(OutText, Len(OutText) - Len(Delimeter))
End Function


Переработать его в макрос Openoffice знаний не хватает.
Помогите!!

JohnSUN

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ArtemkoKip

Цитата: JohnSUN от 19 апреля 2016, 19:54
Посмотри здесь

Хоба! то что надо! Спасибо!
А есть ли у кого понимание как его подправить, что бы он склеивал текст не "А1, А2, А3, А6, А9, А10, А11, А12, А20...", а "А1-А3, А6, А9-А12, А20...".
Или проще копать в редактировании с помощью промежуточной формулы готового результата?

JohnSUN

Ты о номерах бланков, что ли? Или что ты диапазонами считать собрался?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ArtemkoKip

Цитата: JohnSUN от 20 апреля 2016, 07:32
Ты о номерах бланков, что ли? Или что ты диапазонами считать собрался?

Ну если в кратце о предметной области, то в левом столбце есть список автоматических выключателей (QF1, QF2, QF3,...). В правом столбце описана их фазность и номинал (1/6, 1/20, 3/10...). Есть необходимость сформировать что то типа перечня элементов, в котором в левом столбце будут перечисляться все автоматы каждого номинала, а в правом просто указана модель.
Пример в файле.

JohnSUN

Угу... То есть проблема в том, что в AS3, AS19 и в AS23 все наименования просто не влазят в выделенное поле?
Ну, тут возможны как минимум четыре решения:
1. Уменьшать размер шрифта для этих ячеек, пока всё не поместится
2. Увеличивать очередную строку спецификации пока вся запись со шрифтом 10 туда не влезет без искажений
3. (как ты и предложил) Использовать сокращенную запись, где пачка последовательных обозначений будет записана через тире (а как на такую запись смотрит нормоконтроль?)
4. Забить.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ArtemkoKip

Цитата: JohnSUN от 20 апреля 2016, 11:01
Угу... То есть проблема в том, что в AS3, AS19 и в AS23 все наименования просто не влазят в выделенное поле?
Ну, тут возможны как минимум четыре решения:
1. Уменьшать размер шрифта для этих ячеек, пока всё не поместится
2. Увеличивать очередную строку спецификации пока вся запись со шрифтом 10 туда не влезет без искажений
3. (как ты и предложил) Использовать сокращенную запись, где пачка последовательных обозначений будет записана через тире (а как на такую запись смотрит нормоконтроль?)
4. Забить.



Забить! Тогда придется ручками все делать) А что тогда будет двигать прогресс если не лень)
Дело даже не в том что элементов много и красиво в строчку не влазят. Скорее как раз таки по нормам положено идущие друг за другом записывать через тире.
Думаю в макросе это реализовать было бы красивее. Но видимо буду делать через промежуточные формулы.
Спасибо за помощь! Очень помогли).

JohnSUN

Да нет, под "забить" я имел в виду не "забить на задачу", а "перебить полученную формулой строку вручную"... Сорри, за не точную формулировку.

Задача-то, в принципе, решаемая... Не тривиальная, но решаемая. Более того, такой макрос был бы полезен не только в этой конкретной задаче.
Но повозиться с кодированием однозначно придётся. Допустим, что строку "QF24, QF28, QF36, QF37, QF38, QF40, QF41, QF43, QF45, QF46, QF50, QF51, QF53, QF54, QF58, QF59, QF64", можно бы сократить, например, до "QF24, QF28, QF36-QF38, QF40-QF41, QF43, QF45-QF46, QF50-QF51, QF53-QF54, QF58-QF59, QF64" (на одних пробелах сколько экономии!). Но как правильно записать пару соседних значений? "QF50-QF51" или все-таки "QF50, QF51"?
Или, например, где гарантия, что они в исходном виде расположены в отсортированном порядке?
И "префиксы" перед числовыми значениями представляют собой проблему - написанные в разном регистре считать одинаковыми или разными? Формировать итоговую строку по алфавитному порядку префиксов или тупо во возрастанию числовой части? Ну, и так далее... Одно только описание задачи займёт кучу времени.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ArtemkoKip

Цитата: JohnSUN от 20 апреля 2016, 15:06
Да нет, под "забить" я имел в виду не "забить на задачу", а "перебить полученную формулой строку вручную"... Сорри, за не точную формулировку.

Задача-то, в принципе, решаемая... Не тривиальная, но решаемая. Более того, такой макрос был бы полезен не только в этой конкретной задаче.
Но повозиться с кодированием однозначно придётся. Допустим, что строку "QF24, QF28, QF36, QF37, QF38, QF40, QF41, QF43, QF45, QF46, QF50, QF51, QF53, QF54, QF58, QF59, QF64", можно бы сократить, например, до "QF24, QF28, QF36-QF38, QF40-QF41, QF43, QF45-QF46, QF50-QF51, QF53-QF54, QF58-QF59, QF64" (на одних пробелах сколько экономии!). Но как правильно записать пару соседних значений? "QF50-QF51" или все-таки "QF50, QF51"?
Или, например, где гарантия, что они в исходном виде расположены в отсортированном порядке?
И "префиксы" перед числовыми значениями представляют собой проблему - написанные в разном регистре считать одинаковыми или разными? Формировать итоговую строку по алфавитному порядку префиксов или тупо во возрастанию числовой части? Ну, и так далее... Одно только описание задачи займёт кучу времени.


Пока что пытаюсь решить "узко поставленную" задачу. Поэтому:
- "QF50, QF51"
- В исходном виде расположены ТОЛЬКО в отсортированном порядке и повторы исключены
- Префиксы, написанные в разном регистре считать одинаковыми.
- Формировать итоговую строку по алфавитному порядку префиксов или по возрастанию числовой части, так как префиксы все равны)

Как бы не пришлось Макросы изучать)

kompilainenn

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

JohnSUN

Цитата: kompilainenn от 20 апреля 2016, 17:00
Цитата: ArtemkoKip от 20 апреля 2016, 14:08Как бы не пришлось Макросы изучать)
вы УЖЕ влипли=)
Спешишь с диагнозом - он пока в процессе...
Цитата: ArtemkoKip от 20 апреля 2016, 16:08
Пока что пытаюсь решить "узко поставленную" задачу.
Хорошо. Как насчет "довеска" к уже имеющемуся макросу? В смысле, не переписывать concRng, а подсунуть полученную от него строку в другую функцию, которая развалит строку обратно на отдельные составляющие, выбросит всё, что не является цифрами, пробежится по полученному списку отбирая начало и конец "последовательностей больше двух", слепит всё это обратно, пробрасывая (подменяя на тире) внутренние значения и возвращая на место префиксы... Такое, пожалуй, проще сделать, чем парсить всю исходную последовательность ячеек, сортировать, проверять на допустимость и всё такое прочее

И еще раз к фразе, которая взволновала форумчан:
Цитата: ArtemkoKip от 20 апреля 2016, 16:08
Как бы не пришлось Макросы изучать)
А что, слабо? Здесь, на форуме, даже девушки с этим справляются...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

JohnSUN

Наверное, как-то так... Не сказал бы, что хоть чем-то помогло перечням в AS19 и в AS23. Но AS3 действительно так выглядит лучше
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ArtemkoKip

Цитата: JohnSUN от 21 апреля 2016, 12:05
Наверное, как-то так... Не сказал бы, что хоть чем-то помогло перечням в AS19 и в AS23. Но AS3 действительно так выглядит лучше

Афигеть! Я в восторге и благодарность моя безгранична! Все как надо! Даже удобно, что это отдельный макрос. Можно использовать, а можно нет. Или можно гдето еще отдельно применять. Спасибо огромное. Сейчас зашиваюсь на работе по основным направлениям, а вы сэкономили мне кучу времени. Примного благодарен.

kompilainenn

>благодарность моя безгранична

точно?! почитайте подпись под сообщением Джона
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

kl33

#14
Цитата: JohnSUN от 21 апреля 2016, 12:05Наверное, как-то так...
Добрый день.
Можете помочь в добавлении условия распознавания  двух периодов и соединения их в один по двум крайним одинаковых значениям, например: "QF1, QF2, QF3, QF5-QF12, QF13-QF19, QF21" → QF1-QF3, QF5-QF19, QF21" ?
Буду признателен за помощь.