Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Объединение нескольких ячеек в одну с доп условиями - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Объединение нескольких ячеек в одну с доп условиями (Макросы/Sub)
Объединение нескольких ячеек в одну с доп условиями
Mirabella Дата: Четверг, 05.11.2015, 00:29 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Доброй всем ночи!

Помогите, пож-та, разобраться с одним макросом.

Я перечитала кучу разной информации, советов и форумов, бьюсь уже несколько недель, но так и не смогла найти совет, который бы подошел к моему заданию. Вроде бы все очень близко, но не дает нужный мне результат.
Решилась задать вопрос на форуме, может быть, кто-нибудь найдет время и сможет мне помочь с этим заданием.

Итак, задание:
Есть таблица их четырех столбцов и нескольких строк. Таких таблиц много: несколько штук на нескольких листах. Привожу пример для одной.

Необходимо объединить все ячейки данной таблицы в одну ячейку.
Для этого я нашла макрос в интернете, и он прекрасно справился с заданием.

Но дальше начинаются проблемы.
Необходимо, чтобы каждая новая строчка начиналась с нового абзаца.
У меня получается, что с новой строчки начинается каждая сгруппированная ячейка, либо, наоборот, склеиваются все вместе без абзацев, а нужно, чтобы начиналась лишь часть текста (построчно).
А также, нужно, чтобы если в столбце "В" в какой-нибудь строчке не был введен текст - то вся строчка не добавлялась к объединению.

Единственный рабочий вариант, что я нашла, это объединение построчно и накладывание на нее доп условий.
Но тогда макрос становится просто огромным - почти, как прописывать формулы вручную.

Во вложении файл с примером таблицы, которую нужно объединить в одну ячейку, а также в ячейке А11 (что получается), а в С11 (как должно выгладить в итоге).

Может быть, кто-нибудь смог бы найти время и помочь мне написать "красивый" макрос, который бы удовлетворял всем условиям задания.

Заранее большое спасибо!
К сообщению приложен файл: Book1.xlsm (16.2 Kb)


Сообщение отредактировал Mirabella - Четверг, 05.11.2015, 00:30
 
Ответить
СообщениеДоброй всем ночи!

Помогите, пож-та, разобраться с одним макросом.

Я перечитала кучу разной информации, советов и форумов, бьюсь уже несколько недель, но так и не смогла найти совет, который бы подошел к моему заданию. Вроде бы все очень близко, но не дает нужный мне результат.
Решилась задать вопрос на форуме, может быть, кто-нибудь найдет время и сможет мне помочь с этим заданием.

Итак, задание:
Есть таблица их четырех столбцов и нескольких строк. Таких таблиц много: несколько штук на нескольких листах. Привожу пример для одной.

Необходимо объединить все ячейки данной таблицы в одну ячейку.
Для этого я нашла макрос в интернете, и он прекрасно справился с заданием.

Но дальше начинаются проблемы.
Необходимо, чтобы каждая новая строчка начиналась с нового абзаца.
У меня получается, что с новой строчки начинается каждая сгруппированная ячейка, либо, наоборот, склеиваются все вместе без абзацев, а нужно, чтобы начиналась лишь часть текста (построчно).
А также, нужно, чтобы если в столбце "В" в какой-нибудь строчке не был введен текст - то вся строчка не добавлялась к объединению.

Единственный рабочий вариант, что я нашла, это объединение построчно и накладывание на нее доп условий.
Но тогда макрос становится просто огромным - почти, как прописывать формулы вручную.

Во вложении файл с примером таблицы, которую нужно объединить в одну ячейку, а также в ячейке А11 (что получается), а в С11 (как должно выгладить в итоге).

Может быть, кто-нибудь смог бы найти время и помочь мне написать "красивый" макрос, который бы удовлетворял всем условиям задания.

Заранее большое спасибо!

Автор - Mirabella
Дата добавления - 05.11.2015 в 00:29
_Boroda_ Дата: Четверг, 05.11.2015, 02:12 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Не знаю, насколько красивый получился - просто тупо в лоб собираем по прядку
[vba]
Код
Sub Macro2()
    r0_ = 1
    r1_ = Range("A" & Rows.Count).End(xlUp).Row
    For i = r0_ To r1_
        If Range("B" & i) <> "" Then
            For j = 1 To 4
                d_ = IIf(j = 4, Chr(10), " ")
                n_ = n_ & Cells(i, j) & d_
            Next j
        End If
    Next i
    n_ = Left(n_, Len(n_) - 1)
    Range("D11") = n_
End Sub
[/vba]

Я бы сделал функцией пользователя лучше.
[vba]
Код
Function sbor(diap As Range)
    r0_ = diap.Row
    r1_ = r0_ + diap.Rows.Count - 1
    c0_ = diap.Column
    c1_ = c0_ + diap.Columns.Count
    For i = r0_ To r1_
        If Cells(i, c0_ + 1) <> "" Then
            For j = c0_ To c1_
                d_ = IIf(j = c1_, Chr(10), " ")
                n_ = n_ & Cells(i, j) & d_
            Next j
        End If
    Next i
    n_ = Left(n_, Len(n_) - 1)
    sbor = n_
End Function
[/vba]
В файле оранжевое - макросом, серое ЮДФ-кой
К сообщению приложен файл: Book1_2.xlsm (16.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеНе знаю, насколько красивый получился - просто тупо в лоб собираем по прядку
[vba]
Код
Sub Macro2()
    r0_ = 1
    r1_ = Range("A" & Rows.Count).End(xlUp).Row
    For i = r0_ To r1_
        If Range("B" & i) <> "" Then
            For j = 1 To 4
                d_ = IIf(j = 4, Chr(10), " ")
                n_ = n_ & Cells(i, j) & d_
            Next j
        End If
    Next i
    n_ = Left(n_, Len(n_) - 1)
    Range("D11") = n_
End Sub
[/vba]

Я бы сделал функцией пользователя лучше.
[vba]
Код
Function sbor(diap As Range)
    r0_ = diap.Row
    r1_ = r0_ + diap.Rows.Count - 1
    c0_ = diap.Column
    c1_ = c0_ + diap.Columns.Count
    For i = r0_ To r1_
        If Cells(i, c0_ + 1) <> "" Then
            For j = c0_ To c1_
                d_ = IIf(j = c1_, Chr(10), " ")
                n_ = n_ & Cells(i, j) & d_
            Next j
        End If
    Next i
    n_ = Left(n_, Len(n_) - 1)
    sbor = n_
End Function
[/vba]
В файле оранжевое - макросом, серое ЮДФ-кой

Автор - _Boroda_
Дата добавления - 05.11.2015 в 02:12
Mirabella Дата: Четверг, 05.11.2015, 22:41 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_,

Огромнейшее спасибо за помощь и за оперативность!
Даже не надеялась, что моя задача решится меньше, чем через сутки... Очень очень выручили!!!

Немного переделала для своего файла - все работает изумительно!
Завтра, наконец-то, покажу коллегам - будут пищать от восторга :)
 
Ответить
Сообщение_Boroda_,

Огромнейшее спасибо за помощь и за оперативность!
Даже не надеялась, что моя задача решится меньше, чем через сутки... Очень очень выручили!!!

Немного переделала для своего файла - все работает изумительно!
Завтра, наконец-то, покажу коллегам - будут пищать от восторга :)

Автор - Mirabella
Дата добавления - 05.11.2015 в 22:41
Mirabella Дата: Понедельник, 09.11.2015, 16:26 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, добрый день!

А можно еще один вопросик?
Как сделать так, чтобы если в столбце "B" ни одна ячейка не заполнена, макрос выдавал бы просто пустое место.
Сейчас он выдает ошибку.
[vba]
Код
Sub Macro2()
r0_ = 1
r1_ = Range("A" & Rows.Count).End(xlUp).Row
For i = r0_ To r1_
If Range("B" & i) <> "" Then
For j = 1 To 4
d_ = IIf(j = 4, Chr(10), " ")
n_ = n_ & Cells(i, j) & d_
Next j
'Я прописала вот такое условие:
Else
For j = 1 To 4
d_ = IIf(j = 4, Chr(10), "")
n_ = n_ & d_ (или же просто n_=n_ & " ")
Next j
'-------------------------
End If
Next i
n_ = Left(n_, Len(n_) - 1)
Range("D11") = n_
End Sub
[/vba]

Но, если не заполнены только несколько строчек, то образуется пустой абзац ( или же просто пробел, если меняю "d_" просто на " ").
А мне бы хотелось, что пустое место образовывалось только лишь в одном случае, когда пустые все строчки, а если какая-то одна или несколько, то он просто их не учитывал, как в изначальном макросе.

Пробовала прописать по аналогии с аругментом d_, но что-то ерунда какая-то вышла.

Буду очень очень благодарна за помощь!

Заранее спасибо!

[moder]Коды нужно оформлять тегами (кнопка #)!
Поправила за Вас[/moder]


Сообщение отредактировал Mirabella - Понедельник, 09.11.2015, 16:37
 
Ответить
Сообщение_Boroda_, добрый день!

А можно еще один вопросик?
Как сделать так, чтобы если в столбце "B" ни одна ячейка не заполнена, макрос выдавал бы просто пустое место.
Сейчас он выдает ошибку.
[vba]
Код
Sub Macro2()
r0_ = 1
r1_ = Range("A" & Rows.Count).End(xlUp).Row
For i = r0_ To r1_
If Range("B" & i) <> "" Then
For j = 1 To 4
d_ = IIf(j = 4, Chr(10), " ")
n_ = n_ & Cells(i, j) & d_
Next j
'Я прописала вот такое условие:
Else
For j = 1 To 4
d_ = IIf(j = 4, Chr(10), "")
n_ = n_ & d_ (или же просто n_=n_ & " ")
Next j
'-------------------------
End If
Next i
n_ = Left(n_, Len(n_) - 1)
Range("D11") = n_
End Sub
[/vba]

Но, если не заполнены только несколько строчек, то образуется пустой абзац ( или же просто пробел, если меняю "d_" просто на " ").
А мне бы хотелось, что пустое место образовывалось только лишь в одном случае, когда пустые все строчки, а если какая-то одна или несколько, то он просто их не учитывал, как в изначальном макросе.

Пробовала прописать по аналогии с аругментом d_, но что-то ерунда какая-то вышла.

Буду очень очень благодарна за помощь!

Заранее спасибо!

[moder]Коды нужно оформлять тегами (кнопка #)!
Поправила за Вас[/moder]

Автор - Mirabella
Дата добавления - 09.11.2015 в 16:26
Manyasha Дата: Понедельник, 09.11.2015, 16:45 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Mirabella, уберите кусок, который Вы написали, и сделайте в конце макроса проверку для n_
[vba]
Код
    If n_ <> "" Then n = Left(n_, Len(n_) - 1)' или If n_ <> "Empty
    Range("D11") = n_
[/vba]


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеMirabella, уберите кусок, который Вы написали, и сделайте в конце макроса проверку для n_
[vba]
Код
    If n_ <> "" Then n = Left(n_, Len(n_) - 1)' или If n_ <> "Empty
    Range("D11") = n_
[/vba]

Автор - Manyasha
Дата добавления - 09.11.2015 в 16:45
Mirabella Дата: Понедельник, 09.11.2015, 17:01 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Manyasha, добрый день!

Я пробовала так прописать, но макрос все равно выдает ошибку, потому и пришлось прописать условие с пустым местом.
Получается, что если все ячейки в столбце "В" пустые, то n_ вообще не существует и он начинает выдавать ошибку.

Может быть, я что-то неправильно понимаю, буду очень благодарна за разъяснение.
Во вложении приложила файл с проверкой n_ внизу. Оставшийся код без изменения.

Спасибо!
К сообщению приложен файл: 2745714.xlsm (15.6 Kb)


Сообщение отредактировал Mirabella - Понедельник, 09.11.2015, 17:03
 
Ответить
СообщениеManyasha, добрый день!

Я пробовала так прописать, но макрос все равно выдает ошибку, потому и пришлось прописать условие с пустым местом.
Получается, что если все ячейки в столбце "В" пустые, то n_ вообще не существует и он начинает выдавать ошибку.

Может быть, я что-то неправильно понимаю, буду очень благодарна за разъяснение.
Во вложении приложила файл с проверкой n_ внизу. Оставшийся код без изменения.

Спасибо!

Автор - Mirabella
Дата добавления - 09.11.2015 в 17:01
Manyasha Дата: Понедельник, 09.11.2015, 17:20 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Mirabella, смотрите, Ваши 2 последние строчки до моей поправки:
[vba]
Код
    n_ = Left(n_, Len(n_) - 1)
    Range("D11") = n_
[/vba]
если столбец В пустой, переменная n_ пустая (Empty), функция Len(n_) - возвращает длину подаваемой строки, длина пустой строки = 0.
Потом, Вы от этой длины вычитаете 1, получается 0-1=-1.
Left - функция аналогичная функции листа ЛЕВСИМВ, т.е. Вы пытаетесь взять у строки -1 левый символ - такого не может быть, поэтому возникает ошибка.

Я Вам предлагаю проверить, не пустая ли n_, и убирать последний символ, только в том случае, если длина строки n_>0.

Теперь смотрите, что Вы написали :o :
[vba]
Код
    n_ = Left(n_, Len(n_) - 1)'убираем последний символ
    Range("D11") = n_'выводим строку в D11
    
    If n_ <> "" Then n = Left(n_, Len(n_) - 1)'убираем еще 1 последний символ, если n_ не является пустой
    Range("D11") = n_'выводим в D11
[/vba]
Даже при отсутствии ошибок, у Вас будет неверный результат.

Оставьте только строчки с проверкой.


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеMirabella, смотрите, Ваши 2 последние строчки до моей поправки:
[vba]
Код
    n_ = Left(n_, Len(n_) - 1)
    Range("D11") = n_
[/vba]
если столбец В пустой, переменная n_ пустая (Empty), функция Len(n_) - возвращает длину подаваемой строки, длина пустой строки = 0.
Потом, Вы от этой длины вычитаете 1, получается 0-1=-1.
Left - функция аналогичная функции листа ЛЕВСИМВ, т.е. Вы пытаетесь взять у строки -1 левый символ - такого не может быть, поэтому возникает ошибка.

Я Вам предлагаю проверить, не пустая ли n_, и убирать последний символ, только в том случае, если длина строки n_>0.

Теперь смотрите, что Вы написали :o :
[vba]
Код
    n_ = Left(n_, Len(n_) - 1)'убираем последний символ
    Range("D11") = n_'выводим строку в D11
    
    If n_ <> "" Then n = Left(n_, Len(n_) - 1)'убираем еще 1 последний символ, если n_ не является пустой
    Range("D11") = n_'выводим в D11
[/vba]
Даже при отсутствии ошибок, у Вас будет неверный результат.

Оставьте только строчки с проверкой.

Автор - Manyasha
Дата добавления - 09.11.2015 в 17:20
Mirabella Дата: Понедельник, 09.11.2015, 18:07 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Manyasha,

Спасибо огромное!

Теперь макрос воообще оставляет ячейку нетронутой, в случае, если все ячейки пустые.
Прописала макрос на очистку перед этим, чтобы затирал старые данные, а то он сохраняет старые, если новые не появились.

Очень очень благодарна за помощь и разъяснения! :)
 
Ответить
СообщениеManyasha,

Спасибо огромное!

Теперь макрос воообще оставляет ячейку нетронутой, в случае, если все ячейки пустые.
Прописала макрос на очистку перед этим, чтобы затирал старые данные, а то он сохраняет старые, если новые не появились.

Очень очень благодарна за помощь и разъяснения! :)

Автор - Mirabella
Дата добавления - 09.11.2015 в 18:07
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Объединение нескольких ячеек в одну с доп условиями (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!