в продолжение коллекционирования - словаризация [vba]
Code
Sub ert() Dim r As Range, adr$, s$ With CreateObject("Scripting.Dictionary") For Each r In Intersect(Selection, ActiveSheet.UsedRange) If r.MergeCells Then adr = r.MergeArea.Address If Not .Exists(adr) Then .Item(adr) = 1: s = s & "," & adr End If Next End With: If s = vbNullString Then Exit Sub For Each r In Range(Mid(s, 2)).Areas r.Select If MsgBox("Разгруппировать ячейку " & r.Address(0, 0) & " ?", 36, _ "Найдена объединённая ячейка") = vbYes Then r.UnMerge Next r End Sub
[/vba]
в продолжение коллекционирования - словаризация [vba]
Code
Sub ert() Dim r As Range, adr$, s$ With CreateObject("Scripting.Dictionary") For Each r In Intersect(Selection, ActiveSheet.UsedRange) If r.MergeCells Then adr = r.MergeArea.Address If Not .Exists(adr) Then .Item(adr) = 1: s = s & "," & adr End If Next End With: If s = vbNullString Then Exit Sub For Each r In Range(Mid(s, 2)).Areas r.Select If MsgBox("Разгруппировать ячейку " & r.Address(0, 0) & " ?", 36, _ "Найдена объединённая ячейка") = vbYes Then r.UnMerge Next r End Sub
Николай, словари - мои любимые объекты. Собирался сегодня вечером-завтра утром попробовать их присобачить... А тут ты раньше меня успел Но всё равно свой вариант сделаю (я предпочитаю, например, неявное добавление в словарь без использования .Exists )
Николай, словари - мои любимые объекты. Собирался сегодня вечером-завтра утром попробовать их присобачить... А тут ты раньше меня успел Но всё равно свой вариант сделаю (я предпочитаю, например, неявное добавление в словарь без использования .Exists )Alex_ST
Sub UnMerge() Dim area As Range Dim cell As Range Dim usedRange As Range Dim cellAddress As String Dim mergeCells As New Collection
Set usedRange = Intersect(ActiveWindow.RangeSelection, ActiveSheet.usedRange) If usedRange Is Nothing Then Exit Sub
For Each area In usedRange.Areas For Each cell In area If cell.mergeCells Then cellAddress = cell.MergeArea.Cells(1).address If Not InCollection(mergeCells, cellAddress) Then If MsgBox(cell.address, vbYesNo + vbDefaultButton2, "Unmerge?") = vbYes Then cell.UnMerge Else mergeCells.Add cellAddress, cellAddress End If End If End If Next Next End Sub
Private Function InCollection(ByRef col As Collection, _ ByRef address As String) As Boolean On Error Resume Next InCollection = Not IsEmpty(col.Item(address)) End Function
[/vba]
до кучи [vba]
Code
Sub UnMerge() Dim area As Range Dim cell As Range Dim usedRange As Range Dim cellAddress As String Dim mergeCells As New Collection
Set usedRange = Intersect(ActiveWindow.RangeSelection, ActiveSheet.usedRange) If usedRange Is Nothing Then Exit Sub
For Each area In usedRange.Areas For Each cell In area If cell.mergeCells Then cellAddress = cell.MergeArea.Cells(1).address If Not InCollection(mergeCells, cellAddress) Then If MsgBox(cell.address, vbYesNo + vbDefaultButton2, "Unmerge?") = vbYes Then cell.UnMerge Else mergeCells.Add cellAddress, cellAddress End If End If End If Next Next End Sub
Private Function InCollection(ByRef col As Collection, _ ByRef address As String) As Boolean On Error Resume Next InCollection = Not IsEmpty(col.Item(address)) End Function
Упс! Совсем забыл про то, что хотел доделать этот макрос Сейчас за обеденным бутербродом случайно наткнулся у себя в макросах и подпилил. В самом деле, пришлось использовать словари чтобы запомнить все объединённые ячейки, попадающие в выделение и избежать повторов.
[vba]
Code
Sub FindMergeCells() ' перебрать все объединённые ячейки в выделенном диапазоне и предложить пользователю их разгруппировать If Not TypeOf Selection Is Range Then Exit Sub If Intersect(Selection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub Dim rCell As Range, i&, Arr() With CreateObject("Scripting.Dictionary") For Each rCell In Intersect(Selection, ActiveSheet.UsedRange) ' собираем уникальные адреса объединённых ячеек в словарь If rCell.MergeCells Then .Item(rCell.MergeArea.Address(0, 0)) = 0& Next rCell If .Count = 0 Then MsgBox "Объединённых ячеек в выделенном диапазоне не найдено": Exit Sub Arr = .Keys ' из массива .Keys читать поэлементно нельзя For i = 0 To .Count - 1 ActiveSheet.Range(Arr(i)).Select If MsgBox("Разгруппировать ячейку [" & Arr(i) & "] ?", vbYesNo + vbQuestion, "Найдена объединённая ячейка") = vbYes Then Selection.UnMerge Next i End With End Sub
[/vba]
Упс! Совсем забыл про то, что хотел доделать этот макрос Сейчас за обеденным бутербродом случайно наткнулся у себя в макросах и подпилил. В самом деле, пришлось использовать словари чтобы запомнить все объединённые ячейки, попадающие в выделение и избежать повторов.
[vba]
Code
Sub FindMergeCells() ' перебрать все объединённые ячейки в выделенном диапазоне и предложить пользователю их разгруппировать If Not TypeOf Selection Is Range Then Exit Sub If Intersect(Selection, ActiveSheet.UsedRange) Is Nothing Then Exit Sub Dim rCell As Range, i&, Arr() With CreateObject("Scripting.Dictionary") For Each rCell In Intersect(Selection, ActiveSheet.UsedRange) ' собираем уникальные адреса объединённых ячеек в словарь If rCell.MergeCells Then .Item(rCell.MergeArea.Address(0, 0)) = 0& Next rCell If .Count = 0 Then MsgBox "Объединённых ячеек в выделенном диапазоне не найдено": Exit Sub Arr = .Keys ' из массива .Keys читать поэлементно нельзя For i = 0 To .Count - 1 ActiveSheet.Range(Arr(i)).Select If MsgBox("Разгруппировать ячейку [" & Arr(i) & "] ?", vbYesNo + vbQuestion, "Найдена объединённая ячейка") = vbYes Then Selection.UnMerge Next i End With End Sub