Sub UnMerge_and_Fill() '--------------------------------------------------------------------------------------- ' Procedure : UnMerge_and_Fill ' Topic_HEADER : Снятие объединения ячеек с заполнением ' Topic_URL : ' 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
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Пользователь
Сообщений: Регистрация: 16.08.2010
12.11.2010 22:28:47
Может и мой корявенький макрос кому-нибудь пригодится. Обрабатывает таблицу HTML, в которой в полях одной записи встречаются и объединенные и отдельные ячейки. В результате получается запись в одной строке, а лишние удаляются. Для наглядности кусочек исходной таблицы в файле. Sub UnMergeAndPack() ' Если в поле А есть объединенные строки (ячейки) разъединяет их Dim iCell As Range ' а из необъединенных ячеек собирает текст в верхнюю ячейку.После этого Dim nRow As Long ' удаляет строки с пустыми ячейками в столбце А Dim howRow As Integer Dim endRow As Long Dim nCol As Integer Dim addRow As Long Dim iLastRow As Long Application.DisplayStatusBar = True 'Установка текста строки состояния. Application.StatusBar = "Преобразование таблицы" Application.ScreenUpdating = False 'Отключить обновление экрана iLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count For Each iCell In Range("A3:A" & iLastRow) With iCell If .MergeCells And .Address = .MergeArea.Cells(1).Address Then ' Если ячейка Merge и она первая в Merge nRow = iCell.Row ' номер первой строки в объкдиненной ячейке howRow = .MergeArea.Rows.Count ' кол-во строк в объединенной ячейке endRow = nRow + howRow - 1 ' номер последней строки в объединенной ячейке For nCol = 1 To 7 ' обработка записи в полях If Cells(nRow, nCol).MergeCells = True Then ' Если ячейка объединенная, Cells(nRow, nCol).UnMerge ' то разъединяем Else For addRow = nRow + 1 To endRow ' если ячейки отдельные, то собираем из них текст в верхнюю ячейку Cells(nRow, nCol) = Cells(nRow, nCol) & Chr(10) & Cells(addRow, nCol) Next addRow End If Next nCol End If End With Next
iLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count Range("A2", "G" & iLastRow).AutoFilter Field:=1, Criteria1:="=", Operator:=xlFilterValues ' Фильтрация по "Пусто" в поле А Range("A3:A" & iLastRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete ' Удаление отфильтрованных строк Range("A2", "G" & iLastRow).AutoFilter ' Отключение автофильтра
ActiveSheet.UsedRange.Replace Empty, "insert", xlWhole ' Устанавливаем рабочую область ActiveSheet.UsedRange.Replace "insert", Empty ' по размерам таблицы
Columns("B:G").EntireColumn.AutoFit ' Автоподбор ширины ячеек Cells.EntireRow.AutoFit ' Автоподбор высоты ячеек Range("H2").Select Application.ScreenUpdating = True Application.StatusBar = False
всем спасибо) Alex_ST воспользовался вашым из предыдущей темы. а для чего используются ссылки на 1 ячейку вместо значений?
Пользователь
Сообщений: Регистрация: 22.12.2012
На лицо ужасный, добрый внутри
13.11.2010 08:52:06
{quote}{login=Димон}{date=12.11.2010 10:58}{thema=}{post}а для чего используются ссылки на 1 ячейку вместо значений?{/post}{/quote} а тогда, изменив значение в первой ячейке, вы сделаете точно таким же значение и в тех, что ранее были под неё сгруппированы. И не будет проблем с фильтрацией, когда вы случайно в одну из ячеек добавите пробел в конце. На взгляд его не видно, а под фильтром - отдельное уникальное значение. К стати, именно для того, чтобы на взгляд отличать ячейки со значениями, вводимыми в ручную, от ячеек, значения которых вычисляется по формулам, я обычно шрифт в ячейках с формулами и делаю синим.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)