...ainda não entendi exatamente porque desse jeito ter funcionado e do outro jeito não, se puder explicar eu agradeço.
Imediatamente antes de vc executar o código, ele é compilado na memória e toda a cadeia hierárquica dos objetos é analisada. Como o objeto não existia no momento da compilação, pois ele foi criado "durante o vôo", ele não estará (no momento da compilação) na linha hierárquica do objeto pai, no caso o UserForm2. Já a coleção de objetos é dinâmica e pode ser criada, modificada, excluída, renomeada, etc. em runtime.
Veja que usando a coleção, vc não se refere à ele através de seu CodeName (pq ele ainda não existe) e sim através de seu nome mesmo (string).
O que vc poderia fazer é usar uma variável pública para o objeto recém-criado e usá-lo ao invés de referir-se ao nome:
Public chkB1 As MSForms.CheckBox
Sub Teste()
Dim n As Integer
n = 0
If optc.Value = True Then
For ID = 1 To 7
If ID = 1 Or ID = 3 Or ID = 6 Or ID = 7 Then
n = n + 1
chkB = "chk" & n
recomend = Application.VLookup(ID, ThisWorkbook.Sheets("Dados").Range("Recomend"), 5, False)
Set chkB1 = UserForm2.Controls.Add("Forms.CheckBox.1")
chkB1.Name = chkB: chkB1.Caption = recomend: chkB1.Top = 50 * n: chkB1.Left = 60
chkB1.AutoSize = True
chkB1.Height = 40
chkB1.Width = 300
End If
Next ID
UserForm2.Show
End If
End Sub
E no código do CommandButton do Userform2:
Private Sub CommandButton1_Click()
If chkB1.Value = True Then Range("A6") = chkB1.Caption
End Sub
Postado : 15/12/2020 4:03 pm