Страницы: 1
RSS
Как расформатировать весь лист кроме выделенного диапазона?
 
От разных "знатоков" мне часто в работу попадают таблицы, где, например, лист, строка или столбец ЦЕЛИКОМ залиты каким-нибудь цветом или там прорисованы ВСЕ границы ячеек.  
При этом форматирование внутри используемой части листа несёт некоторую нужную смысловую нагрузку (заливка ячеек, границы, цвет текста, ...)  
Уж больно муторно в ручную выделять когда надо строку или столбец за последним используемым, потом выделять всё до последней строки или столбца листа и уже потом снимать формат выделенного в результате диапазона макросом:  
Sub UnFormat_Selection()  
   Selection.ClearFormats  
End Sub  
 
А вот как снять форматирование всех ячеек листа КРОМЕ выделенных, что-то не соображу...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Вообще-то эту тему можно было бы назвать:    
"Можно ли одной командой инвертировать выделение?"    
и ничего поясняющего кроме этого не писАть.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Я так предполагаю что нужен макрос который будет прыгать от последней строки диапазона до конца и снимать, а потом от последнего стлобца и снимать , а получить координаты выделенного диапазона Вам не сложно...
 
Вот вам макрос:  
 
Sub test()  
   Application.ScreenUpdating = False  
   Dim s As Range: Set s = Selection  
   Dim sh As Worksheet: Set sh = Worksheets.Add  
   s.Copy sh.[a1]
   s.Worksheet.Cells.ClearFormats  
   sh.Range("a1").Resize(s.Rows.Count, s.Columns.Count).Copy s  
   Application.DisplayAlerts = False: sh.Delete: Application.DisplayAlerts = True  
End Sub  
 
 
Выделяете диапазон ячеек, форматирование которого не должно быть затронуто, и запускаете макрос.
 
EducatedFool,  
спасибо за макрос.  
Он, конечно, работает, но неужели нет более простой возможности инвертировать выделение, кроме как создавать новый лист, копировать выделение на него и т.д.?  
 
К стати, а разве если в начале макроса вы запретили обновление экрана:  
  Application.ScreenUpdating = False  
то по окончании работы макроса не нужно его разрешить:  
  Application.ScreenUpdating = True  
Или область действия этой инструкции - только в пределах модуля и его вложенных процедур (так же как у обработчика ошибок On Error)?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Я конечно в макросах нуб еще тот, но есть способ стандартными методами скрыть нужный диапазон, затем в меню "Найти и выделить-Выделение группы ячеек-Только видимые ячейки. И делай с ними что хочешь. Может быть этот способ и в макросе применить можно?
 
Что-то я не понимаю, как это можно скрыть что-нибудь кроме целиком листа, целиком строки или целиком столбца?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
И к стати, я не зря в своём втором посте в данном топике обобщил вопрос до:  
"Можно ли одной командой инвертировать выделение?" .  
Ну, хоть не одной командой, а несколькими...    
Такая задача (сделать нечто, обратное, чем intersect) у меня уже как-то возникала и решилась тогда достаточно "коряво"...  
Но ведь не создавать же ради такой простой операции новый временный лист?  
 
Метод, предложенный глубоко мною уважаемым EducatedFool, к сожалению на мой взгляд хоть и достаточно простой по коду, но громоздкий по выполняемым операциям... Да и к тому же решает только узко специальную задачу, описанную в старт-посте.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
http://www.dailydoseofexcel.com/archives/2004/07/13/inverting-the-selection/
 
тухачевский,  
приведённый по ссылке макрос:  
Sub InvertSelection()  
  Dim rBig As Range  
  Dim rSmall As Range  
  Dim cell As Range  
  Dim rNew As Range  
 
  If TypeName(Selection) = "Range" Then  
     'Set rBig = ActiveSheet.UsedRange ' ячейки листа в UsedRange  
     Set rBig = Selection.Parent.UsedRange ' ячейки листа в UsedRange  
     'Set rBig = ActiveSheet.Cells ' все ячейки листа  
     Set rSmall = Selection  
  End If  
 
  If Not rSmall Is Nothing Then  
     For Each cell In rBig.Cells  
        If Intersect(cell, rSmall) Is Nothing Then  
           If rNew Is Nothing Then  
              Set rNew = cell  
           Else  
              Set rNew = Union(rNew, cell)  
           End If  
        End If  
     Next cell  
  End If  
 
  If Not rNew Is Nothing Then  
     rNew.Select  
  End If  
 
End Sub  
 
работает не со всем листом, а только с UsedRange  
Если же вместо Set rBig = Selection.Parent.UsedRange сделать Set rBig = ActiveSheet.Cells , то Ёксель задумывается очень надолго, т.к. там будет цикл по всем ячейкам листа...    
И это в 2003-ем, а что будет в 2007-ом?  
Да и опять же: ну неужели никак нельзя проще?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 

Алекс, загляните сюда: http://www.sql.ru/forum/actualthread.aspx?tid=594996&pg=3

 
> Он, конечно, работает, но неужели нет более простой возможности инвертировать выделение, кроме как создавать новый лист, копировать выделение на него и т.д.?  
 
А в чем сложность?  
Всё работает быстро и надёжно...  
Зачем извращаться с инвертированием выделения, если можно сделать проще?  
 
 
> Кстати, а разве если в начале макроса вы запретили обновление экрана:  
то по окончании работы макроса не нужно его разрешить  
 
Не нужно. Если Excel не глючит, и макрос не вылетает с ошибками, обновление экрана включится автоматически по окончании того макроса, в котором оно было отключено. (аналогично On Error Resume Next)  
 
 
> Да и к тому же решает только узко специальную задачу, описанную в старт-посте.  
А какую ещё задачу надо было решить?  
Вы просили сделать макрос, чтобы "снять форматирование всех ячеек листа КРОМЕ выделенных"    
Мой код делает именно это.
 
К сожалению, движок форума не позволяет редактировать свои посты, поэтому я был вынужден слегка расширить вопрос во втором посте этого топика:  
"Можно ли одной командой инвертировать выделение?" .  
Ну, хоть не одной командой, а несколькими, но быстро и просто?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А мне макрос EducatedFool очень понравился я его в копилку тут же сунул...
 
А никто и не говорит, что макрос плох.  
Я его тоже "отполировал, покрыл лачком" ("обсмыслил" имена переменных, унифицировал стиль обращения к диапазону, добавил комментарий-описание в заголовке) и положил к себе в копилочку, т.к., похоже, что более простого и элегантного решения никто не предложит...  
 
Но ещё всё же хотелось бы как-то просто реализовать инверсию выделения (без цикла по ячейкам, как предложил тухачевский)...  
Но опять же: за неимением лучшего, и этот подождём, отполируем и - в копилочку.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Юрий М}{date=27.02.2010 01:15}{thema=}{post}

Алекс, загляните сюда: http://www.sql.ru/forum/actualthread.aspx?tid=594996&pg=3

{/post}{/quote}  
Если вы имели в виду макрос:  
Sub test()  
   Dim x : x = Selection.Address(0, 0)  
   Application.ScreenUpdating = False  
   Application.DisplayAlerts = False  
   With Worksheets.Add  
       .Range(x).Value = 1  
       Me.Activate  
       Me.Range(.UsedRange.SpecialCells(xlCellTypeBlanks).Address(0, 0)).Select  
       .Delete  
   End With  
   Application.DisplayAlerts = True  
End Sub  
предложенный KL (XL) 13 окт 08, 20:47, то он у меня почему-то не пошёл.  
Ни из модуля листа, ни из стандартного модуля, ни после замены With Worksheets.Add на предварительное назначение переменной :  
  Dim SHT As Worksheet: Set SHT = Worksheets.Add и уже после этого работой с ней:  
   With SHT  
...  
всё время вылетает в разные (в зависимости от того, где "лежит" код)ошибки на  
.Range(.UsedRange.SpecialCells(xlCellTypeBlanks).Address(0, 0)).Select
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
The_Prist,  
спасибо.  
Буду разбираться как это устроено...  
Уже нашел 2 бага:  
1. В последних трёх строчках кода должно быть не Clear, а ClearFormats чтобы очищалось не содержимое, а форматы. Ну, это я сразу исправил.  
2. Попробуйте поставить границы во всех ячейках какого-нибудь столбца и строки, потом примените макрос и увидите, что его действие ограничено столбцами от А до Q и строками от 1 до 26.  
Вне этого диапазона ни заливка ни границы (хотя они, кажется должны входить в UsedRange) не удаляются...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=The_Prist}{date=27.02.2010 04:31}{thema=}{post} Там подправить-то две строки.{/post}{/quote}  
Уже минут десять сижу и тупо построчно сравниваю коды post_104137.xls и post_104142.xls...  
Кроме того, что в последних трёх строчках кода стоИт не Clear, а ClearFormats никаких отличий не вижу...  
Я или слепой, или тупой, или смотрю не там...  
The_Prist, что подправлено-то ?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да, точно СЛЕПОЙ!  
Прошу прощения за лишний вопрос. Сам нашёл эти две строчки.  
Спасибо за работающий пример.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Наверх