Страницы: 1
RSS
скрыть/показать строки по кнопке (а их будет много)
 
Прошу помощи в конкретном коде.  
В прайсе много позиций у которых опятьже много модификаций. Нужно сдеделать показ скрытых строк по кнопке, расположенной в ячейке описания товара (приложено в файле). группировать строки по "плюсику" будет человек ведущий прайс. он же будет копировать эту кнопку на вновь добавляющиеся позиции.    
 
Сейчас скрывать кнопка уже умеет, а на раскрытие - ошибка. Поскажите, что не так в коде?  
Да, знаю что можно узнать верхний левую ячейку, на которой расположен объект. Исходя из этого кнопка будет знать, какие строки ей скрывать/раскрывать (первая из скрываемых/раскрываемых строк - текущая + 1).    
 
А вот как будет обстоять дело с копированием прямоугольника-кнопки? он Будет получать новое имя или сохранять прежнее? в моём примере он сохранил имя "Прямоугольник 8" и при копировании макрос на нём же и остаётся висеть. Но разве объекты одинаковые имена могут иметь?
 
Лучше отталкиваться от ЧекБокса (флажок)  
 
Private Sub CheckBox1_Click()  
If CheckBox1.Value = True Then  
   Rows("4").ShowDetail = Not Rows("4").ShowDetail  
   CheckBox1.Caption = "Показать"  
Else  
   Rows("4").ShowDetail = Rows("4").ShowDetail  
   CheckBox1.Caption = "Скрыть"  
End If  
End Sub
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
 
спасибо за предложенный вариант, но с кнопками подходит, a с чекбоксами - нет.  
 
подскажите решение по вот такому моменту.    
я создал кнопку (вернее прямоугольник с повешенным на него макросом), она раскрывает/закрывает сгруппированные по плюсику ("+" слева) строки ниже себя.  
 
теперь нужно распространить её на все позиции в прайсе. я руками копирую "кнопку". свои свойства и привязанный макрос она сохраняет. проблема в том что я непосредственно указываю в макросе имя "кнопки". возможно ли в vba для чтения её свойства ".TopLeftCell" каким-либо образом не указывать имя её, а записать такую конструкцию, которая давала ссылку на на что-нибудь вроде "текущий выбранный шейп" или "шейп под курсором" или "активированный шейп"?  
 
буду очень благодарен!
 
Смотрите в сторону Application.Caller
 
Вот небольшой пример применения Application.Caller
 
Смотрите, так? В архиве xlsb.
 
ура! получилось!  
 
код работает! можно ли здесь ещё что-нибуь причесать?  
 
Юрий М, спасибо за подсказку! Ни разу бы не догадался! Правда, в вашем примере при копировании вручную ваших объектов (кружков) имя они сохраняли. А нарисовал новый прямоугольник и копировал его - имена менялись! Это от чего зависит, от версии Офиса? (у меня 2010).  
 
------------  
Sub knopka()  
  Const pok As String = "Показать", skr As String = "Скрыть"  
   Dim drawbut As Object, shapebut As Object  
   Set drawbut = ActiveSheet.DrawingObjects(Application.Caller)    'для переименовывания без Select  
   Set shapebut = ActiveSheet.Shapes(Application.Caller)           'для получения свойста .TopLeftCell  
   If drawbut.Text = pok Then  
       drawbut.Text = skr  
       Rows(shapebut.TopLeftCell.Row).ShowDetail = True  
   Else  
       drawbut.Text = pok  
       Rows(shapebut.TopLeftCell.Row).ShowDetail = False  
   End If  
   End Sub  
------------
 
Igor67, за ваш пример тоже спасибо, не знал про IIF :)  
только экран дёргается. а без затрагивания ScreenUpdating выглядит красивее, правда что будет на тяжёлых листах, с большим кол-вом позиций и их модификаций и необработанными фотками (юзеры даже не чешутся уменьшать размер прайса) - не ясно пока :)
 
В моём последнем примере если пытаться скрыть скрытые строки - возникала ошибка.  
Переделал с испольозванием IIf. Теперь макрос причёсан основателно :)  
 
---------  
Sub knopka()  
   Dim shapebut As Object, hid As Boolean  
   Set shapebut = ActiveSheet.Shapes(Application.Caller)  
   hid = Rows(shapebut.TopLeftCell.Row).ShowDetail  
   Rows(shapebut.TopLeftCell.Row).ShowDetail = IIf(hid = False, True, False)  
   shapebut.TextFrame.Characters.Text = IIf(hid = False, "Скрыть", "Показать")  
End Sub  
---------  
 
Да, а возможно ли скрыть левое поле группировки строк на листе? (где плюсики "+" находятся)?
 
ActiveWindow.DisplayOutline=False
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
спасибо!  
 
 
снова препядствие. на защищищённом листе скрытие/раскрытие не работает.  
(ни просто скрытых строк, ни группированнных по плюсику "+").  
возможно ли как-то обойти эту особенность?    
на ум приходит только снимать защиту сразу после нажатия на кнопку и защищать после произведённых действий...
 
всё, отбой! нашёл нужную статью, там есть: http://www.planetaexcel.ru/tip.php?aid=281
 
снова по защите вопрос:    
для изменения надписи на кнопке-фигуре (макросом) пришлось разрешить изменение рисованных объектов, но размеры и присутствующие фото очень не хотелось бы позволять трогать - только изменение надписи (основного текста).  
 
можно ли обойти?
 
Timex, а если банально отключать и включать защиту при запуске макроса?  
Игорь67
 
Игорь67, да, так работает, и внешне выглядит как надо.    
Но тогда пароль остаётся в макросе и его любой сможет выцепить.  
(а у нас прайс такой, что конкуренты могут поменять шапку, реквизиты и выдавать за свой)  
Я думал, что существует какой-то другой способ...
 
... Но тогда пароль остаётся в макросе-???  
А Вы уверены что конкуренты уже не сняли защиту:)  
Тогда пароль в макрос, а модуль ВБА закрыть паролем. В принципе, говорят, почти одинаково по стойкости:)
 
пароль листа - вообще никакущий по стойкости (самолично видел - здесь на форуме, недавно, код, подбирающий аналог такого пароля за пару минут максимум)  
пароль файла - сильно зависит от метода шифрования (со слов ZVI, а он не обманывает).  
пароль проекта - думаю, по стойкости что-то промежуточное.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
{quote}{login=ikki}{date=12.05.2012 11:55}{thema=}{post}  
пароль проекта - думаю, по стойкости что-то промежуточное.{/post}{/quote}  
а как из макроса поставить пароль на vba проект (не на самого себя, а на другую книгу)?
 
обнаружил глюк.    
 
защищаю лист вот так:  
 
ActiveSheet.Protect Password:="1111", UserInterfaceOnly:=True, DrawingObjects:=True, Contents:=True, Scenarios:=True  
 
защитил, проверяю - кнопка работает.    
сохраняю, закрываю Excel.  
открываю снова - ругается на изменени свойства .ShowDetail.  
 
меняю в строчке защиты Contents:=True на Contents:=False - так всё работает, но позволяет юзеру менять значения в ячейках. а это нехорошо.  
 
как быть?
Страницы: 1
Читают тему
Наверх