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

Вход

Регистрация

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

 

= Мир MS Excel/Перебрать сгруппированные ячейки и разгруппировать их - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Перебрать сгруппированные ячейки и разгруппировать их (Борюсь со "злом"... Настиг затык :))
Перебрать сгруппированные ячейки и разгруппировать их
Alex_ST Дата: Вторник, 30.10.2012, 15:42 | Сообщение № 1
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Народ,
помогите, пожалуйста, "затык настиг" biggrin
Попросили меня написать макрос, который переберёт по очереди все сгруппированные ячейки в выделенном диапазоне и про каждую из них спросить юзверга: "Разргуппировать или нет?"
Написал я с ходу такую фигню:[vba]
Code
Sub FindMergeCells()   '  перебрать все сгруппированные ячейки в выделенном диапазоне и предложить пользователю их разгруппировать
      If TypeName(Selection) <> "Range" Then Exit Sub
      If Selection.Cells.Count <= 1 Then Exit Sub
      Dim rCell As Range
      For Each rCell In Intersect(Selection, ActiveSheet.UsedRange)
         If rCell.MergeCells Then
            rCell.Select
            If MsgBox("Разгруппировать ячейку?", vbYesNo) = vbYes Then rCell.UnMerge
         End If
      Next rCell
End Sub
[/vba]
Когда пользователь соглашается разгруппировать указанную ему сгруппированную ячейку, то всё отлично.
А вот если он откажется, то по очереди перебираются все скрытые под группировкой ячейки и про них задаётся вопрос.
Это, конечно, как борьба со злом с методологической точки зрения правильно: может быть, всё-таки устанет отказываться и согласится разгруппировать... Но по отношению к юзеру как-то не хорошо получается biggrin



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 30.10.2012, 15:49
 
Ответить
СообщениеНарод,
помогите, пожалуйста, "затык настиг" biggrin
Попросили меня написать макрос, который переберёт по очереди все сгруппированные ячейки в выделенном диапазоне и про каждую из них спросить юзверга: "Разргуппировать или нет?"
Написал я с ходу такую фигню:[vba]
Code
Sub FindMergeCells()   '  перебрать все сгруппированные ячейки в выделенном диапазоне и предложить пользователю их разгруппировать
      If TypeName(Selection) <> "Range" Then Exit Sub
      If Selection.Cells.Count <= 1 Then Exit Sub
      Dim rCell As Range
      For Each rCell In Intersect(Selection, ActiveSheet.UsedRange)
         If rCell.MergeCells Then
            rCell.Select
            If MsgBox("Разгруппировать ячейку?", vbYesNo) = vbYes Then rCell.UnMerge
         End If
      Next rCell
End Sub
[/vba]
Когда пользователь соглашается разгруппировать указанную ему сгруппированную ячейку, то всё отлично.
А вот если он откажется, то по очереди перебираются все скрытые под группировкой ячейки и про них задаётся вопрос.
Это, конечно, как борьба со злом с методологической точки зрения правильно: может быть, всё-таки устанет отказываться и согласится разгруппировать... Но по отношению к юзеру как-то не хорошо получается biggrin

Автор - Alex_ST
Дата добавления - 30.10.2012 в 15:42
Формуляр Дата: Вторник, 30.10.2012, 15:58 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Попробуй запоминать MergeArea:
[vba]
Code
    For Each rCell In Intersect(Selection, ActiveSheet.UsedRange)
          If rCell.MergeCells and Intersect(rCell, LastMergeArea) is nothing Then
              set LastMergeArea = rCell.MergeArea
              rCell.Select
              If MsgBox("Разгруппировать ячейку?", vbYesNo) = vbYes Then rCell.UnMerge
          End If
      Next rCell
[/vba]


Excel 2003 EN, 2013 EN
 
Ответить
СообщениеПопробуй запоминать MergeArea:
[vba]
Code
    For Each rCell In Intersect(Selection, ActiveSheet.UsedRange)
          If rCell.MergeCells and Intersect(rCell, LastMergeArea) is nothing Then
              set LastMergeArea = rCell.MergeArea
              rCell.Select
              If MsgBox("Разгруппировать ячейку?", vbYesNo) = vbYes Then rCell.UnMerge
          End If
      Next rCell
[/vba]

Автор - Формуляр
Дата добавления - 30.10.2012 в 15:58
Alex_ST Дата: Вторник, 30.10.2012, 16:08 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Спасибо, Саня.
Я уже и сам до точно такого же решения доковырялся.
Вот только при первом проходе LastMergeArea = Nothing и, естественно, Intersect(rCell, LastMergeArea) даёт ошибку. sad
Я пока сделал тупо: перед циклом назначенил равным первой ячейке выделения:[vba]
Code
Sub FindMergeCells()   ' перебрать все сгруппированные ячейки в выделенном диапазоне и предложить пользователю их разгруппировать
        If TypeName(Selection) <> "Range" Then Exit Sub
        If Selection.Cells.Count <= 1 Then Exit Sub
        Dim rCell As Range, rMergeArea As Range
        Set rMergeArea = Intersect(Selection, ActiveSheet.UsedRange)(1)
        For Each rCell In Intersect(Selection, ActiveSheet.UsedRange)
           If rCell.MergeCells And Intersect(rCell, rMergeArea) Is Nothing Then
              Set rMergeArea = rCell.MergeArea
              rCell.Select
              If MsgBox("Разгруппировать ячейку?", vbYesNo) = vbYes Then rCell.UnMerge
           End If
        Next rCell
End Sub
[/vba] Но не красиво получается. Хоть и работает, но мне не нравится



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 30.10.2012, 16:10
 
Ответить
СообщениеСпасибо, Саня.
Я уже и сам до точно такого же решения доковырялся.
Вот только при первом проходе LastMergeArea = Nothing и, естественно, Intersect(rCell, LastMergeArea) даёт ошибку. sad
Я пока сделал тупо: перед циклом назначенил равным первой ячейке выделения:[vba]
Code
Sub FindMergeCells()   ' перебрать все сгруппированные ячейки в выделенном диапазоне и предложить пользователю их разгруппировать
        If TypeName(Selection) <> "Range" Then Exit Sub
        If Selection.Cells.Count <= 1 Then Exit Sub
        Dim rCell As Range, rMergeArea As Range
        Set rMergeArea = Intersect(Selection, ActiveSheet.UsedRange)(1)
        For Each rCell In Intersect(Selection, ActiveSheet.UsedRange)
           If rCell.MergeCells And Intersect(rCell, rMergeArea) Is Nothing Then
              Set rMergeArea = rCell.MergeArea
              rCell.Select
              If MsgBox("Разгруппировать ячейку?", vbYesNo) = vbYes Then rCell.UnMerge
           End If
        Next rCell
End Sub
[/vba] Но не красиво получается. Хоть и работает, но мне не нравится

Автор - Alex_ST
Дата добавления - 30.10.2012 в 16:08
Формуляр Дата: Вторник, 30.10.2012, 16:43 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
Ну, с этим сложно бороться, разве что упростить исходную установку:
[vba]
Code
       Set rMergeArea = [A1]
[/vba]
Кстати, для эстетов smile , вместо
[vba]
Code
If TypeName(Selection) <> "Range" Then Exit Sub
[/vba]красивше
[vba]
Code
If not TypeOf Selection Is Range Then Exit Sub
[/vba]


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Вторник, 30.10.2012, 16:45
 
Ответить
СообщениеНу, с этим сложно бороться, разве что упростить исходную установку:
[vba]
Code
       Set rMergeArea = [A1]
[/vba]
Кстати, для эстетов smile , вместо
[vba]
Code
If TypeName(Selection) <> "Range" Then Exit Sub
[/vba]красивше
[vba]
Code
If not TypeOf Selection Is Range Then Exit Sub
[/vba]

Автор - Формуляр
Дата добавления - 30.10.2012 в 16:43
Alex_ST Дата: Вторник, 30.10.2012, 16:59 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну, на вкус и цвет все фломастеры разные.
И по мне так красивше всё-таки [vba]
Code
If TypeName(Selection) <> "Range" Then Exit Sub
[/vba], тем более, что по количеству буковок почти однофигственно (у меня на 1 больше) tongue
-----------------
А по поводу [A1], так я, действительно перемудрил.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 30.10.2012, 17:06
 
Ответить
СообщениеНу, на вкус и цвет все фломастеры разные.
И по мне так красивше всё-таки [vba]
Code
If TypeName(Selection) <> "Range" Then Exit Sub
[/vba], тем более, что по количеству буковок почти однофигственно (у меня на 1 больше) tongue
-----------------
А по поводу [A1], так я, действительно перемудрил.

Автор - Alex_ST
Дата добавления - 30.10.2012 в 16:59
Alex_ST Дата: Вторник, 30.10.2012, 20:29 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Фигня какая-то получается: почему-то при отказе от разъединения ячеек выбор несколько раз прыгает с одной объединённой ячейки на другую.
При этом, похоже, правильно или нет срабатывает зависит от расположения на листе ячеек, попавших в Selection questionmark questionmark questionmark

Тестаните кто-нибудь примерчик, пожалуйста.
К сообщению приложен файл: FindMergeCells.xls (28.0 Kb)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеФигня какая-то получается: почему-то при отказе от разъединения ячеек выбор несколько раз прыгает с одной объединённой ячейки на другую.
При этом, похоже, правильно или нет срабатывает зависит от расположения на листе ячеек, попавших в Selection questionmark questionmark questionmark

Тестаните кто-нибудь примерчик, пожалуйста.

Автор - Alex_ST
Дата добавления - 30.10.2012 в 20:29
KuklP Дата: Вторник, 30.10.2012, 20:52 | Сообщение № 7
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Нормально работает. Леш, я тут писал для unmerge однострочных ОЯ и выравнивания по центру выделения. Можно легко переделать:)
[vba]
Code
Public Sub UnMergeCells()
     Dim c As Range, s$, fA$
     Application.FindFormat.MergeCells = True
     With ActiveSheet.UsedRange
         Set c = .Find("", [a1], xlFormulas, 2, SearchFormat:=True)
         If Not c Is Nothing Then
             fA = c.Address: Do
                 If UBound(c.MergeArea.Formula) = 1 Then
                     s = c.MergeArea.Address: c.UnMerge
                     Range(s).HorizontalAlignment = 7
                 End If
                 Set c = .Find("", c, xlFormulas, 2, SearchFormat:=True)
             Loop While Not c Is Nothing And c.Address <> fA
         End If
     End With
End Sub
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеНормально работает. Леш, я тут писал для unmerge однострочных ОЯ и выравнивания по центру выделения. Можно легко переделать:)
[vba]
Code
Public Sub UnMergeCells()
     Dim c As Range, s$, fA$
     Application.FindFormat.MergeCells = True
     With ActiveSheet.UsedRange
         Set c = .Find("", [a1], xlFormulas, 2, SearchFormat:=True)
         If Not c Is Nothing Then
             fA = c.Address: Do
                 If UBound(c.MergeArea.Formula) = 1 Then
                     s = c.MergeArea.Address: c.UnMerge
                     Range(s).HorizontalAlignment = 7
                 End If
                 Set c = .Find("", c, xlFormulas, 2, SearchFormat:=True)
             Loop While Not c Is Nothing And c.Address <> fA
         End If
     End With
End Sub
[/vba]

Автор - KuklP
Дата добавления - 30.10.2012 в 20:52
Pelena Дата: Вторник, 30.10.2012, 20:57 | Сообщение № 8
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
У меня начинает перепрыгивать, если выделены розовый и зеленый диапазон. У них есть общие (сквозные) строки


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеУ меня начинает перепрыгивать, если выделены розовый и зеленый диапазон. У них есть общие (сквозные) строки

Автор - Pelena
Дата добавления - 30.10.2012 в 20:57
Alex_ST Дата: Вторник, 30.10.2012, 20:57 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Привет, Серёга.
У тебя мой пример после выбора всего листа нормально работает? И по несколько раз одну и ту же ячейку не предлагает разгруппировать если всё время отказываться?
Я в шоке!
А по поводу [vba]
Code
Application.FindFormat.MergeCells
[/vba] так ты это круто сделал. Нужно будет попробовать разобраться (просто я с методами Find не очень дружу biggrin )



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 30.10.2012, 21:00
 
Ответить
СообщениеПривет, Серёга.
У тебя мой пример после выбора всего листа нормально работает? И по несколько раз одну и ту же ячейку не предлагает разгруппировать если всё время отказываться?
Я в шоке!
А по поводу [vba]
Code
Application.FindFormat.MergeCells
[/vba] так ты это круто сделал. Нужно будет попробовать разобраться (просто я с методами Find не очень дружу biggrin )

Автор - Alex_ST
Дата добавления - 30.10.2012 в 20:57
KuklP Дата: Вторник, 30.10.2012, 21:19 | Сообщение № 10
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Ну да, топчется по двум, сиреневой и зеленой. Дык, переделай через find. Все лучше, чем все ячейки перебирать:-)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеНу да, топчется по двум, сиреневой и зеленой. Дык, переделай через find. Все лучше, чем все ячейки перебирать:-)

Автор - KuklP
Дата добавления - 30.10.2012 в 21:19
Alex_ST Дата: Вторник, 30.10.2012, 21:24 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Лена, абсолютно точно найдена закономерность! Браво!
Если объединённые ячейки имеют общие строки, то глючит.
А если нет, то всё нормально!
Вот теперь бы понять, где тут собака порылась?

А по поводу метода Find,Серёга, так я с ним обязательно поразбираюсь завтра.
Да и я не думаю, что перебор ячеек без селекта так уж долог если учесть, что ячейки объединяются пользователем в ручную и потому их не может быть огромное число.
Но хочется понять почему мой метод глючит (ну просто для эрудиции в конце-концов).



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 30.10.2012, 21:25
 
Ответить
СообщениеЛена, абсолютно точно найдена закономерность! Браво!
Если объединённые ячейки имеют общие строки, то глючит.
А если нет, то всё нормально!
Вот теперь бы понять, где тут собака порылась?

А по поводу метода Find,Серёга, так я с ним обязательно поразбираюсь завтра.
Да и я не думаю, что перебор ячеек без селекта так уж долог если учесть, что ячейки объединяются пользователем в ручную и потому их не может быть огромное число.
Но хочется понять почему мой метод глючит (ну просто для эрудиции в конце-концов).

Автор - Alex_ST
Дата добавления - 30.10.2012 в 21:24
SM Дата: Вторник, 30.10.2012, 22:10 | Сообщение № 12
Группа: Друзья
Ранг: Участник
Сообщений: 64
Репутация: 59 ±
Замечаний: 0% ±

2003
Вариант:
[vba]
Code
Sub UnMergeInRangeSelection()
     Dim MAreas As New Collection
     Dim SRng As Range, Cell As Range
     '
     On Error Resume Next
     Set SRng = Selection
     If SRng Is Nothing Then
         Err.Clear
         Exit Sub
     End If
     Set SRng = Intersect(SRng, ActiveSheet.UsedRange)
     For Each Cell In SRng
         If Cell.MergeCells Then MAreas.Add Cell.MergeArea, Cell.MergeArea.Address
     Next
     On Error GoTo 0
     If MAreas.Count > 0 Then
         For Each Cell In MAreas
             Cell.Select
             If MsgBox(Cell.Address, vbYesNo + vbDefaultButton2, "Разъединить ?") = vbYes Then Cell.UnMerge
         Next
     Else
         MsgBox "В выбранном диапазоне нет объединенных ячеек.", , ""
     End If
End Sub
[/vba]


Excel изощрён, но не злонамерен
 
Ответить
СообщениеВариант:
[vba]
Code
Sub UnMergeInRangeSelection()
     Dim MAreas As New Collection
     Dim SRng As Range, Cell As Range
     '
     On Error Resume Next
     Set SRng = Selection
     If SRng Is Nothing Then
         Err.Clear
         Exit Sub
     End If
     Set SRng = Intersect(SRng, ActiveSheet.UsedRange)
     For Each Cell In SRng
         If Cell.MergeCells Then MAreas.Add Cell.MergeArea, Cell.MergeArea.Address
     Next
     On Error GoTo 0
     If MAreas.Count > 0 Then
         For Each Cell In MAreas
             Cell.Select
             If MsgBox(Cell.Address, vbYesNo + vbDefaultButton2, "Разъединить ?") = vbYes Then Cell.UnMerge
         Next
     Else
         MsgBox "В выбранном диапазоне нет объединенных ячеек.", , ""
     End If
End Sub
[/vba]

Автор - SM
Дата добавления - 30.10.2012 в 22:10
Alex_ST Дата: Вторник, 30.10.2012, 22:15 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну, с коллекциями, ИМХО, это Вы зря. Может и будет работать (пока не проверял и не разбирался), но не слишком ли для такой простой операции?



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеНу, с коллекциями, ИМХО, это Вы зря. Может и будет работать (пока не проверял и не разбирался), но не слишком ли для такой простой операции?

Автор - Alex_ST
Дата добавления - 30.10.2012 в 22:15
KuklP Дата: Вторник, 30.10.2012, 22:20 | Сообщение № 14
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Чего это? Очень хорошее решение. И гарантированно не будет скакать по одним ячейкам:) Только я бы все равно убрал проверку ВСЕХ ячеек.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеЧего это? Очень хорошее решение. И гарантированно не будет скакать по одним ячейкам:) Только я бы все равно убрал проверку ВСЕХ ячеек.

Автор - KuklP
Дата добавления - 30.10.2012 в 22:20
nerv Дата: Среда, 31.10.2012, 00:00 | Сообщение № 15
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

[vba]
Code
Sub UnMerge()
     Dim area As Range
     Dim cell As Range
      
     If Not TypeOf Selection Is Range Then Exit Sub
      
     For Each area In Intersect(Selection, ActiveSheet.UsedRange).areas
         For Each cell In area
             If cell.MergeCells And cell.Address = cell.MergeArea.Cells(1).Address Then
                 If MsgBox(cell.Address, vbYesNo + vbDefaultButton2, "Unmerge?") = vbYes Then
                     cell.UnMerge
                 End If
             End If
         Next
     Next
End Sub
[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение[vba]
Code
Sub UnMerge()
     Dim area As Range
     Dim cell As Range
      
     If Not TypeOf Selection Is Range Then Exit Sub
      
     For Each area In Intersect(Selection, ActiveSheet.UsedRange).areas
         For Each cell In area
             If cell.MergeCells And cell.Address = cell.MergeArea.Cells(1).Address Then
                 If MsgBox(cell.Address, vbYesNo + vbDefaultButton2, "Unmerge?") = vbYes Then
                     cell.UnMerge
                 End If
             End If
         Next
     Next
End Sub
[/vba]

Автор - nerv
Дата добавления - 31.10.2012 в 00:00
Alex_ST Дата: Среда, 31.10.2012, 08:34 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Вот честно говорю: утром по пути на работу так и подумал, что дело скорее всего в Areas и нужно будет делать двойной цикл!
Спасибо, nerv, сейчас попробую.
(только, естественно, в соответствии с рекомендациями классиков, не буду использовать имён процедур и переменных, совпадающих с названиями свойств и методов объектов VBA biggrin )



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеВот честно говорю: утром по пути на работу так и подумал, что дело скорее всего в Areas и нужно будет делать двойной цикл!
Спасибо, nerv, сейчас попробую.
(только, естественно, в соответствии с рекомендациями классиков, не буду использовать имён процедур и переменных, совпадающих с названиями свойств и методов объектов VBA biggrin )

Автор - Alex_ST
Дата добавления - 31.10.2012 в 08:34
Alex_ST Дата: Среда, 31.10.2012, 11:00 | Сообщение № 17
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Полирнул вариант с Areas.
Теперь всё нормально работает[vba]
Code
Sub FindMergeCells()   ' перебрать все объединённые ячейки в выделенном диапазоне и предложить пользователю их разгруппировать
    If Not TypeOf Selection Is Range Then Exit Sub
    If Intersect(Selection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub
    Dim rArea As Range, rCell As Range
    Dim rSel As Range: Set rSel = Selection   'только для того, чтобы можно было восстановить Selection после обработки
    For Each rArea In Intersect(Selection, ActiveSheet.UsedRange).Areas
       For Each rCell In rArea
          If rCell.MergeCells And rCell.Address = rCell.MergeArea.Cells(1).Address Then
             rCell.Select
             If MsgBox("Разгруппировать ячейку " & rCell.Address(0, 0) & " ?", vbYesNo + vbQuestion, "Найдена объединённая ячейка") = vbYes Then rCell.UnMerge
          End If
       Next rCell
    Next rArea
    rSel.Select   ' восстановить Selection после обработки
End Sub
[/vba]
одно маленькое неудобство: при выделении столбца не обрабатываются объединённые ячейки, левая верхняя ячейка которых не входит в выделение (см.пример)
К сообщению приложен файл: 9689976.xls (41.0 Kb)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеПолирнул вариант с Areas.
Теперь всё нормально работает[vba]
Code
Sub FindMergeCells()   ' перебрать все объединённые ячейки в выделенном диапазоне и предложить пользователю их разгруппировать
    If Not TypeOf Selection Is Range Then Exit Sub
    If Intersect(Selection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub
    Dim rArea As Range, rCell As Range
    Dim rSel As Range: Set rSel = Selection   'только для того, чтобы можно было восстановить Selection после обработки
    For Each rArea In Intersect(Selection, ActiveSheet.UsedRange).Areas
       For Each rCell In rArea
          If rCell.MergeCells And rCell.Address = rCell.MergeArea.Cells(1).Address Then
             rCell.Select
             If MsgBox("Разгруппировать ячейку " & rCell.Address(0, 0) & " ?", vbYesNo + vbQuestion, "Найдена объединённая ячейка") = vbYes Then rCell.UnMerge
          End If
       Next rCell
    Next rArea
    rSel.Select   ' восстановить Selection после обработки
End Sub
[/vba]
одно маленькое неудобство: при выделении столбца не обрабатываются объединённые ячейки, левая верхняя ячейка которых не входит в выделение (см.пример)

Автор - Alex_ST
Дата добавления - 31.10.2012 в 11:00
nerv Дата: Среда, 31.10.2012, 15:41 | Сообщение № 18
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

всем привет

Quote (Формуляр)
Кстати, для эстетов , вместо
If TypeName(Selection) <> "Range" Then Exit Sub
красивше
If not TypeOf Selection Is Range Then Exit Sub

никаких "красивше". Так правильно. Потому, что в данном случае нужно проверить тип объекта, а не получить название типа.


Quote (Alex_ST)
что дело скорее всего в Areas и нужно будет делать двойной цикл!

Areas тут не при чем. Это на случай выделения несмежных диапазонов.


Quote (Alex_ST)
(только, естественно, в соответствии с рекомендациями классиков, не буду использовать имён процедур и переменных, совпадающих с названиями свойств и методов объектов VBA

глупости. Если имя не совпадает с глобальным и соответствует правилам наименования, его можно использовать. Т.к. то, что скрыто внутри объекта, там и останется. Зато читаемость твоего кода заметно ухудшилась. Впрочем, даже если имя совпадает с глобальным, его тоже можно использовать, но в этом случае оно (глобальное) будет перекрыто локальным:
[vba]
Code
Sub io()
      Dim Range As Range
      Range("A1").Select       ' err: локальное имя перекрыло глобальное
End Sub
[/vba]
Жду ваши возражения.


Еще. Alex_ST, ты специально делаешь свой код не читаемым? Зачем лепить все в кучу? Если очень хочется, можно воспользоваться минификатором или обсфукатором.


Quote (Alex_ST)
If Intersect(Selection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub

Нафиг не надо, т.к. в первый цикл по областям уже включена эта проверка.


КЭП: дело в
[vba]
Code
cell.Address = cell.MergeArea.Cells(1).Address
[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Среда, 31.10.2012, 15:48
 
Ответить
Сообщениевсем привет

Quote (Формуляр)
Кстати, для эстетов , вместо
If TypeName(Selection) <> "Range" Then Exit Sub
красивше
If not TypeOf Selection Is Range Then Exit Sub

никаких "красивше". Так правильно. Потому, что в данном случае нужно проверить тип объекта, а не получить название типа.


Quote (Alex_ST)
что дело скорее всего в Areas и нужно будет делать двойной цикл!

Areas тут не при чем. Это на случай выделения несмежных диапазонов.


Quote (Alex_ST)
(только, естественно, в соответствии с рекомендациями классиков, не буду использовать имён процедур и переменных, совпадающих с названиями свойств и методов объектов VBA

глупости. Если имя не совпадает с глобальным и соответствует правилам наименования, его можно использовать. Т.к. то, что скрыто внутри объекта, там и останется. Зато читаемость твоего кода заметно ухудшилась. Впрочем, даже если имя совпадает с глобальным, его тоже можно использовать, но в этом случае оно (глобальное) будет перекрыто локальным:
[vba]
Code
Sub io()
      Dim Range As Range
      Range("A1").Select       ' err: локальное имя перекрыло глобальное
End Sub
[/vba]
Жду ваши возражения.


Еще. Alex_ST, ты специально делаешь свой код не читаемым? Зачем лепить все в кучу? Если очень хочется, можно воспользоваться минификатором или обсфукатором.


Quote (Alex_ST)
If Intersect(Selection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub

Нафиг не надо, т.к. в первый цикл по областям уже включена эта проверка.


КЭП: дело в
[vba]
Code
cell.Address = cell.MergeArea.Cells(1).Address
[/vba]

Автор - nerv
Дата добавления - 31.10.2012 в 15:41
Alex_ST Дата: Среда, 31.10.2012, 16:21 | Сообщение № 19
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Quote (nerv)
Alex_ST, ты специально делаешь свой код не читаемым?
nerv, ты первый, кто назвал мой код не читаемым. Может, не в коде дело, а в том, кто его читает? biggrin
Quote (nerv)
Нафиг не надо
Если бы было не надо, то я бы и не ставил.
Попробуй в своём коде выделить на листе диапазон, лежащий вне UsedRange и запусти свой макрос. Вылетишь в дебаггер.
Quote (nerv)
Areas тут не при чем
тут согласен. Просто сравнивать адреса я пробовал изначально, но вместо [vba]
Code
rCell.Address = rCell.MergeArea.Cells(1).Address
[/vba]писАл[vba]
Code
rCell.Address = rCell.Cells(1).Address
[/vba] вот и глючило.
.
.
А вообще-то, смени тон, пожалуйста.
Мы с тобой не близкие друзья и в пивняке общаемся.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Среда, 31.10.2012, 17:01
 
Ответить
Сообщение
Quote (nerv)
Alex_ST, ты специально делаешь свой код не читаемым?
nerv, ты первый, кто назвал мой код не читаемым. Может, не в коде дело, а в том, кто его читает? biggrin
Quote (nerv)
Нафиг не надо
Если бы было не надо, то я бы и не ставил.
Попробуй в своём коде выделить на листе диапазон, лежащий вне UsedRange и запусти свой макрос. Вылетишь в дебаггер.
Quote (nerv)
Areas тут не при чем
тут согласен. Просто сравнивать адреса я пробовал изначально, но вместо [vba]
Code
rCell.Address = rCell.MergeArea.Cells(1).Address
[/vba]писАл[vba]
Code
rCell.Address = rCell.Cells(1).Address
[/vba] вот и глючило.
.
.
А вообще-то, смени тон, пожалуйста.
Мы с тобой не близкие друзья и в пивняке общаемся.

Автор - Alex_ST
Дата добавления - 31.10.2012 в 16:21
nerv Дата: Среда, 31.10.2012, 16:47 | Сообщение № 20
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Quote (Alex_ST)
Если бы было не надо, то я бы и не ставил. Попробуй в своём коде выделить на листе диапазон, лежащий вне UsedRange и запусти свой макрос. Вылетишь в дебаггер.

был не прав


Quote (Alex_ST)
однако, без перебора по ним почему-то глючит при перекрытии по строкам

все нормально, можешь проверить


Quote (Alex_ST)
И вообще, смени тон, пожалуйста.

сори Я еще не обедал. А когда я голодный, я злой pirate


Quote (Alex_ST)
и в пивняке общаемся

ну, для привняка то как раз нормально biggrin


по задаче: только собирать в массив/коллекцию и проверять


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Среда, 31.10.2012, 16:52
 
Ответить
Сообщение
Quote (Alex_ST)
Если бы было не надо, то я бы и не ставил. Попробуй в своём коде выделить на листе диапазон, лежащий вне UsedRange и запусти свой макрос. Вылетишь в дебаггер.

был не прав


Quote (Alex_ST)
однако, без перебора по ним почему-то глючит при перекрытии по строкам

все нормально, можешь проверить


Quote (Alex_ST)
И вообще, смени тон, пожалуйста.

сори Я еще не обедал. А когда я голодный, я злой pirate


Quote (Alex_ST)
и в пивняке общаемся

ну, для привняка то как раз нормально biggrin


по задаче: только собирать в массив/коллекцию и проверять

Автор - nerv
Дата добавления - 31.10.2012 в 16:47
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Перебрать сгруппированные ячейки и разгруппировать их (Борюсь со "злом"... Настиг затык :))
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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