Страницы: 1
RSS
Зависимость от имени CheckBox
 
Помогите, пожалуйста, с такой штукой (наверное, это просто, но у меня опыта еще не хватает).
Есть перечень имен, а есть Флажок (checkox) с определенным именем - в примере "Вася". При стоящей на Васе галке, столбец с именем "Вася" делается скрытым. Я сделал это вручную, т.е. посмотрел, в какой ячейке прописан Вася и ввел это значение в макрос. А как сделать, чтобы название Флажка было завязано с текстом в ячейке? То есть, если я заменю имя Флажка с Васи на Колю, макрос снова будет убирать Васю, на Колю ему плевать ), а хотелось бы четкой привязки.
Спасибо.

Код
Sub Флажок1_Щелчок()
Application.ScreenUpdating = False
   If ActiveSheet.CheckBoxes("Check box 1";).Value = 1 Then
       Cells(4, 6).Select
       Selection.EntireColumn.Hidden = True
    Else
       Cells(4, 6).Select
       Selection.EntireColumn.Hidden = False
    End If
Application.ScreenUpdating = True
End Sub
Изменено: Ungrateful - 17.02.2013 16:02:23
 
Так?
Согласие есть продукт при полном непротивлении сторон
 
Sanja, нет, он у вас прячет активный столбец. Куда курсор поставить, то и спрячет.

Ааа, рассмотрел еще два макроса, просто они не завязаны на Флажке. Сейчас поковыряюсь.
ActiveSheet.CheckBoxes("Check box 1").Characters.Text - похоже то, что мне нужно.
Только имя Флажка должно быть неизменным.

Грубо говоря, вижу макрос таким:
If ActiveSheet.CheckBoxes("Check box 1").Value = 1 Then
поиск имени чекбокса (ActiveSheet.CheckBoxes("Check box 1").Characters.Text) в заданном диапазоне
ячейка с найденным значением активна
Selection.EntireColumn.Hidden = True
Изменено: Ungrateful - 17.02.2013 15:56:55
 
Вариант с проверкой значения ячейки. В модуле листа:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Application.ScreenUpdating = False
    If Not Application.Intersect(Range("C3"), Target) Is Nothing Then
        
        For i = 6 To 16
            If Cells(3, 3).Value = Cells(4, i).Value Or Cells(3, 3).Value = Empty Then
                Columns(i).Hidden = False
            Else
                Columns(i).Hidden = True
            End If
        Next i
    End If
Application.ScreenUpdating = True
End Sub


Если С3 пустая, открываются все столбцы
 
Ungrateful, да, я знаю. Просто направление показал
Согласие есть продукт при полном непротивлении сторон
 
vikttur, интересная штука, спасибо, тоже поковыряю.
Как сделаю то, что хотел - выложу.
 
Получилось, но не до конца.
Макрос заработал для отдельного Флажка, но если привязываю цикл (чтобы этот макрос привязать сразу к двум флажкам), выдает ошибку...
Не подскажете, в чем тут фикус?

Код
Sub Флажок1_Щелчок()
Dim i As Integer
Dim p As Integer
Dim s As String
   p = 1
   s = "check box " & p
Application.ScreenUpdating = False

   'For p = 1 To 2
   For i = 1 To 15
       If ActiveSheet.CheckBoxes(s).Value = 1 Then
          If Cells(4, i).Value = ActiveSheet.CheckBoxes(s).Characters.Text Then
            Cells(4, i).Select
             Selection.EntireColumn.Hidden = True
          End If
       Else
          Cells(4, i).Select
          Selection.EntireColumn.Hidden = False
       End If
   'Next
   Next

   Cells(1, 1).Select
Application.ScreenUpdating = True
End Sub


Оформяйте код тэгами (кнопулечка такая есть для форматирования сообщения)[МОДЕРАТОРЫ]
Изменено: Ungrateful - 18.02.2013 00:05:35
 
тут такой фикус, что Вы присвоили
p = 1
s = "check box " & p

потом запускаете цикл, в котором Всегда "check box 1"

в примере код немного подчистил
 
Sergei_A, ооо, спасибо, все как надо!
Не подскажете, что такое ActiveSheet.Shapes(Application.Caller).Name в коде? Именно название (имя) приложения (в данном случае чекбокса)?
 
Это имя объекта, вызвавшего продцедуру
 
Sergei_A, странно, рабочий компьютер ругается на ActiveSheet.Shapes(Application.Caller).Name
Пишет, что компонент с указанным именем не найден.

И еще в коде такая проблема - не работает, если в ячейке стоит формат даты.
Изменено: Ungrateful - 18.02.2013 12:34:16
 
скиньте пример с датой
и скрин с отладчика когда ругается на Caller
 
Sergei_A, скидываю.
Интересно, что вроде бы ошибку выдает, но работает.
Изменено: Ungrateful - 18.02.2013 14:26:43
 
Вы нажмите на Debag, а потом уже сделайте скрин, и перезалейте в свой пост, плиз  :)  
и ещё, сколько планируете использовать чекбоксов?

Для решения вопроса с датами замените строчку
If .Value = cb.Characters.Text Then
на
If Format(.Value) = Format(cb.Characters.Text) Then
Изменено: Sergei_A - 18.02.2013 14:09:25
 
попробуйте заменить эту строчку на
s = Application.Caller
 
Sergei_A, спасибо огромное, все работает. Хотя, даже если написать s = Application.Caller, выдает ошибку. Я на нее забиваю, запускаю макрос и все работает.
Чекбоксов будет порядка 30. Это на что-то влияет?
 
Какой Excel на работе? Я проверил на 2007 и 2010 - ошибок нет. Может кто-то из гуру подскажет в чем может быть причина. Я не знаю

Спросил про количество, думая как можно обойти проблему. Каждому чекбоксу маленький макрос, в котором он записывает своё имя в переменную и вызывает основную продцедуру, передавая туда пременную с именем.

еще проверьте так
Код
On Error Resume Next
s = Application.Caller
On Error GoTo 0
Изменено: Sergei_A - 18.02.2013 16:05:54
 
А как макрос запускаете? Из отладчика поди? А надо по флажку топнуть. Тогда появится
Код
ActiveSheet.Shapes(Application.Caller).Name
 
Sergei_A,
RAN,
ошибка появляется, если запускаю в отладчике, да.
А если запускать непосредственно чекбоксом, то все нормально, как я и писал.
Теперь, кажись, догадываюсь, в чем дело :) До нажатия не существует такого имени, и оно берется от конкретного объекта, к которому я привязал макрос.
 
Ну ёкМакарёк  :D
 
Еще раз спасибо за помощь :)
Страницы: 1
Читают тему
Наверх