Изменить заголовок метки с помощью цикла в пользовательской форме VBA - PullRequest
0 голосов
/ 02 октября 2019

Я хочу, чтобы мой код циклически проходил по диапазону ячеек и каждый раз отображал содержимое ячейки (это вопрос) в заголовке метки пользовательской формы и позволял пользователю выбирать кнопку «Да» (длязная ответ) или "НЕТ" (не зная ответа), а затем код использует ответ пользователя для выполнения некоторых действий, а затем продолжает цикл для других ячеек.

Для каждой итерации цикла for мне нужнопользователю будет разрешено выбрать «Да», «Нет» или «Отмена», после чего код пользовательских форм продолжит работу.

Вот часть кода:

Private Sub UserForm_Activate()

For i = 2 To n
Cells(i, 3) = Cells(i, 3) + 1 
If Cells(i, 3) = 1 Then 
    UserForm1.Controls("question").Caption = Cells(i, 1).Value 'lable 1 
    UserForm1.Controls("answer").Caption = ""                  'lable 2               
    'some codes...
elseIf Cells(i, 3) = 3 Then
UserForm1.Controls("question").Caption = Cells(i, 1).Value 'lable 1 
UserForm1.Controls("answer").Caption = ""                  'lable 2  
next
end sub

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

Private Sub ansYes_Click() 'If user clicks Yes show the answer and continue
  UserForm1.Controls("answer").Caption = Cells(i, 2)
  UserForm1.Controls("answer").Visible = True
End Sub
Private Sub ansNo_Click()  'If user clicks No show the answer and continue
  UserForm1.Controls("answer").Caption = Cells(i, 2)
  UserForm1.Controls("answer").Visible = True
Cells(i, 3) = 0
Cells(i, 4) = 1
End Sub
Private Sub ansCancel_Click() 'If user clicks cancel unload userform and exit the for loop
  Unload UserForm1
End Sub

1 Ответ

0 голосов
/ 05 октября 2019

Вы не показали нам, где вы показываете UserForm или как оно определено в вашем проекте, и вы не дали хорошее описание проблемы. Это заставляет предположения, которые могут быть неточными.

Не называйте свой UserForm "UserForm1", дайте ему полезное имя. Впредь я буду называть это «UserResponseForm»

Не использовать экземпляр по умолчанию UserForm, использовать переменную и узнать разницу между Dim As и Dim As New. Разница значительна и важны.

Dim myForm As UserResponseForm

Dim myForm As New UserResponseForm

Используя окно свойств UserResponseForm, найдите и переименуйте ваши метки «Вопрос» и «Ответ»

В коде UserResponseForm используйте Ctrl+ H заменить:

UserForm1.Controls("answer") на Me.Answer

и

Unload UserForm1 на Me.Hide

Переместить весь код изPrivate Sub UserForm_Activate к обычному модулю. Дайте модулю и сабвуферу полезное имя. Я буду называть модуль «QuestionaireCodeModule», а подпрограмму - «RunTheQuestionnaire»

. QuestionaireCodeModule должен выглядеть примерно так:

Option Explicit

Private Const n As Long = 20 'you didn't show how n was populated or scoped so I put it here

Sub RunTheQuestionaire()

    Dim i As Long
    Dim myForm As New UserResponseForm 

    For i = 2 To n

        Cells(i, 3) = Cells(i, 3) + 1 

        If Cells(i, 3) = 1 Or Cells(i, 3) = 3 Then 'added or condition for clarity
            myForm.Question.Caption = Cells(i, 1).Value 'lable 1 
            myForm.Answer.Caption = vbNullString                 'lable 2        

            'some codes...

            'next three lines removed because they are redundant
        'elseIf Cells(i, 3) = 3 Then
            'UserForm1.Controls("question").Caption = Cells(i, 1).Value 'lable 1 
            'UserForm1.Controls("answer").Caption = ""                  'lable 2  

        End If

        myForm.Show
        If Not myForm.Visible Then Exit For

    Next i

End Sub

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

...