Макрос UnMerge_and_Fill позволяет заполнить открывшиеся после разгруппировки ячейки каждого сгруппированного диапазона в Selection либо ссылками на значения той ячейки, которая была видна до разргуппировки, либо её значениями.
[vba]
Код
Sub UnMerge_and_Fill() '--------------------------------------------------------------------------------------- ' Procedure : UnMerge_and_Fill ' Author : The_Prist & Alex_ST ' Topic_HEADER : Снятие объединения ячеек с заполнением ' Topic_URL : http://www.planetaexcel.ru/forum.php?thread_id=3760 ' Purpose : Снимает объединение со всех ячеек выделенного диапазона ' и заполняет все разгруппированные ячейки КАЖДОЙ бывшей группы ' либо ссылками на значения верхней левой, либо её значениями '--------------------------------------------------------------------------------------- If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim rRange As Range, rCell As Range, sValue$, sAddress$, i& Application.ScreenUpdating = False Set rRange = Intersect(Selection, ActiveSheet.UsedRange) Select Case MsgBox("""ДА"" - заполнить ячейки формулами-ссылками на первую ячейку" & vbCrLf & _ """НЕТ"" - заполнить ячейки значениями из первой ячейки" & vbCrLf & _ """ОТМЕНА"" не разгруппировывать" _ , vbYesNoCancel + vbQuestion, "Как заполнять ячейки после разгруппировки?") Case vbYes ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить формулами-ссылками на их первые ячейки For Each rCell In rRange If rCell.MergeCells Then sAddress = rCell.MergeArea.Address: rCell.UnMerge For i = 2 To Range(sAddress).Cells.Count With Range(sAddress) .Cells(i).Formula = "=" & .Cells(1).Address .Cells(i).Replace What:="$", Replacement:="", LookAt:=xlPart ' сделать ссылки перемещаемыми .Cells(i).Font.ColorIndex = 5 ' сделать шрифт формул синим (это на любителя, конечно) End With Next i End If Next rCell Case vbNo ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек For Each rCell In rRange If rCell.MergeCells Then sAddress = rCell.MergeArea.Address: sValue = rCell.Value: rCell.UnMerge Range(sAddress).Value = rCell.Value End If Next Case vbCancel 'If MsgBox("Разгруппировать стандартным способом?", vbYesNo + vbQuestion) = vbYes Then Selection.UnMerge End Select rRange.Select Application.ScreenUpdating = True End Sub
[/vba]
Макрос UnMerge_and_Fill позволяет заполнить открывшиеся после разгруппировки ячейки каждого сгруппированного диапазона в Selection либо ссылками на значения той ячейки, которая была видна до разргуппировки, либо её значениями.
[vba]
Код
Sub UnMerge_and_Fill() '--------------------------------------------------------------------------------------- ' Procedure : UnMerge_and_Fill ' Author : The_Prist & Alex_ST ' Topic_HEADER : Снятие объединения ячеек с заполнением ' Topic_URL : http://www.planetaexcel.ru/forum.php?thread_id=3760 ' Purpose : Снимает объединение со всех ячеек выделенного диапазона ' и заполняет все разгруппированные ячейки КАЖДОЙ бывшей группы ' либо ссылками на значения верхней левой, либо её значениями '--------------------------------------------------------------------------------------- If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim rRange As Range, rCell As Range, sValue$, sAddress$, i& Application.ScreenUpdating = False Set rRange = Intersect(Selection, ActiveSheet.UsedRange) Select Case MsgBox("""ДА"" - заполнить ячейки формулами-ссылками на первую ячейку" & vbCrLf & _ """НЕТ"" - заполнить ячейки значениями из первой ячейки" & vbCrLf & _ """ОТМЕНА"" не разгруппировывать" _ , vbYesNoCancel + vbQuestion, "Как заполнять ячейки после разгруппировки?") Case vbYes ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить формулами-ссылками на их первые ячейки For Each rCell In rRange If rCell.MergeCells Then sAddress = rCell.MergeArea.Address: rCell.UnMerge For i = 2 To Range(sAddress).Cells.Count With Range(sAddress) .Cells(i).Formula = "=" & .Cells(1).Address .Cells(i).Replace What:="$", Replacement:="", LookAt:=xlPart ' сделать ссылки перемещаемыми .Cells(i).Font.ColorIndex = 5 ' сделать шрифт формул синим (это на любителя, конечно) End With Next i End If Next rCell Case vbNo ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек For Each rCell In rRange If rCell.MergeCells Then sAddress = rCell.MergeArea.Address: sValue = rCell.Value: rCell.UnMerge Range(sAddress).Value = rCell.Value End If Next Case vbCancel 'If MsgBox("Разгруппировать стандартным способом?", vbYesNo + vbQuestion) = vbYes Then Selection.UnMerge End Select rRange.Select Application.ScreenUpdating = True End Sub
А если без вопросов заполнять разгруппированные ячейки значениями из первой, то ещё проще:[vba]
Код
Sub UnMerge_and_Fill_by_Value() ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim rCell As Range, sValue$, sAddress$, i& Application.ScreenUpdating = False For Each rCell In Intersect(Selection, ActiveSheet.UsedRange) If rCell.MergeCells Then sAddress = rCell.MergeArea.Address: rCell.UnMerge Range(sAddress).Value = rCell.Value End If Next Application.ScreenUpdating = True End Sub
[/vba]
А если без вопросов заполнять разгруппированные ячейки значениями из первой, то ещё проще:[vba]
Код
Sub UnMerge_and_Fill_by_Value() ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim rCell As Range, sValue$, sAddress$, i& Application.ScreenUpdating = False For Each rCell In Intersect(Selection, ActiveSheet.UsedRange) If rCell.MergeCells Then sAddress = rCell.MergeArea.Address: rCell.UnMerge Range(sAddress).Value = rCell.Value End If Next Application.ScreenUpdating = True End Sub
Sub UnMerge_And_Fill_By_Value() ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек Dim Address As String Dim Cell As Range
If TypeName(Selection) <> "Range" Then Exit Sub End If
If Selection.Cells.Count = 1 Then Exit Sub End If
Application.ScreenUpdating = False
For Each Cell In Intersect(Selection, ActiveSheet.UsedRange).Cells If Cell.MergeCells Then Address = Cell.MergeArea.Address Cell.UnMerge Range(Address).Value = Cell.Value End If Next End Sub
[/vba]
[vba]
Код
Sub UnMerge_And_Fill_By_Value() ' разгруппировать все ячейки в Selection и ячейки каждой бывшей группы заполнить значениями из их первых ячеек Dim Address As String Dim Cell As Range
If TypeName(Selection) <> "Range" Then Exit Sub End If
If Selection.Cells.Count = 1 Then Exit Sub End If
Application.ScreenUpdating = False
For Each Cell In Intersect(Selection, ActiveSheet.UsedRange).Cells If Cell.MergeCells Then Address = Cell.MergeArea.Address Cell.UnMerge Range(Address).Value = Cell.Value End If Next End Sub
nerv, а чем это от моего варианта отличается? Только тем, что у тебя имена переменных "не по фэншую" :), а я у себя забыл убрать лишние переменные i& и sValue$ И тем, что в Intersect(Selection, ActiveSheet.UsedRange) явно указано свойство .Cells? Ну, тут спорить не буду: "по фэншую" надо именно так и писАть, т.к. по умолчанию свойство Range - Value ... Но ведь и так как у меня нормально работает, значит VBA понимает, что речь идёт про .Cells , а не про .Value Но для фэншуя , пожалуй, у себя допишу в макрос .Cells
nerv, а чем это от моего варианта отличается? Только тем, что у тебя имена переменных "не по фэншую" :), а я у себя забыл убрать лишние переменные i& и sValue$ И тем, что в Intersect(Selection, ActiveSheet.UsedRange) явно указано свойство .Cells? Ну, тут спорить не буду: "по фэншую" надо именно так и писАть, т.к. по умолчанию свойство Range - Value ... Но ведь и так как у меня нормально работает, значит VBA понимает, что речь идёт про .Cells , а не про .Value Но для фэншуя , пожалуй, у себя допишу в макрос .CellsAlex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 13.02.2013, 09:52