Страницы: 1
RSS
Объединение ячеек без потери данных
 
Давно пользуюсь при необходимости методом объединения ячеек без потери данных путём применения к объединяемым ячейкам функции "формат по образцу" объединенного диапазона.  
Здесь на форуме уже тоже как-то было описание этой не документированной возможности Ёкселя.  
Не удобно это делать в ручную:  
1. Копируешь объединяемые ячейки куда-то в свободное место.  
2. Там их объединяешь, говоря "Ну и фиг с ним" на предупреждение Ёкселя о том, что все данные кроме левой верхней ячейки будут потеряны.  
3. С объединённых ячеек копируешь формат (формат по образцу) и форматируешь им исходные ячейки.  
 
После таких манипуляций под сгруппированной ячейкой будут оставаться не затёртыми данные и всех остальных ячеек кроме левой верхней.  
Они появляются после разгруппировки, а самое главное, что видятся автофильтром.  
 
Возникла идея выполнять такое объединение макросом без использования промежуточных ячеек для форматирования.  
А уж если в скрываемые при объединении ячейки опционально (или другим макросом) можно будет вместо их текста вставить формулы = первой ячейке, то будет вообще очень удобно.  
 
Попытался записать макрос такого хитрого объединения макрорекордером, но там вроде всё понятно, а вот как создать макрос, не понимаю...  
Даже показывать "плоды своих трудов" над макросом не буду чтобы не засмеяли...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Так вроде у Димы такая функция есть. Если ничего не путаю.
 
Нет, там не то...  
Только что посмотрел.  
Там СКЛЕИВАНИЕ содержимого объединяемых ячеек, а не объединение без потери данных  
Склеить-то просто. А вот хитро объединить...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
В PLEX есть макрос, который это прекрасно делает: "Объединение ячеек с сохранением текста".  
С уважением, Александр.
 
Дмитрий, а раз нельзя без стороннего диапазона, но по вашим словам "С доп.диапазоном - легко", то может хоть черновой набросок макроса на скорую руку слепите, чтобы "Путь озарить"?  
А уж дальше я как-нибудь попытаюсь и сам "допилить/дошлифовать"...  
 
Я так предполагаю, что надо в начале работы макроса создать в книге временный лист, скопировать Selection на него, там объединить скопированные ячейки, наложить их формат на исходные ячейки (формат по образцу), а потом удалить этот временный лист.  
 
Возможно, проблема будет ещё и в том, какое имя дать временному листу чтобы такого наверняка уже не было в книге, хотя это, наверное, обходится несколькими пробами создания листа с разными хитрыми именами (да хоть текущая дата + минуты:секунды) при включенном обработчике ошибок.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
The_Prist,  
СУПЕР!!!  
Отлично работает!  
Особенно порадовало название временного листа "Бракозябула_вот_так_сам_в_шоке"  
Да уж, вероятность того, что лист с таким именем есть у кого-то в книге, так сильно стремится к нулю, что ей можно пренебречь...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
The_Prist, ещё вопросик-просьба:  
дальнейшее развитие возможностей вашего макроса, которое мне очень хотелось бы провести, подразумевает, что будет сделан аналогичный модернизированный макрос, заполняющий перед объединением ячеек все ячейки выделенного диапазона формулой = ActiveCell (или в этот же макрос будет введена такая опциональная возможность, например, по MsgBox'y типа "Заполнить формулой-ссылкой?")    
 
Если не очень затруднит, подскажите, пожалуйста, как можно перед объединением заполнить все ячейки выделенного диапазона формулой-ссылкой = ActiveCell?    
Я просто никогда не вставлял формулы в ячейки с помощью VBA да и в цикле по всем выделенным ячейкам кроме активной могу запутаться... Сделать-то в конце-концов сделаю, но времени потрачу много.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Selection.Resize(Selection.Rows.Count - 1).Offset(1).Formula = "=R[-1]C" подходит только для столбца...
А если выделены ячейки в строке или двумерный диапазон?
 
А нет в VBA чего-нибудь обратного Intersect, т.е. возвращающего неперекрывающиеся части диапазонов?  
Тогда диапазон заполнения формулами просто было бы определить, задав этой операции как аргументы ActiveCell и Selection, а потом в цикле заполнить его формулой-ссылкой на ActiveCell ?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Сейчас попробовал извратиться и выделил диапазон на странице не слева-вниз-направо, а снизу-вверх-налево.  
Макрос заполнения формулами, естественно, отработав, вызвал ошибку - циклическая ссылка.  
Значит сначала нужно либо как-то внутри Selection ActiveCell переносить налево вверх либо вместо ActiveCell использовать левую верхнюю ячейку в Selection , а уж потом заполнять формулами и объединять ячейки...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
СПАСИБО ЗА ПОМОЩЬ!  
Решил для удобства разбить на два макроса чтобы можно было пользоваться раздельно.  
Вот что получилось:  
 
Sub Fill_Sel_by_Link()   ' заполнить Selection формулами-ссылками на Selection(1)  
  If Selection.Cells.Count <= 1 Then Exit Sub  
  With Union(Selection.Resize(Selection.Rows.Count - 1).Offset(1), _  
             Selection.Resize(, Selection.Columns.Count - 1).Offset(, 1))  
     .Formula = "=" & Selection(1).Address  
     .Font.ColorIndex = 5   ' сделать шрифт формул синим (это на любителя, конечно, но я так привык)  
  End With  
End Sub  
 
 
Sub Merge_Cell_with_PasteFormat() ' объединить ячейки в Selection без потери данных  
  If Selection.Cells.Count <= 1 Then Exit Sub  
  Dim rRange As Range, rMrgRange As Range, wsTempSh As Worksheet, wsActSh As Worksheet  
  If MsgBox("Заполнить объединяемые ячейки формулами - ссылками на первую ячейку выделенного диапазона?", _  
            vbQuestion + vbYesNo) = vbYes Then Call Fill_Sel_by_Link  
  Application.ScreenUpdating = False: Application.DisplayAlerts = False  
  Set wsActSh = ActiveSheet: Set wsTempSh = Sheets.Add(, Sheets(Sheets.Count)): wsTempSh.Name = "Бракозябула_вот_так_сам_в_шоке"  
  wsActSh.Activate  
  Set rRange = Selection: rRange.Copy wsTempSh.Range(rRange.Address)  
  Set rMrgRange = wsTempSh.Range(rRange.Address)  
  rMrgRange.Merge: rMrgRange.Copy: rRange.PasteSpecial xlPasteFormats: wsTempSh.Delete  
  Set wsActSh = Nothing: Set wsTempSh = Nothing: Set rMrgRange = Nothing: Set rRange = Nothing  
  Application.ScreenUpdating = True: Application.DisplayAlerts = True  
End Sub  
 
Очень удобно стало работать!  
Тему можно закрывать.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А что нужно исправить чтобы ссылки в формулах получались не фиксированными (не =$D$15, а =D15)?  
Или проще после вставки формулы Replace применить?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
нет, так не вышло...  
при двумерном выделении каждая ячейка ссылается на ту, что над ней, а не на Selection(1)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
и получается длиннейшая рекурсивная формула...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Блин...  
Опять что-то либо с сервером либо наши сисадмины мудрят...  
При попытке ввода ответа получаю:  
 
ERROR  
The requested URL could not be retrieved  
The following error was encountered while trying to retrieve the URL: http://www.planetaexcel.ru/forum.php?  
   The request or reply is too large.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Что-то у меня вдруг СЕГОДНЯ перестал работать макрос заполнения ...  
 
Sub Fill_Sel()  ' заполнить Selection формулами-ссылками на Selection(1)  
  Union(Selection.Resize(Selection.Rows.Count - 1).Offset(1), _  
        Selection.Resize(, Selection.Columns.Count - 1).Offset(, 1)).Formula = "=" & Selection(1).Address  
End Sub  
 
Вчера я его засунул в Personal.xls, сделал к нему кнопочку на панели управления, добавил в начало диалоги типа "ты уверен?"...  
А сегодня нажимаю на кнопочку вызова макроса, прохожу диалог, а дальше вылетаю на ошибку "Ошибка выполнения 1004. Ошибка определяемая приложением или объектом."  
Причем ругается именно на Union, т.к. я пытался .Formula = "=" & Selection(1).Address заменять на .Font.ColorIndex = 5 - та же ошибка.  
Перенёс макрос в модуль листа новой книги, на всякий случай переименовал в Мой_Макрос... Та же ошибка...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
В тупую заменил  
Union(Selection.Resize(Selection.Rows.Count - 1).Offset(1), _  
Selection.Resize(, Selection.Columns.Count - 1).Offset(, 1)).Formula = "=" & Selection(1).Address  
 
на цикл по всем ячейкам Selection, кроме первой:  
  Dim i%  
  For i = 2 To Selection.Cells.Count  
     With Selection(i)  
     .Formula = "=" & Selection(1).Address  
     .Replace What:="$", Replacement:="", LookAt:=xlPart    
     End With  
  Next  
и всё заработало...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Подскажите пожалуйста, как объединить ячейки, например, если в одной стоит число 25 в следующей месяц "март" и в следующей год "2012", как сделать чтобы была дата в одной ячейке 25.03.2012 (См.файл)
 
=--(A4&"."&B4&"."&C4)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Можно без точек :)  
=--(A4&B4&C4)
 
фантастика! :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Страницы: 1
Читают тему
Наверх