Notifications
Clear all

Não estou conseguindo referenciar a caixa de seleção do userforms

5 Posts
2 Usuários
3 Reactions
1,070 Visualizações
(@gvidal12)
Posts: 4
New Member
Topic starter
 

O código que estou fazendo, basicamente, a partir de determinadas seleções(optc) em um formulario1 abre um novo formulario (formulario2) com checkbox desenvolvidas a partir das seleções feitas no formulario1, eu ja consigo criar as checkbox, porém quero que quando elas sejam "True" tenham suas Captions fixadas em células diferentes, mas quando tento referecia-las aparece "Método ou membro de dados não encontrado"

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

 

Já no formulario2:

 

Public Sub CommandButton1_Click()

'''''''Aqui ocorre o erro

If UserForm2.chk1.Value = True Then

Range("A6") = chkB1.Caption

End If

Editado pela Moderação. Motivo: Procure utilizar o botão Código (< >) sempre que for inserir código VBA ou Fórmulas.

 
Postado : 15/12/2020 10:49 am
(@gvidal12)
Posts: 4
New Member
Topic starter
 

Ainda não consegui resolver, porque teoricamente a checkbox existe já que eu criei ela pelo código que coloquei, ao contrario do video em que a caixa de texto não existia.

 
Postado : 15/12/2020 2:05 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Se o controle (chk1) ainda não existir em tempo de design, vc não pode referenciá-lo como objeto diretamente como sendo filho do Userform2. Ao invés disso, vc pode usar a coleção Controls:

Private Sub CommandButton1_Click()
  With Me.Controls("chk1")
    If .Value = True Then Range("A6") = .Caption
  End With
End Sub
 

 
Postado : 15/12/2020 2:31 pm
gvidal12 and Anderson reacted
(@gvidal12)
Posts: 4
New Member
Topic starter
 

Pessoal, muito obrigado pela ajuda, utilizei o código que o @edsonbr mandou e funcionou, ainda não entendi exatamente porque desse jeito ter funcionado e do outro jeito não, se puder explicar eu agradeço. Independente disso muito obrigado mesmo pela ajuda dos dois.

@anderson a questão é que eu estou criando diferentes checkbox de acordo com determinadas seleções dentro do formulario1, ai se fosse adicionar as checkbox manualmente teria que criar pelo menos uns 6 formulários

 

 
Postado : 15/12/2020 3:09 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 
Postado por: @gvidal12

...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
gvidal12 reacted