Страницы: 1
RSS
Макрос для разъединения ячеек
 
можно ли создать макрос для разъединения ячеек, чтобы в полученных ячейках было значение объединенной?
 
Sub UnMerge_and_Fill()  
'---------------------------------------------------------------------------------------  
' Procedure    : UnMerge_and_Fill  
' 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
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Может и мой корявенький макрос кому-нибудь пригодится. Обрабатывает таблицу 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  
 
End Sub
 
всем спасибо)  
Alex_ST  
воспользовался вашым из предыдущей темы.    
а для чего используются ссылки на 1 ячейку вместо значений?
 
{quote}{login=Димон}{date=12.11.2010 10:58}{thema=}{post}а для чего используются ссылки на 1 ячейку вместо значений?{/post}{/quote}  
а тогда, изменив значение в первой ячейке, вы сделаете точно таким же значение и в тех, что ранее были под неё сгруппированы.  
И не будет проблем с фильтрацией, когда вы случайно в одну из ячеек добавите пробел в конце. На взгляд его не видно, а под фильтром - отдельное уникальное значение.  
К стати, именно для того, чтобы на взгляд отличать ячейки со значениями, вводимыми в ручную, от ячеек, значения которых вычисляется по формулам, я обычно шрифт в ячейках с формулами и делаю синим.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх