Страницы: 1 2 След.
RSS
Группировка строк
 
Подскажите, как в рамках VBA определить существуют ли на Листе сгруппированные строки или нет??? (т.е. прменялся ли на Листе метод Group для каких-либо строк ???).
 
неужели никто не сталкивался с такой необходимостью
 
{quote}{login=Евгений}{date=31.10.2008 05:01}{thema=}{post}неужели никто не сталкивался с такой необходимостью{/post}{/quote}Значит не сталкивался.  
Может расскажете зачем нужна такая информация, а мы тут подумаем над альтернативой.
Bite my shiny metal ass!      
 
Вот 2 макроса. 1-й проверяет, есть ли группировка строк, а 2-й проверяет, есть ли группировка столбцов на активном листе  
 
Sub CheckRowsForGroup()  
Dim iRow As Range  
   For Each iRow In ActiveSheet.UsedRange.Rows  
       If iRow.OutlineLevel > 1 Then  
           MsgBox "На активном листе есть группировка строк!", 64, "Группировка строк"  
           Exit Sub  
       End If  
   Next  
   MsgBox "На активном листе нет группировки строк!", 64, "Группировка строк"  
End Sub  
 
 
Sub CheckColumnsForGroup()  
Dim iCol As Range  
   For Each iCol In ActiveSheet.UsedRange.Columns  
       If iCol.OutlineLevel > 1 Then  
           MsgBox "На активном листе есть группировка столбцов!", 64, "Группировка столбцов"  
           Exit Sub  
       End If  
   Next  
   MsgBox "На активном листе нет группировки столбцов!", 64, "Группировка столбцов"  
End Sub  
 
P.S. Основано на основе макросов из этой темы с соседнего форума    
http://forum.sql.ru/forum/actualthread.aspx?tid=357196
 
Огромное спасибо Pavel55! О свойстве OutlineLevel - действительно знать надо!  
По поводу вопроса Лузера "Зачем это надо?".    
Когда выполнение программы осуществляет ту или иную перегруппировку строк, то действие метода Ungroup для случая когда на листе не оказалось сгруппированных строк приводит к ошибке (мол, ничего не могу разгрупировать). В этом случае требуется проверка наличия или отсутствия таких группировок.
 
Pavel55 а может ты знаешь ответ на еще один подобный вопрос!  
Как определить факт наличия или отсуствия выделенных ячеек (например, после действия SpecialCells). В этом случае также программа будет ругаться если производить действия с отсутствием выделенных ячеек.  
Заранее благодарю!!
 
всегда есть хотя бы одна выделенная ячейка
 
{quote}{login=Артем}{date=31.10.2008 02:04}{thema=}{post}всегда есть хотя бы одна выделенная ячейка{/post}{/quote}  
 
Тогда уточняю....  
одна или более одной выделенной ячейки
 
эм, не очень понял вопрос, но попробуйте так  
 
 
Sub Макрос1()  
   If Selection.Cells.Count > 1 Then  
       MsgBox "Выделено более одной ячейки! А именно: " & Selection.Cells.Count, 64, ""  
   Else  
       MsgBox "Выделена одна ячейка!", 64, ""  
   End If  
End Sub
 
{quote}{login=}{date=31.10.2008 09:58}{thema=Re: }{post}{quote}{login=Артем}{date=31.10.2008 02:04}{thema=}{post}всегда есть хотя бы одна выделенная ячейка{/post}{/quote}  
 
Тогда уточняю....  
одна или более одной выделенной ячейки{/post}{/quote}  
Ну и уточнение. Одна ведь ВСЕГДА есть. Значит проверка по ТАКОМУ "уточненному" условию всегда даст истину. Правильно вам Павел пишет: БОЛЬШЕ одной.
 
Уточняю задачу.  
1). Создается объект Selection с выделением всех формул на листе с помощью  
SpecialCells(xlCellTypeFormulas, 23)  
2). Если на листе есть хоть одна формула, то с Объектом Selection можно производить дальнейшие какие-либо действия. Однако есть формул нет, то VBA выдаст ошибку, что понятно и разумно.    
Однако встает задача, как заранее выявлять такие ситуации, чтобы не производить действий с несуществующим объектом.    
 
Теперь задача понятна?
 
Евгений, думаю, что если бы сразу повели разговор о проверке наличия на листе формул, ответ давно бы получили. Вот посмотрите обсуждение:  
http://www.planetaexcel.ru/forum.php?thread_id=3405  
Может что полезное для Вас найдётся.
 
Ещё вот что: следующий макрос выделит на листе все ячейки с формулам:  
- - -  
Sub Макрос1()  
Selection.SpecialCells(xlCellTypeFormulas, 23).Select  
End Sub  
- - -  
Вставляем проверку Павла:    
If Selection.Cells.Count > 1 Then  
легко посчитает их количество. Вроде задача решена?
 
Не знаю, правильно или нет  (в плане, может как-то короче можно или нет)  
 
Sub Макрос1()  
Dim FormulasRng As Range  
 
   On Error Resume Next  
   Set FormulasRng = Selection.SpecialCells(xlCellTypeFormulas, 23)  
   If Not FormulasRng Is Nothing Then  
       FormulasRng.Select  
       MsgBox "Формулы на листе выделены!", 64, ""  
   Else  
       MsgBox "Формул на листе нет!", 48, ""  
   End If  
   On Error GoTo 0  
End Sub
 
Павел, я думаю, что если достаточно проверить наличие, то можно так:  
Sub Макрос2()  
Selection.SpecialCells(xlCellTypeFormulas, 23).Select  
If Selection.Cells.Count > 1 Then  
  MsgBox "Больше одной"  
End If  
Или проверка больше нуля. Ведь, вроде в этом основная задача.
 
Юрий, а вы пробовали запустить свой макрос в Excel?
 
Конечно! Вот он. А что-то не так?
 
Павел, ну сколько можно томить неизвестностью? Я уже (кроме синтаксиса) проверил: орфографию, стилистику, рифму... Чта Вас смутило?
 
Кажется понял что - отсутствие строчки  
On Error Resume Next?
 
Угу, если на листе не будет ни одной формулы, то выскочит ошибка 1004.
 
Спасибо Вам Юрий М и Вам Pavel55 за обсуждение проблемы.  
Я ранее пытался через свойство Count осуществлять проверку и обходить возможную ошибку-ничего не получалось (Exel ругался). Однако, я не делал через свойство Cells.Count (как Вы предлагаете).    
Попытаюсь проверить теперь таким образом.  
Предложение от Pavel55 с помощью On Error сейчас так рассматриваю.
 
Вы правильно поняли мою проблему (именно выскакивание ошибки 1004)
 
Как требуют старшие товарищи, и правила хорошего поведения в Excel добавил проклятую строчку. Теперь при отсутствии формул на листе орать не будет, зараза...
 
Юрий, немного не так - проверьте. У Павла - коректнее.  
Можно еще немного упростить:  
Sub Макрос()  
 On Error Resume Next  
 With Selection.SpecialCells(xlCellTypeFormulas, 23): End With  
 If Err = 0 Then  
   MsgBox "Есть формулы"  
 Else  
   MsgBox "Нет формул"  
 End If  
End Sub  
 
Но методу SpecialCells() доверять можно не всегда.  
Попробуйте, например, в ячейку A1 ввести любую формулу, например =1+1, а ячейку A2 оставьте пустой.  
Затем скопируйте эту парочку ячеек A1:A2 в диапазон, например, A3:A17000  
Выделите всю колонку A:A и попробуйте теперь выделить только формулы с помощью:  
Sub НеВсегдаДоверяйтеSpecialCells()  
 Selection.SpecialCells(xlCellTypeFormulas, 23).Select  
End Sub  
Выделенной останется вся колонка A:A  
;-)
 
ZVI, а если в Вашем примере не выделять столбец А и запустить макрос, то вообще ничего не происходит (ничего не выделяется). Я думаю, что это связано с ограничением количества несмежных ячеек. Сейчас не вспомню, но, вроде, количество несмежных ячеек не должно превышать какое-то количество.
 
Павел, все верно.  
Для .SpecialCells() существует ограничение - не более 8192 областей (Areas).  
В моём примере каждая пара смежных ячеек - это область, так как одна из ячеек пустая.  
Если выделить 8192 таких пар ячеек A1:A16384, то все сработает нормально.    
Но стоит выделить на одну ячейку больше A1:A16385 и лимит будет превышен, и метод .SpecialCells() соврет.  
Особое коварство этого метода заключается в том, что при превышении лимита областей в обрабатываемом диапазоне .SpecialCells() возвращает не особые (формулы и т.п.), а все ячейки.
 
Вот, сейчас проверил. Если ввести формулу =1+1 в ячейку А1, выделить А1 и А2 и скопировать их до ячейки 16383, т.е. количество ячеек с формулами будет равняться 8192, то ячейки с формулами нормально выделяются.  
Вывод: Если несмежных ячеек с формулами больше, чем 8192, то метод SpecialCells работает неправильно. А если несмежных ячеек меньше, чем 8192, то всё прекрасно работает.
 
угу) Пока писал, вы уже ответили )
 
Павел, это тот случай, когда лучше мы с Вами вдвоем напишен, чем понадеемся друг на друга на ночь глядя и заснем :-)  
 
На всякий случай - вот еще и ссылка:  
http://support.microsoft.com/default.aspx?scid=kb;en-us;832293  
 
Там однозначно написано, что при попытке выделить вручную будет выведено сообщение об ошибке, а если с помощью VBA - то ничто и не вякнет об ошибке.    
Зачем такая запядня - не знаю, скорее всего это атавизм.  
Некоторые успокаивают, что этот лимит случается редко, другие рекомендуют сначала проверять .Areas.Count <= 8192.  
Но если лимит превышен, то потребуется писать код для иного метода, например, дробить диапазон пополам, пока превышен лимит, а затем разбираться с каждым таким фрагментом.
 
По поводу .Areas.Count - у меня не считается, если их больше 8192, т.е. если меньше то пишет, например, 8190, а если больше, то просто 1. А у Вас? Меня это удивило, как же определить, что диапазонов больше?
Страницы: 1 2 След.
Читают тему
Наверх