С помощью VBA определите, какая кнопка выбора в сгруппированном наборе выбрана в PowerPoint

#vba #radio-button #powerpoint

Вопрос:

Я перепробовал так много вариантов, но безуспешно, что потерял рассудок. Мне нужно задать группу переменных, в зависимости от того, какая кнопка выбора выбрана в данной группе. Есть 3 группы, просто обозначенные как OptionGroup1, OptionGroup2 и OptionGroup3. Когда кнопка «Пуск» выполняется, мне нужно определить, какие параметры выбраны, и установить соответствующие переменные для использования в другом месте кода. PowerPoint определенно не то же самое, что excel, и я, похоже, не могу подобрать для него правильный синтаксис. Эта конкретная попытка дает мне «ошибку времени выполнения 438», «объект не поддерживает это свойство или метод».

 Set myDocument = ActivePresentation.Slides(1)  Select Case myDocument.Shapes.GroupName = OptionGroup2    Case Is = 1: ACLDelay = 1  Case Is = 2: ACLDelay = 2  Case Is = 3: ACLDelay = 3  Case Is = 4: ACLDelay = Int((4 * Rnd)   1)   End Select   Select Case myDocument.Shapes.GroupName = OptionGroup1   Case Is = 1: RunInt = 15  Case Is = 2: RunInt = 60  Case Is = 3: RunInt = 30  Case Is = 4: RunInt = 5   End Select  Select Case myDocument.Shapes.GroupName = OptionGroup1   Case Is = 1: MODDelay = 1.5  Case Is = 2: MODDelay = 1  Case Is = 3: MODDelay = 2  Case Is = 4: MODDelay = 0.5   End Select  

Комментарии:

1. Похоже, вы совершенно не понимаете, как использовать конструкцию Select в VBA, а также как получить доступ к кнопкам в группе опций. Возможно, если бы вы могли добавить изображение своей формы к своему вопросу, все стало бы немного яснее. Также было бы полезно, если бы вы указали названия кнопок в каждой группе опций.

2. Можете ли вы лучше объяснить, чего вы хотите добиться? Shapes у собственности нет GroupName собственности. Что должно означать от 1 до 4 в вашем коде? Имеют ли кнопки опций такие названия и ссылается ли на них код? В любом случае, ваш подход неверен, но для того, чтобы вам помогли, вам нужно дать нам понять, что вы хотите делать…

Ответ №1:

Пожалуйста, попробуйте следующий способ. «Opt1», «Opt1» и т.д. Должны быть названиями кнопок опций (вы также можете использовать их заголовок, но код должен быть адаптирован).:

 Sub testOptButtGroupName()  Dim ap As Presentation, sh As Shape, opB As MSForms.OptionButton  Dim RunInt As Long, ACLDelay As Long 'you probably have to declare these variable at the module level  Set ap = ActivePresentation  For Each sh In ap.Slides(1).Shapes  If sh.Type = msoOLEControlObject Then  If TypeName(sh.OLEFormat.Object) = "OptionButton" Then  Select Case sh.OLEFormat.Object.GroupName  Case "OptionGroup1"  Select Case sh.Name  Case "Opt1"  If sh.OLEFormat.Object.Value = True Then RunInt = 15  Case "Opt2"  If sh.OLEFormat.Object.Value = True Then RunInt = 60  'and so on...  End Select  Case "OptionGroup2"  Select Case sh.Name  Case "Opt5"  If sh.OLEFormat.Object.Value = True Then ACLDelay = 1  Case "Opt6"  If sh.OLEFormat.Object.Value = True Then ACLDelay = 2  'and so on...  End Select  'and so on...  End Select  End If  End If  Next  Debug.Print RunInt, ACLDelay End Sub  

На самом деле, использование имени элементов управления не требует использования их членства в группе…

Сейчас я покину свой кабинет. Если что-то не ясно, не стесняйтесь обращаться за разъяснениями. Я уточню их, когда буду дома.

Комментарии:

1. Спасибо за помощь, я пошел с проверенным и верным утверждением IF для простейшего, хотя и не самого эффективного.

2. @Hareborn Я не использую VBA в PowerPoint. Я попытался найти способ «извлечь» необходимый объект и просто поиграл с VBA. У меня есть вопрос: не myDocument.Shapes.GroupName вызвала ли строка ошибку? Формы не должны обладать GroupName свойством… Теоретически это должно быть только у объекта кнопки выбора. Имеет ли коллекция фигур такое (скрытое) свойство в PowerPoint? Вы можете использовать каждое событие кнопки выбора Click , чтобы придать необходимое значение в тот момент, когда его значение изменяется, True и просто использовать их при необходимости… Это должно быть наиболее эффективным способом обращения с ними

3. Да, у него есть свойство «Имя группы», но я не смог найти способ получить к нему доступ. Каждая попытка возвращала «Ошибку времени выполнения 438» «Объект не поддерживает это свойство или метод». Побочный вопрос, я больше не помню, как отмечать код в комментариях, я не был здесь много лет.

4. Эта ошибка «сказала» именно то, что у нее его нет… Я имею в виду коллекцию «Простыней». Он принадлежит только определенному объекту, как вы можете видеть в опубликованном коде. Теперь я закрываю свой ноутбук…

5. Свойство GroupName действительно существует, поскольку это то, что я использовал в окне свойств в VBA, чтобы назначить кнопки опций их конкретным группам. В коде вы также можете назначить и изменить имя группы. Я просто не мог найти способ запросить имя группы, чтобы узнать, какая кнопка в группе была активна.

Ответ №2:

В качестве стартового для 10 вам необходимо реорганизовать конструкцию Select для групп опций.

 Select Case MyDocument.Shapes.Groupname   Case OptionGroup1    Case optionGroup2    Case OptionGroup3     End Select  

Приведенная выше конструкция будет работать, если ‘MyDocument.Формы.Имя группы, опция группа1,2,3’ все строки, которые можно сравнить. Чтобы узнать, что происходит в каждом конкретном случае, вам необходимо предоставить информацию, запрошенную в моем комментарии выше. Я обновлю этот ответ, когда вы это сделаете.

Комментарии:

1. Вы проверяли этот подход? Свойство shapes не имеет такого Groupname свойства…

2. @FaneDuru, Какая часть «Вышеупомянутой конструкции будет работать, если» MyDocument. Формы. Имя группы, опция группа1,2,3′ все строки, которые можно сравнить. — разве ты не понял?

3. Конструкция MyDocument.Shapes.Groupname вызовет ошибку, потому что, как я предположил, Groupname не существует между MyDocument.Shapes свойствами. Вот почему я спросил, проверяли ли вы его. Возможно, у вас есть более приятная установка PowerPoint…

4. @FaneDuru, Чтобы сделать это проще, что значит «Если», ты не понимаешь.

5. Я создаю 3D-анимированную программу тестирования времени для конвейерной системы для определения оптимизации времени выполнения. Система имеет 4 типа пользовательских входов для изменения скорости различных секций конвейера. Каждый раздел пользовательского ввода имеет четыре варианта управления скоростью, то есть 4 раздела с 4 вариантами. В каждой из 4 секций также есть 3 анимированные независимо движущиеся секции, которые управляются скоростью ввода пользователем. 3 группы кнопок выбора, перечисленные выше, независимы друг от друга и имеют 4 варианта ввода скорости

Ответ №3:

Я использовал простые утверждения IF, чтобы решить свою проблему. Это, безусловно, не самый эффективный метод, но на данный момент он работает.

 If OptionButtonACL1s.Value = True Then  ACLDelay = 1 End If If OptionButtonACL2s.Value = True Then  ACLDelay = 2 End If If OptionButtonACL3s.Value = True Then  ACLDelay = 3 End If If OptionButtonACLr.Value = True Then  ACLDelay = Int((10 * Rnd)   1) End If  If OptionButtonMOD5s.Value = True Then  MODDelay = 0.5 End If If OptionButtonMOD1s.Value = True Then  MODDelay = 1 End If If OptionButtonMOD15.Value = True Then  MODDelay = 1.5 End If If OptionButtonMOD2s.Value = True Then  MODDelay = 2 End If  If OptionButtonRT5m.Value = True Then  RunInt = 5 End If If OptionButtonRT15m.Value = True Then  RunInt = 15 End If If OptionButtonRT30m.Value = True Then  RunInt = 30 End If If OptionButtonRT1h.Value = True Then  RunInt = 60 End If