Страницы: 1
RSS
Программное создание ToggleButton на рабочем листе
 
Прошу помощи в создании выключателя ToggleButton и обработки его события через код VBA. Имею два подхода, но оба заходят в тупик.
Код
Dim Toggle As OLEObject
Set Toggle = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ToggleButton.1", Link:=False, _
    DisplayAsIcon:=False, Left:=630, Top:=266.25, Width:=52.5, Height:=30)
Toggle.Object.Caption = "Toggle"
Этим кодом вполне корректно создаётся ToggleButton, но как привязать макрос сюда я не знаю. Toggle.OnAction не работает.
Код
With ActiveSheet.Buttons.Add(Left:=550, Top:=6, Width:=100, Height:=22.5)    
    .OnAction = "Module1.ToggleMacros"
    .Caption = "Toggle"
End With
Этот код делает то, что нужно и привязывает с помощью .OnAction нужный макрос. Вот только это обычная кнопка. Таким же образом можно создать Лэйбл или ТекстБокс, если вместо Buttons записать Labels или TextBoxes. Но вот ToggleButtons почему-то не работает.
 
у вас два подхода и оба тупиковые, а задача то какая?
возможно задача тупиковая, тогда все подходы заведут вас в тупик
давайте не о проблемах решения, а о задаче. которую решаете. сможете?
у меня в личной книге макросов есть такая кнопка переключения стиля ссылок из А1 в R1C1 и обратно
Код
Sub ToglRefStyle()
  With Application ' Togle between xlR1C1=-4150 and xlA1=1
    .ReferenceStyle = 1 - 4150 - .ReferenceStyle
  End With
End Sub

на панели быстрого доступа выведена кнопка для этого макроса я жму ее по 20-50-100 раз в день
вместо того чтобы нажимать:
Файл
Параметры
Формулы
Стиль ссылок R1C1
Ок
нажатие одной кнопки вместо 5 разных, к каждой из которых еще нужно доехать а потом попасть мышью
Изменено: Ігор Гончаренко - 26.06.2022 01:13:22
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, задача простейшая. Нужен переключатель, который будет округлять значения (баллы) в определённом столбце до целого и обратно.
То есть, при нажатом переключателе .NumberFormat = "0", а при отжатом .NumberFormat = "0.00".
Кнопка с этой задачей тоже хорошо справится: можно вместо переключения ToggleButton'a, сделать просто смену текста кнопки. Но всё же хотелось бы именно ToggleButton.
 
Код
Sub Togl0_00()
  With ActiveSheet.Shapes("Button 1").DrawingObject
    Columns(1).NumberFormat = .Caption
    .Caption = IIf(.Caption = "0", "0.00", "0")
  End With
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, но это заранее вставленная на лист кнопка. А нужна именно програмно создаваемая (и не кнопка, а именно ToggleButton) из макроса, так как заранее не известно ни место положение кнопки ни размер столбца. Что возвращает к той же проблеме, что невозможно это правильно создать на листе.
Изменено: StrangeCry - 26.06.2022 02:48:43
 
нужно - делайте
удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо за помощь.
 
Чтобы не оставлять тему без решения, привожу пример того, как решил проблему:
Код
Public Sub CreateToggleButton()
    Dim Toggle As OLEObject
    Set Toggle = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ToggleButton.1", Link:=False, _
        DisplayAsIcon:=False, Left:=630, Top:=266.25, Width:=52.5, Height:=30)
    Toggle.Object.Caption = "Toggle"
    Toggle.Name = "ToggleBut"
    With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
        .InsertLines .CountOfLines + 1, "Private Sub ToggleBut_Click()"
        .InsertLines .CountOfLines + 1, "   MsgBox ""OK"""
        .InsertLines .CountOfLines + 1, "End Sub"
    End With
End Sub
Код оператора With принудительно записывает три строки текста в код листа. В данном случае процедуру обработки события Click.
Итого и ToggleButton и обработка его события создаётся автоматически кодом VBA.
 
Цитата
StrangeCry написал:
Итого и ToggleButton и обработка его события создаётся автоматически кодом VBA
зачем?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
Цитата
StrangeCry написал:
Итого и ToggleButton и обработка его события создаётся автоматически кодом VBA
 зачем?
Затем, что это было темой данной темы: "Программное создание объекта на листе".
Конечный пользователь теперь будет крайне счастлив, что у него на листе есть кнопочка, которой он возможно никогда и не воспользуется)).
 
а чем отличается кнопка поставленная программно, от кнопки, которую я поставил вручную в сообщении 4
чем она лучше, чем она более функциональна??
действительно, КАКАЯ разница пользователю КАК она появилась на листе?????
можете допустить что пользователь взял и защитил лист (что ему помешает это сделать?) что в этом случае случится с вашей замечательной кнопкой?
смысл городить код, который поставит пользователя в полный ступор, когда появится сообщение об ошибке?
если смысл этого всего - просто поставить кнопку (кстати, где тут проблема ее поставить??) то поздравляю вас - задача успешно решена!)))
я за свою жизнь решил много бессмысленных задач, разница только в том, я что я не выносил это на всеобщее обозрение, мне было интересно, у меня было время - я решал бессмысленную задачу и рос над собой как программист)
и где там заявленный в теме Toggle???
так тему и назвали бы "вставить Toggle, который совсем не Toggle" и я бы просто не зашел в эту тему))
Изменено: Ігор Гончаренко - 27.06.2022 00:26:49
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
а чем отличается кнопка поставленная программно, от кнопки, которую я поставил вручную в сообщении 4чем она лучше, чем она более функциональна??
Вручную кнопки хорошо ставятся тогда, когда известно, где её нужно ставить. А если место, куда её нужно вставлять не определено, а лист даже ещё не создан, то мне кажется программный вариант как раз кстати.
Цитата
написал:
можете допустить что пользователь взял и защитил лист (что ему помешает это сделать?) что в этом случае случится с вашей замечательной кнопкой?
Про это даже не думал. Буду надеяться, что никто до такого не додумается)).
Цитата
написал:
если смысл этого всего - просто поставить кнопку (кстати, где тут проблема ее поставить??)
Проблема в том, что этой кнопкой был Toggle. Как мне подсказали из одной книги, он не относится к “стандартным” элементам управления, а значит вполне логично, что может работать некорректно. Видимо, поэтому и получается, что во втором варианте кода в первом сообщении Buttons.Add работает, Labels.Add работает, TextBoxes.Add работает, CheckBoxes.Add работает, а ToggleButtons.Add не работает.
Цитата
написал:
я за свою жизнь решил много бессмысленных задач, разница только в том, я что я не выносил это на всеобщее обозрение, мне было интересно, у меня было время - я решал бессмысленную задачу и рос над собой как программист)
Ну, вот убил я целый день на какую-то кнопку и "вырос как программист"). Может теперь когда-то кому-то и пригодится в поиске.
Цитата
написал:
и где там заявленный в теме Toggle???
Вообще-то, там в 12 строках кода 6 Toggle (специально не переименовывал, чтобы было видно). Хотя, любой другой элемент тоже должен работать.  
Страницы: 1
Наверх