Вы не показали нам, где вы показываете 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
Это должно быть, но я не могу сказать, если этобудет работать для вас или нет, потому что вы не предоставили достаточно для работы, и код, который вы предоставили в своем примере, не скомпилируется.