Макрос ReMerge является упрощенной версией макроса MergePlus Позволяет "одним движением" перегруппировать по методу MergePlus сгруппированную ячейку или сгруппировать ячейки выделенного диапазона с заполнением скрываемых ячеек формулами-ссылками на первую ячейку. [vba]
Code
Sub ReMerge() ' перегруппировать сгруппированную ячейку или сгруппировать ячейки выделенного диапазона с заполнением скрытых ячеек формулами-ссылками на первую ячейку If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim i%, iCell As Range, ActRng As Range Dim ActSh As Worksheet, TempSh As Worksheet Dim lLastRow&: lLastRow = Cells.SpecialCells(xlLastCell).Row Dim lLastCol&: lLastCol = Selection.Column + Selection.Columns.Count - 1 If lLastRow > Selection.Row + Selection.Rows.Count - 1 Then lLastRow = Selection.Row + Selection.Rows.Count - 1 Set ActRng = Intersect(Selection, Range(Cells(Selection.Row, Selection.Column), Cells(lLastRow, lLastCol))) Application.ScreenUpdating = False: Application.DisplayAlerts = False
Set ActSh = ActiveSheet: Set TempSh = Sheets.Add ' запомнить текущую и создать новую страницу ActRng.Copy TempSh.Range(ActRng.Address) ActSh.Activate Selection.UnMerge For i = 2 To ActRng.Cells.Count ' заполнить Selection формулами-ссылками на первую ячейку ActRng(i).Formula = "=" & ActRng(1).Address ActRng(i).Replace What:="$", Replacement:="", LookAt:=xlPart ' сделать ссылки перемещаемыми Next TempSh.Range(ActRng.Address).Merge TempSh.Range(ActRng.Address).Copy: ActRng.PasteSpecial xlPasteFormats: TempSh.Delete Set ActSh = Nothing: Set TempSh = Nothing: Set ActRng = Nothing Application.ScreenUpdating = True: Application.DisplayAlerts = True End Sub
[/vba]
Макрос ReMerge является упрощенной версией макроса MergePlus Позволяет "одним движением" перегруппировать по методу MergePlus сгруппированную ячейку или сгруппировать ячейки выделенного диапазона с заполнением скрываемых ячеек формулами-ссылками на первую ячейку. [vba]
Code
Sub ReMerge() ' перегруппировать сгруппированную ячейку или сгруппировать ячейки выделенного диапазона с заполнением скрытых ячеек формулами-ссылками на первую ячейку If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim i%, iCell As Range, ActRng As Range Dim ActSh As Worksheet, TempSh As Worksheet Dim lLastRow&: lLastRow = Cells.SpecialCells(xlLastCell).Row Dim lLastCol&: lLastCol = Selection.Column + Selection.Columns.Count - 1 If lLastRow > Selection.Row + Selection.Rows.Count - 1 Then lLastRow = Selection.Row + Selection.Rows.Count - 1 Set ActRng = Intersect(Selection, Range(Cells(Selection.Row, Selection.Column), Cells(lLastRow, lLastCol))) Application.ScreenUpdating = False: Application.DisplayAlerts = False
Set ActSh = ActiveSheet: Set TempSh = Sheets.Add ' запомнить текущую и создать новую страницу ActRng.Copy TempSh.Range(ActRng.Address) ActSh.Activate Selection.UnMerge For i = 2 To ActRng.Cells.Count ' заполнить Selection формулами-ссылками на первую ячейку ActRng(i).Formula = "=" & ActRng(1).Address ActRng(i).Replace What:="$", Replacement:="", LookAt:=xlPart ' сделать ссылки перемещаемыми Next TempSh.Range(ActRng.Address).Merge TempSh.Range(ActRng.Address).Copy: ActRng.PasteSpecial xlPasteFormats: TempSh.Delete Set ActSh = Nothing: Set TempSh = Nothing: Set ActRng = Nothing Application.ScreenUpdating = True: Application.DisplayAlerts = True End Sub
Нет. Форматом по образцу не получится. Ведь ячейки не просто объединены без потери данных, а в невидимых ячейках ещё и прописаны формулы-ссылки на первую ячейку объединённой группы. Но к вашему счастью, я уже давно сделал, но не выложил сюда макрос, который переобъединит все объединённые ячейки с одновременным заполнением скрываемых формулами. Попробуйте просто выделить на листе область с несколькими объединенными ячейками и выполнить этот макрос:[vba]
Код
Sub ReMergeEach() ' перегруппировать каждую сгруппированную ячейку в выделенном диапазоне с заполнением скрытых ячеек формулами-ссылками на первую ячейку If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim i%, iCell As Range, ActRng As Range Dim ActSh As Worksheet, TempSh As Worksheet Dim lLastRow&: lLastRow = Cells.SpecialCells(xlLastCell).Row Dim lLastCol&: lLastCol = Selection.Column + Selection.Columns.Count - 1 If lLastRow > Selection.Row + Selection.Rows.Count - 1 Then lLastRow = Selection.Row + Selection.Rows.Count - 1 Set ActRng = Intersect(Selection, Range(Cells(Selection.Row, Selection.Column), Cells(lLastRow, lLastCol))) Application.ScreenUpdating = False: Application.DisplayAlerts = False: Application.EnableEvents = False Set ActSh = ActiveSheet: Set TempSh = Sheets.Add ' запомнить текущую и создать новую страницу ActRng.Copy TempSh.Range(ActRng.Address) ' копировать ActRng на новую страницу ActSh.Activate For Each iCell In ActRng If iCell.MergeCells Then ' разгруппировать и заполнить ранее скрытые ячейки формулами-ссылками на первые ячейки iCell.Select Selection.UnMerge For i = 2 To Selection.Cells.Count ' заполнить Selection формулами-ссылками на первую ячейку Selection(i).Formula = "=" & Selection(1).Address Selection(i).Replace What:="$", Replacement:="", LookAt:=xlPart ' сделать ссылки перемещаемыми Next End If Next TempSh.Range(ActRng.Address).Copy: ActRng.PasteSpecial xlPasteFormats: TempSh.Delete Set ActSh = Nothing: Set TempSh = Nothing: Set ActRng = Nothing Application.ScreenUpdating = True: Application.DisplayAlerts = True: Application.EnableEvents = True End Sub
[/vba]
всё, вроде бы работает как надо.
Нет. Форматом по образцу не получится. Ведь ячейки не просто объединены без потери данных, а в невидимых ячейках ещё и прописаны формулы-ссылки на первую ячейку объединённой группы. Но к вашему счастью, я уже давно сделал, но не выложил сюда макрос, который переобъединит все объединённые ячейки с одновременным заполнением скрываемых формулами. Попробуйте просто выделить на листе область с несколькими объединенными ячейками и выполнить этот макрос:[vba]
Код
Sub ReMergeEach() ' перегруппировать каждую сгруппированную ячейку в выделенном диапазоне с заполнением скрытых ячеек формулами-ссылками на первую ячейку If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Cells.Count <= 1 Then Exit Sub Dim i%, iCell As Range, ActRng As Range Dim ActSh As Worksheet, TempSh As Worksheet Dim lLastRow&: lLastRow = Cells.SpecialCells(xlLastCell).Row Dim lLastCol&: lLastCol = Selection.Column + Selection.Columns.Count - 1 If lLastRow > Selection.Row + Selection.Rows.Count - 1 Then lLastRow = Selection.Row + Selection.Rows.Count - 1 Set ActRng = Intersect(Selection, Range(Cells(Selection.Row, Selection.Column), Cells(lLastRow, lLastCol))) Application.ScreenUpdating = False: Application.DisplayAlerts = False: Application.EnableEvents = False Set ActSh = ActiveSheet: Set TempSh = Sheets.Add ' запомнить текущую и создать новую страницу ActRng.Copy TempSh.Range(ActRng.Address) ' копировать ActRng на новую страницу ActSh.Activate For Each iCell In ActRng If iCell.MergeCells Then ' разгруппировать и заполнить ранее скрытые ячейки формулами-ссылками на первые ячейки iCell.Select Selection.UnMerge For i = 2 To Selection.Cells.Count ' заполнить Selection формулами-ссылками на первую ячейку Selection(i).Formula = "=" & Selection(1).Address Selection(i).Replace What:="$", Replacement:="", LookAt:=xlPart ' сделать ссылки перемещаемыми Next End If Next TempSh.Range(ActRng.Address).Copy: ActRng.PasteSpecial xlPasteFormats: TempSh.Delete Set ActSh = Nothing: Set TempSh = Nothing: Set ActRng = Nothing Application.ScreenUpdating = True: Application.DisplayAlerts = True: Application.EnableEvents = True End Sub
А объединённые макросом ячейки Вы разъединить не пробовали? А если пробовали, то неужели не заметили разницы с результатом разъединения объединённых ранее стандартным способом ячеек?
А объединённые макросом ячейки Вы разъединить не пробовали? А если пробовали, то неужели не заметили разницы с результатом разъединения объединённых ранее стандартным способом ячеек?Alex_ST
Что-то я не понял! Создал макрос, скопировал в него вашу программку. А он не объединяет содержимое ячеек, а объединяет, сохраняя содержимое только первой а второе содержимое пропадает. А главное, потом отменить это невозможно!
Что-то я не понял! Создал макрос, скопировал в него вашу программку. А он не объединяет содержимое ячеек, а объединяет, сохраняя содержимое только первой а второе содержимое пропадает. А главное, потом отменить это невозможно!Юрий_Ф
То, что мы делаем, завораживает! Кстати! Я не могу всем нравиться! И это взаимно!
Юрий_Ф, а с чего Вы взяли, что описанная здесь процедура должна объединять (т.е. "склеивать") СОДЕРЖИМОЕ ячеек? Она именно создаёт объединённую ячейку из выделенного диапазона. Процедура - замена стандартного объединения ячеек Excel, которое просто стирает содержимое всех объединяемых ячеек и даёт объединённой ячейке значение из левой верхней (первой) ячейки выделенного диапазона. А данная процедура позволяет не стирать значения из скрытых при объединении ячеек. Прочтите первый пост данного топика. Там всё написано и есть ссылка на более продвинутый макрос MergePlus, назначение и возможности которого там же описаны в первом посте. А для "склеивания" содержимого выделенных ячеек я где-то здесь выкладывал другой макрос... Но это было очень давно и трудно найти... Т.к. найти не смог, то пойду на оффтоп (да простят меня модераторы!) и выложу несколько вариантов макроса здесь под спойлером
[vba]
Код
Sub Glue_TXT() ' СКЛЕИТЬ тексты из выделенных ячеек If TypeName(Selection) <> "Range" Then Exit Sub Dim rRng As Range: Set rRng = Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If rRng Is Nothing Then Exit Sub If rRng.Cells.Count = 1 Then Exit Sub Dim Delimeter$, sLF$, sText$, rCell As Range If MsgBox("Переносить тексты из ячеек по строкам?", vbYesNo + vbQuestion + vbDefaultButton2, "Параметры объединения") = vbYes Then sLF = vbLf Delimeter = InputBox("Введите разделитель текстов ячеек:", "Параметры объединения", " ") For Each rCell In rRng If Len(rCell.Value) Then sText = sText & IIf(Len(sText), Delimeter & sLF, "") & rCell.Value Next rCell sText = Application.Trim(sText) With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText sText: .PutInClipBoard: End With MsgBox "Объединённый текст помещён в буфер обмена", , "Операция завершена успешно!" End Sub
Sub Glue_TXT_with_Chr10() ' СКЛЕИТЬ тексты из выделенных ячеек с переносами строк If TypeName(Selection) <> "Range" Then Exit Sub Dim rRng As Range: Set rRng = Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If rRng Is Nothing Then Exit Sub If rRng.Cells.Count = 1 Then Exit Sub Dim sText$, rCell As Range For Each rCell In Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If Len(rCell.Value) Then sText = sText & IIf(Len(sText), vbLf, "") & rCell.Value Next rCell sText = Application.Trim(sText) With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText sText: .PutInClipBoard: End With MsgBox "Объединённый текст помещён в буфер обмена", , "Операция завершена успешно!" End Sub
Sub Glue_TXT_and_Num() ' СКЛЕИТЬ тексты из выделенных ячеек в нумерованный список с переносами строк If TypeName(Selection) <> "Range" Then Exit Sub Dim rRng As Range: Set rRng = Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If rRng Is Nothing Then Exit Sub If rRng.Cells.Count = 1 Then Exit Sub Dim sText$, rCell As Range, iItem%: iItem = 1 ' начальный номер пункта списка For Each rCell In rRng If Len(rCell.Value) Then sText = sText & IIf(Len(sText), vbLf, "") & CStr(iItem) & ". " & rCell.Value iItem = iItem + 1 End If Next rCell sText = Application.Trim(sText) With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText sText: .PutInClipBoard: End With MsgBox "Объединённый текст помещён в буфер обмена", , "Операция завершена успешно!" End Sub
[/vba]
Юрий_Ф, а с чего Вы взяли, что описанная здесь процедура должна объединять (т.е. "склеивать") СОДЕРЖИМОЕ ячеек? Она именно создаёт объединённую ячейку из выделенного диапазона. Процедура - замена стандартного объединения ячеек Excel, которое просто стирает содержимое всех объединяемых ячеек и даёт объединённой ячейке значение из левой верхней (первой) ячейки выделенного диапазона. А данная процедура позволяет не стирать значения из скрытых при объединении ячеек. Прочтите первый пост данного топика. Там всё написано и есть ссылка на более продвинутый макрос MergePlus, назначение и возможности которого там же описаны в первом посте. А для "склеивания" содержимого выделенных ячеек я где-то здесь выкладывал другой макрос... Но это было очень давно и трудно найти... Т.к. найти не смог, то пойду на оффтоп (да простят меня модераторы!) и выложу несколько вариантов макроса здесь под спойлером
[vba]
Код
Sub Glue_TXT() ' СКЛЕИТЬ тексты из выделенных ячеек If TypeName(Selection) <> "Range" Then Exit Sub Dim rRng As Range: Set rRng = Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If rRng Is Nothing Then Exit Sub If rRng.Cells.Count = 1 Then Exit Sub Dim Delimeter$, sLF$, sText$, rCell As Range If MsgBox("Переносить тексты из ячеек по строкам?", vbYesNo + vbQuestion + vbDefaultButton2, "Параметры объединения") = vbYes Then sLF = vbLf Delimeter = InputBox("Введите разделитель текстов ячеек:", "Параметры объединения", " ") For Each rCell In rRng If Len(rCell.Value) Then sText = sText & IIf(Len(sText), Delimeter & sLF, "") & rCell.Value Next rCell sText = Application.Trim(sText) With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText sText: .PutInClipBoard: End With MsgBox "Объединённый текст помещён в буфер обмена", , "Операция завершена успешно!" End Sub
Sub Glue_TXT_with_Chr10() ' СКЛЕИТЬ тексты из выделенных ячеек с переносами строк If TypeName(Selection) <> "Range" Then Exit Sub Dim rRng As Range: Set rRng = Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If rRng Is Nothing Then Exit Sub If rRng.Cells.Count = 1 Then Exit Sub Dim sText$, rCell As Range For Each rCell In Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If Len(rCell.Value) Then sText = sText & IIf(Len(sText), vbLf, "") & rCell.Value Next rCell sText = Application.Trim(sText) With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText sText: .PutInClipBoard: End With MsgBox "Объединённый текст помещён в буфер обмена", , "Операция завершена успешно!" End Sub
Sub Glue_TXT_and_Num() ' СКЛЕИТЬ тексты из выделенных ячеек в нумерованный список с переносами строк If TypeName(Selection) <> "Range" Then Exit Sub Dim rRng As Range: Set rRng = Intersect(Selection, ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible)) If rRng Is Nothing Then Exit Sub If rRng.Cells.Count = 1 Then Exit Sub Dim sText$, rCell As Range, iItem%: iItem = 1 ' начальный номер пункта списка For Each rCell In rRng If Len(rCell.Value) Then sText = sText & IIf(Len(sText), vbLf, "") & CStr(iItem) & ". " & rCell.Value iItem = iItem + 1 End If Next rCell sText = Application.Trim(sText) With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText sText: .PutInClipBoard: End With MsgBox "Объединённый текст помещён в буфер обмена", , "Операция завершена успешно!" End Sub