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

Вход

Регистрация

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

 

= Мир MS Excel/Объединение диапазона ячеек построчно с сохранением данных. - Мир MS Excel

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

Excel 2003
Доброго времени суток. Понимаю, что тема избита, но все же... совершенству нет предела... :)))
Подскажите пути оптимизации макроса по объединению диапазона ячеек построчно с сохранением данных.
НУ ПРОСТО ОЧЕНЬ "МЕДЛЕННО" РАБОТАЕТ. (приходится обрабатывать большие массивы данных)
собственно сам макрос:
----------------------
[vba]
Код
Sub skleivanie()

' задаем (выделяем) диапазон
Range("C2:F99").Select

' само объединение
Dim irow As Range, icel As Range, MergeVal As String
Application.DisplayAlerts = False
For Each irow In Selection.Rows
For Each icel In irow.Cells
' тут указываем символ "/" соединения
If icel.Value <> "" Then MergeVal = MergeVal & icel.Value & "/"
Next icel
If MergeVal <> "" Then irow(1).Value = Left(MergeVal, Len(MergeVal) - 1)
MergeVal = ""
irow.Merge
Next irow
Application.DisplayAlerts = True
End Sub
[/vba]
----------------------
[p.s.]
может что-то с цикличностью сделать или как вариант на "С" переписать...
у ПЛЕКСа это в разы быстрее работает :((([/p.s.]


Сообщение отредактировал Serge_007 - Вторник, 11.03.2014, 20:24
 
Ответить
СообщениеДоброго времени суток. Понимаю, что тема избита, но все же... совершенству нет предела... :)))
Подскажите пути оптимизации макроса по объединению диапазона ячеек построчно с сохранением данных.
НУ ПРОСТО ОЧЕНЬ "МЕДЛЕННО" РАБОТАЕТ. (приходится обрабатывать большие массивы данных)
собственно сам макрос:
----------------------
[vba]
Код
Sub skleivanie()

' задаем (выделяем) диапазон
Range("C2:F99").Select

' само объединение
Dim irow As Range, icel As Range, MergeVal As String
Application.DisplayAlerts = False
For Each irow In Selection.Rows
For Each icel In irow.Cells
' тут указываем символ "/" соединения
If icel.Value <> "" Then MergeVal = MergeVal & icel.Value & "/"
Next icel
If MergeVal <> "" Then irow(1).Value = Left(MergeVal, Len(MergeVal) - 1)
MergeVal = ""
irow.Merge
Next irow
Application.DisplayAlerts = True
End Sub
[/vba]
----------------------
[p.s.]
может что-то с цикличностью сделать или как вариант на "С" переписать...
у ПЛЕКСа это в разы быстрее работает :((([/p.s.]

Автор - Posetitel
Дата добавления - 11.03.2014 в 02:11
nilem Дата: Вторник, 11.03.2014, 07:36 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
как вариант (используйте теги "код" - смотрите, как симпатично получается)
[vba]
Код
Sub skleivanie22()
Dim x, i&, j&, s$
With Range("C2:F12")
     x = .Value
     For i = 1 To UBound(x)
         For j = 1 To UBound(x, 2)
             If Len(x(i, j)) Then
                 s = s & "/" & x(i, j): x(i, j) = ""
             End If
         Next j
         x(i, 1) = Mid(s, 2): s = ""
     Next i
     .Value = x
End With
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениекак вариант (используйте теги "код" - смотрите, как симпатично получается)
[vba]
Код
Sub skleivanie22()
Dim x, i&, j&, s$
With Range("C2:F12")
     x = .Value
     For i = 1 To UBound(x)
         For j = 1 To UBound(x, 2)
             If Len(x(i, j)) Then
                 s = s & "/" & x(i, j): x(i, j) = ""
             End If
         Next j
         x(i, 1) = Mid(s, 2): s = ""
     Next i
     .Value = x
End With
End Sub
[/vba]

Автор - nilem
Дата добавления - 11.03.2014 в 07:36
Posetitel Дата: Вторник, 11.03.2014, 15:17 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
nilem, ВАУ!!! ФАНТАСТИКА! Скорость мгновенная! Спасибо!!!
но возник вопрос:
- как объединить содержимое ячеек, если используется не один символ (в данном примере это "/"), а несколько (макрос вставляет знак(и) объединения и перед данными первой ячейки тоже и тут же удаляет его ( |вася|коля| объединяются символами"123", в результате получается |23вася123коля|, надо конечно чтобы было так: |вася123коля| )
и соответственно если объединять без указания символа "", то удаляется первая буква/цифра с данными в первой ячейки т.е. |вася|коля| в результате получается |асяколя|, надо конечно чтобы было так: |васяколя|
вот :((
 
Ответить
Сообщениеnilem, ВАУ!!! ФАНТАСТИКА! Скорость мгновенная! Спасибо!!!
но возник вопрос:
- как объединить содержимое ячеек, если используется не один символ (в данном примере это "/"), а несколько (макрос вставляет знак(и) объединения и перед данными первой ячейки тоже и тут же удаляет его ( |вася|коля| объединяются символами"123", в результате получается |23вася123коля|, надо конечно чтобы было так: |вася123коля| )
и соответственно если объединять без указания символа "", то удаляется первая буква/цифра с данными в первой ячейки т.е. |вася|коля| в результате получается |асяколя|, надо конечно чтобы было так: |васяколя|
вот :((

Автор - Posetitel
Дата добавления - 11.03.2014 в 15:17
nilem Дата: Вторник, 11.03.2014, 15:34 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Ну, тогда покажите примерчик в файле с васями-колями и вариантами объединения, как вы это видите


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеНу, тогда покажите примерчик в файле с васями-колями и вариантами объединения, как вы это видите

Автор - nilem
Дата добавления - 11.03.2014 в 15:34
Posetitel Дата: Вторник, 11.03.2014, 16:15 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
nilem, набросал табличку с данными (в приложенном файле)

P.S.
по моему мой макрос не совсем подходит к задаче, указанной в файле :((
К сообщению приложен файл: skleivanie33_da.xls (26.0 Kb)
 
Ответить
Сообщениеnilem, набросал табличку с данными (в приложенном файле)

P.S.
по моему мой макрос не совсем подходит к задаче, указанной в файле :((

Автор - Posetitel
Дата добавления - 11.03.2014 в 16:15
krosav4ig Дата: Вторник, 11.03.2014, 17:05 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
[vba]
Код
Sub MergeSelection()
     Dim Delim As String
     Dim delim2 As String
     Dim sMergeStr As String
      
     Delim = "!"
     delim2 = "@"
      
     Set rCells = Selection
     With rCells
         For Each rCell In .Cells
             If rCell <> "" Then sMergeStr = sMergeStr & Delim & rCell.Text
         Next rCell
         sMergeStr = Mid(sMergeStr, 1 + Len(Delim))
         sMergeStr = Replace(sMergeStr, Delim, delim2)
         Application.DisplayAlerts = False
         .Merge
         Application.DisplayAlerts = True
         .Item(1).Value = Replace(sMergeStr, sMergeStr, Delim & sMergeStr & Delim)
     End With
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщение[vba]
Код
Sub MergeSelection()
     Dim Delim As String
     Dim delim2 As String
     Dim sMergeStr As String
      
     Delim = "!"
     delim2 = "@"
      
     Set rCells = Selection
     With rCells
         For Each rCell In .Cells
             If rCell <> "" Then sMergeStr = sMergeStr & Delim & rCell.Text
         Next rCell
         sMergeStr = Mid(sMergeStr, 1 + Len(Delim))
         sMergeStr = Replace(sMergeStr, Delim, delim2)
         Application.DisplayAlerts = False
         .Merge
         Application.DisplayAlerts = True
         .Item(1).Value = Replace(sMergeStr, sMergeStr, Delim & sMergeStr & Delim)
     End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 11.03.2014 в 17:05
Posetitel Дата: Вторник, 11.03.2014, 17:55 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
krosav4ig, Спасибо за присоединение к дискуссии, но дело в том, что приведенный Вами макрос объединяет ВЕСЬ диапазон в ОДНУ ячейку (и соответственно все данные агрегируются в этой одной бооольшой ячейке, а тут задача объединЯТЬ диапазон ячеек ПОСТРОЧНО.
вот :((
 
Ответить
Сообщениеkrosav4ig, Спасибо за присоединение к дискуссии, но дело в том, что приведенный Вами макрос объединяет ВЕСЬ диапазон в ОДНУ ячейку (и соответственно все данные агрегируются в этой одной бооольшой ячейке, а тут задача объединЯТЬ диапазон ячеек ПОСТРОЧНО.
вот :((

Автор - Posetitel
Дата добавления - 11.03.2014 в 17:55
RAN Дата: Вторник, 11.03.2014, 19:40 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
http://www.excelworld.ru/forum/3-25-25216-16-1346405481

Встраивайте в свой макрос


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщениеhttp://www.excelworld.ru/forum/3-25-25216-16-1346405481

Встраивайте в свой макрос

Автор - RAN
Дата добавления - 11.03.2014 в 19:40
nilem Дата: Вторник, 11.03.2014, 20:53 | Сообщение № 9
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Posetitel,
вот такой получился "картошка-коля, перец-вася" :)
[vba]
Код
Sub ertert()
Dim x, i&
With Range("A2").CurrentRegion
     x = .Value
     For i = 2 To UBound(x)
         x(i, 2) = x(i, 2) & " " & x(i, 3): x(i, 3) = vbNullString
         x(i, 5) = x(i, 5) & x(i, 6): x(i, 6) = vbNullString
         x(i, 8) = x(i, 8) & "123" & x(i, 9): x(i, 9) = vbNullString
     Next i
     .Value = x
End With
End Sub
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеPosetitel,
вот такой получился "картошка-коля, перец-вася" :)
[vba]
Код
Sub ertert()
Dim x, i&
With Range("A2").CurrentRegion
     x = .Value
     For i = 2 To UBound(x)
         x(i, 2) = x(i, 2) & " " & x(i, 3): x(i, 3) = vbNullString
         x(i, 5) = x(i, 5) & x(i, 6): x(i, 6) = vbNullString
         x(i, 8) = x(i, 8) & "123" & x(i, 9): x(i, 9) = vbNullString
     Next i
     .Value = x
End With
End Sub
[/vba]

Автор - nilem
Дата добавления - 11.03.2014 в 20:53
Posetitel Дата: Вторник, 11.03.2014, 22:43 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
nilem, ФЕНОМЕНАЛЬНО и ГЕНИАЛЬНО!!!
все работает как надо, СПАСИБО!!! Вы ЛУЧШИЙ!!!

P.S.
а можно ли таким методом объединять не 2 столбца, а несколько (ну скажем 3 или 5 столбцов/ячеек)?
если не сложно, черканите, как будет выглядеть эта строчка?
это уже выходит за рамки моей необходимости, но вот что называется "на будущее"...
самостоятельно у меня синтаксически не получилось составить строчку
Ыыы :))))
P.P.S
и подскажите, куда Вам переслать "на шоколадку" :))
 
Ответить
Сообщениеnilem, ФЕНОМЕНАЛЬНО и ГЕНИАЛЬНО!!!
все работает как надо, СПАСИБО!!! Вы ЛУЧШИЙ!!!

P.S.
а можно ли таким методом объединять не 2 столбца, а несколько (ну скажем 3 или 5 столбцов/ячеек)?
если не сложно, черканите, как будет выглядеть эта строчка?
это уже выходит за рамки моей необходимости, но вот что называется "на будущее"...
самостоятельно у меня синтаксически не получилось составить строчку
Ыыы :))))
P.P.S
и подскажите, куда Вам переслать "на шоколадку" :))

Автор - Posetitel
Дата добавления - 11.03.2014 в 22:43
nilem Дата: Среда, 12.03.2014, 07:22 | Сообщение № 11
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Например, во 2-м столбце хотим объединить значения 2-го, 3-го и 4-го столбцов через тильду; меняем эту строку
[vba]
Код
x(i, 2) = x(i, 2) & "~" & x(i, 3) & "~" & x(i, 4)
x(i, 3) = vbNullString: x(i, 4) = vbNullString
[/vba]


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеНапример, во 2-м столбце хотим объединить значения 2-го, 3-го и 4-го столбцов через тильду; меняем эту строку
[vba]
Код
x(i, 2) = x(i, 2) & "~" & x(i, 3) & "~" & x(i, 4)
x(i, 3) = vbNullString: x(i, 4) = vbNullString
[/vba]

Автор - nilem
Дата добавления - 12.03.2014 в 07:22
Posetitel Дата: Среда, 12.03.2014, 14:31 | Сообщение № 12
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 0 ±
Замечаний: 20% ±

Excel 2003
nilem, СУПЕР!!! hands еще раз большое Спасибо!!!
 
Ответить
Сообщениеnilem, СУПЕР!!! hands еще раз большое Спасибо!!!

Автор - Posetitel
Дата добавления - 12.03.2014 в 14:31
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Объединение диапазона ячеек построчно с сохранением данных. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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