Возвращает заголовок метки и соответствующий заголовок кнопки выбора в виде списка

#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. Да, так оно и было. Я только что очистил свой код и обнаружил, что экспериментирую с материалом, просто забыл удалить строку, которая восстанавливала последние две строки… Я все время знал, что это я. Большое спасибо.