#excel #vba #radio-button #label #userform
#excel #vba #переключатель #ярлык #пользовательская форма
Вопрос:
Я использую пользовательскую форму Excel VBA, где вопросы динамически отображаются в виде заголовков меток, и все отображаемые вопросы имеют рядом с ними группу кнопок «Да / нет».
Я пытаюсь вернуть заголовки меток и выбранный ответ, но Excel, похоже, случайным образом выбирает кнопки выбора.
Что у меня есть:
- Вопрос 1 — Ответ 3
- Вопрос 2 — Ответ 1
- Вопрос 3 — Ответ 2
Мне нужен текстовый вывод, который я затем могу скопировать в электронное письмо, что-то вроде этого:
- Вопрос 1 — Ответ 1
- Вопрос 2 — Ответ 2
- Вопрос 3 — Ответ 3
Странно то, что иногда порядок последних вопросов меняется местами. (Я даже изменил индекс вкладки, но это не помогло).
Чего мне здесь не хватает?
Спасибо за вашу помощь.
Метки называются Label1, Label2, Label3 и т.д. Кнопки выбора называются Optbtn1y, Optbtn1n, Optbtn2y, Optbtn2n, Optbtn3y, Optbtn3n и т.д.
Private Sub returnoptbttnv()
'determine name and caption of all enabled OptionButtons in a Frame
Dim ctrl As Control
Dim Lbel As Control
Dim txt1 As String
Dim txt2 As String
txt1 = ""
txt2 = ""
For Each Lbel In Frame2.Controls
If TypeName(Lbel) = "Label" And Lbel.Visible = True Then
txt1 = Lbel.Caption
End If
Next Lbel
For Each ctrl In Frame2.Controls
If TypeOf ctrl Is MSForms.OptionButton Then
If ctrl.Value = True And ctrl.Visible = True Then
txt2 = ctrl.Caption
End If
End If
Next ctrl
MsgBox (txt1 amp; txt2)
End Sub
Ответ №1:
Похоже, одно из ваших требований — вернуть список всех вопросов и ответов. Я выбрал другой подход, не просматривая коллекцию элементов управления:
Private Function GetAnswers() As String
On Error Resume Next
Dim i As Integer
Dim question As MSForms.Label
Dim answer As MSForms.OptionButton
GetAnswers = ""
i = 0
Do
i = i 1
Set question = Nothing
Set question = Me.Frame2.Controls("Label" amp; i)
If question Is Nothing Then Exit Do
If question.Visible Then
Set answer = Me.Frame2.Controls("Optbtn" amp; i amp; "Y")
If Not answer.Value Then Set answer = Me.Frame2.Controls("Optbtn" amp; i amp; "N")
GetAnswers = GetAnswers amp; question.Caption amp; " - " amp; answer.Caption amp; vbCrLf
End If
Loop
End Function
Комментарии:
1. Спасибо, Брайан, ты читаешь мои мысли, это именно то, что я искал. Очень признателен.
Ответ №2:
Для любой конкретной видимой метки вы можете получить ее Name
, и из нее вы можете получить имена соответствующих кнопок выбора «Да» и «Нет» и напрямую проверить их статус.
Private Sub returnoptbttnv()
'determine name and caption of all enabled OptionButtons in a Frame
Dim ctrl As Control
Dim Lbel As Control
Dim txt1 As String, optBase As String, y As Boolean, n As Boolean
For Each Lbel In Me.Frame2.Controls
If TypeName(Lbel) = "Label" And Lbel.Visible Then
optBase = Replace(Lbel.Name, "Label", "Optbtn") 'option button "base name"
y = Me.Frame2.Controls(optBase amp; "y").Value
n = Me.Frame2.Controls(optBase amp; "n").Value
txt 1 = txt1 amp; Lbel.Caption amp; " ------ " amp; _
IIf(y, "Yes", IIf(n, "No", "")) amp; Chr(10)
End If
Next Lbel
MsgBox txt1
End Sub
Комментарии:
1. Спасибо, Тим, ваш ответ тоже работает отлично, у него просто странная проблема с заменой двух последних меток, о которых я упоминал выше, но я знаю, что это как-то связано с моим кодом, с которым я в конце концов разберусь. Поэтому я пока принял другой ответ. Ценю вашу помощь.
2. Если он меняет метки, то, вероятно, имена элементов управления не соответствуют их заголовкам.
3. Да, так оно и было. Я только что очистил свой код и обнаружил, что экспериментирую с материалом, просто забыл удалить строку, которая восстанавливала последние две строки… Я все время знал, что это я. Большое спасибо.