Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2016, 15:06   #1
Trimbl
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 135
По умолчанию Цикл для объединения

Здравствуйте уважаемые!
Для объединения ячеек в двух столбцах применяю вот такой макрос:
Код:
Option Explicit

Sub MergeCells() ' Макрос объединения
  Dim r As Long, rc As Long
  r = 17
  Do While Not IsEmpty(Range("B17:C17"))
    rc = WorksheetFunction.CountIfs(Columns(2), Cells(r, 2), Columns(3), Cells(r, 3))
    'rc = WorksheetFunction.CountIfs(Columns(2), "<> ", Columns(3), "<> ")
    Application.DisplayAlerts = False
    If rc > 1 Then Cells(r, 2).Resize(rc, 1).MergeCells = True: Cells(r, 3).Resize(rc, 1).MergeCells = True
    Application.DisplayAlerts = True
    r = r + rc
Loop
End Sub
Объединяет не корректно, да еще и зависает(зацикливается).
Может быть подскажите - чего ему не хватает.
Благодарю за внимание.
Вложения
Тип файла: rar Пример.rar (11.1 Кб, 13 просмотров)
Trimbl вне форума Ответить с цитированием
Старый 18.03.2016, 15:39   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub MergeCells() 
  Dim r2 As Long, rc2 As Long, r3 As Long, rc3 As Long
  r2 = 17
  Do While Not IsEmpty(Cells(r2, 2))
    rc2 = WorksheetFunction.CountIf(Columns(2), Cells(r2, 2))
    Application.DisplayAlerts = False
    If rc2 > 1 Then Cells(r2, 2).Resize(rc2, 1).MergeCells = True
    r3 = r2
    Do While r3 < r2 + rc2
      rc3 = WorksheetFunction.CountIf(Columns(3), Cells(r3, 3))
      If rc3 > 1 Then Cells(r3, 3).Resize(rc3, 1).MergeCells = True
      r3 = r3 + rc3
    Loop
    Application.DisplayAlerts = True
    r2 = r2 + rc2
  Loop
End Sub
Цитата:
Объединяет не корректно
если есть техника разных типов одного производителя - будет работать неправильно! (в колонке С такого наобьединяет!!!) если данные не отсортированы - будет ВСЕ не правильно обьеденено
Цитата:
да еще и зависает(зацикливается)
как написано - так и работает
Цитата:
Может быть подскажите - чего ему не хватает
программиста
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 18.03.2016, 18:31   #3
Trimbl
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 135
По умолчанию

Про программиста я знал изначально, но благо, что существует такой форум и в частности такие отзывчивые люди как Вы Игорь.
Спасибо.
Trimbl вне форума Ответить с цитированием
Старый 05.05.2016, 12:21   #4
Trimbl
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 135
По умолчанию

IgorGO, опять без программиста - и ни туды и ни сюды. Не могу допетрить как в Ваш код воткнуть условие когда rc2=WorksheetFunction.CountIf(Colum ns(2), Cells(r2, 2))=1 (и аналогично rc3=1), а такое оказывается случается и тогда цикл обрывается. т.е вопрос - как организовать проверку If rc2 <> 1 и соответственно If rc3 <> 1, или это не возможно(недопустимо)? Кажется пересмотрел все, но ничего подобного не увидел или не нашел.
Trimbl вне форума Ответить с цитированием
Старый 05.05.2016, 13:02   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

не совсем понимаю о чем речь, но...
сортируете данные по колонке 2 потом по 3
используете этот
Код:
Sub MergeCells()
  Dim r2 As Long, rc2 As Long, r3 As Long, rc3 As Long
  r2 = 17
  Do While Not IsEmpty(Cells(r2, 2))
    rc2 = WorksheetFunction.CountIf(Columns(2), Cells(r2, 2))
    Application.DisplayAlerts = False
    If rc2 > 1 Then Cells(r2, 2).Resize(rc2, 1).MergeCells = True
    r3 = r2
    Do While r3 < r2 + rc2
      rc3 = WorksheetFunction.CountIf(Range(r2, 3).Resize(rc2, 1), Cells(r3, 3))
      If rc3 > 1 Then Cells(r3, 3).Resize(rc3, 1).MergeCells = True
      r3 = r3 + rc3
    Loop
    Application.DisplayAlerts = True
    r2 = r2 + rc2
  Loop
End Sub
без каких-либо ограничений
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 05.05.2016, 14:20   #6
Trimbl
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 135
По умолчанию

Иногда отсортированная колона имеет примерно такой вид:
Экскаватор
Экскаватор
Экскаватор
Бульдозер
Погрузчик
Погрузчик
Погрузчик

т.е когда в колонке встречается всего одна одноименная ячейка, в нашем случае - Бульдозер, вот на нем(Бульдозере) код и спотыкается. Как проскочить эту одну ячейку, где и объединять-то нечего.
И еще объясните пожалуйста предусловие -Do While r3 < r2 + rc2, в моем понимании r3 всегда будет меньше r2 + rc2
Trimbl вне форума Ответить с цитированием
Старый 05.05.2016, 14:52   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

ладно, а такой
Код:
Sub MergeCells()
  Dim r2 As Long, rc2 As Long, r3 As Long, rc3 As Long
  r2 = 17
  Do While Not IsEmpty(Cells(r2, 2))
    rc2 = WorksheetFunction.CountIf(Columns(2), Cells(r2, 2))
    Application.DisplayAlerts = False
    If rc2 > 1 Then
      Cells(r2, 2).Resize(rc2, 1).MergeCells = True
      r3 = r2
      Do While r3 < r2 + rc2
        rc3 = WorksheetFunction.CountIf(Cells(r2, 3).Resize(rc2, 1), Cells(r3, 3))
        If rc3 > 1 Then Cells(r3, 3).Resize(rc3, 1).MergeCells = True
        r3 = r3 + rc3
      Loop
    End If
    Application.DisplayAlerts = True
    r2 = r2 + rc2
  Loop
End Sub
работал бы и предыдущий только вместо
Код:
rc3 = WorksheetFunction.CountIf(Range(r2, 3).Resize(rc2, 1), Cells(r3, 3))
написать
rc3 = WorksheetFunction.CountIf(Cells(r2, 3).Resize(rc2, 1), Cells(r3, 3))
я опечатку сделал(((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 05.05.2016 в 14:57.
IgorGO вне форума Ответить с цитированием
Старый 05.05.2016, 15:39   #8
Trimbl
Форумчанин
 
Регистрация: 11.08.2009
Сообщений: 135
По умолчанию

Благодарю.
С -Do While r3 < r2 + rc2 разобрался, - по горячке сам зациклися
Trimbl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для объединения ячеек Excel wadzik Microsoft Office Excel 12 24.10.2017 21:32
Макрос для объединения ячеек в Excel Vadim Lisovec Microsoft Office Excel 28 21.08.2013 12:53
макрос для объединения ячеек BAP9IT Microsoft Office Word 2 15.11.2012 19:43
Макрос для объединения одинаковых ячеек Internal2 Microsoft Office Excel 2 05.11.2009 14:00