none
userform indexada em variável RRS feed

  • Pergunta

  • Tenho armazenado em uma variável o nome da userform.propriedade que desejo utilizar, como posso utilizar essa variável. 

    por exemplo x = "userform2.caption",  e desejo fazer

    x = x & "1"  ( por exemplo)

    x = "Nome"

    Qual é o modo correto de utilizar esse comando
    Obrigado
    sábado, 22 de dezembro de 2012 18:28

Respostas

  • Obrigado, Feliz Natal pra você e todos do fórum também.

    Realmente, o exemplo que te mandei é como representar vários formulários tendo apenas um formulário modelo.

    Seria melhor se você postasse seu código aqui, pode ser com todos os If mesmo.

    Para fazer um laço em controles de um formulário, utilize o código abaixo:

    Private Sub UserForm_Click()
        Dim ctrl As Control
        
        For Each ctrl In Me.Controls
            If ctrl.Name Like "TextBox*" Then
                ctrl = "Benzadeus!"
            End If
        Next ctrl
    End Sub
    
    'ou:
    
    Private Sub UserForm_Click()
        Dim ctrl As Control
        Dim lIndex As Long
        
        For lIndex = 1 To 20
            Set ctrl = Controls("TextBox" & lIndex)
            ctrl = "Benzadeus!"
        Next lIndex
    
    End Sub

    Quando se trata de formulários, não é possível fazer algo simples como esse exemplo que mostrei (e nem como você fez). Isso acontece porque formulários devem ser declarados de acordo com sua classe. Se você possui os formulários Userform1, Userform2, Userform3, etc, não pode criar simplesmente uma variável que represente cada uma dessas classes. O melhor que acredito que possa fazer é:

    Sub Exemplo()
        Dim frm As Object
        Dim lIndex As Long
        
        For lIndex = 1 To 20
            Set frm = GetFormulário("UserForm" & lIndex)
            frm.Show
        Next lIndex
    End Sub
    
    Function GetFormulário(sFormulário As String) As Object
        Select Case sFormulário
            Case "UserForm1": Set GetFormulário = New UserForm1
            Case "UserForm2": Set GetFormulário = New UserForm1
            Case "UserForm3": Set GetFormulário = New UserForm1
            'E assim por diante
        End Select
    End Function

    ---

    Pergunta: os formulários são muito diferentes entre si ou mudam apenas algumas coisas como texto de um rótulo, etc.?


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta vbdeantoni segunda-feira, 24 de dezembro de 2012 21:42
    segunda-feira, 24 de dezembro de 2012 21:18
    Moderador

Todas as Respostas

  • Por que não faz algo como:

    UserForm2.Caption = UserForm2.Caption & "Exemplo"


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    domingo, 23 de dezembro de 2012 22:43
    Moderador
  • Na verdade acho que não escrevi corretamente.

    Tenho várias Userform (1,2,...,20)

    Em uma variável tenho o nome Userform, e dependendo de outros parametros do programa eu preciso chamar uma deterinada userform, por exemplo a userform3.

    O que eu tentei fazer é Variavel = "userform" & "3"

    Entretanto quando eu faço variavel.optionbutton4.enable = false

    Aparece um erro dizendo que é necessário o objeto.

    Acredito que o problema esteja na declaração da minha variável ou como defino ela talvez usando set?

    Mas agradeço sua resposta

     

    segunda-feira, 24 de dezembro de 2012 15:15
  • Ainda não entendi muito bem o que deseja, mas aqui há um bom exemplo de se alocar formulários num vetor: http://social.msdn.microsoft.com/Forums/pt-BR/vbapt/thread/f9278f88-9932-4443-9b8c-c86a79a6a776

    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta vbdeantoni segunda-feira, 24 de dezembro de 2012 20:05
    • Não Marcado como Resposta vbdeantoni segunda-feira, 24 de dezembro de 2012 20:12
    segunda-feira, 24 de dezembro de 2012 16:44
    Moderador
  • Exemplo do que preciso...

    Sub procedimento()

    dim x,a as string

    x = "userform"

    For i=1 to 20

    a = x & i

    '    msgbox a  => userform1 ,..., userform20 (para cada loop)

    a.caption = "olá"

    Next i

    ENd Sub

    Escrevi apenas para ilustrar meu exemplo, o que eu queria era uma maneira dinamica de atribuir o nome de uma userform ou propriedade em uma variavel.

    O que ocorre é o erro "o objeto é necessário". na linha (a.caption= "olá")

    Ele armazena o nome correto na variável porém não consigo usá-la como objeto.

    Gostaria de poder fazer isso não só para o userform mas também para outras propriedades como por exemplo optionbutton (i) ...

    Dei uma olhada no link que você enviou mas não verifiquei isso por lá.

    Na verdade acabei usando uns 30 if's para resolver o problema, mas gostaria de saber como fazer desse modo. O problema que estava trabalhando era um questionário que dependendo de opçoes escolhidas exibiria diferentes informações a cada iteração.

    Agradeço a ajuda e aproveito para desejar um feliz natal.

     

    segunda-feira, 24 de dezembro de 2012 20:23
  • Obrigado, Feliz Natal pra você e todos do fórum também.

    Realmente, o exemplo que te mandei é como representar vários formulários tendo apenas um formulário modelo.

    Seria melhor se você postasse seu código aqui, pode ser com todos os If mesmo.

    Para fazer um laço em controles de um formulário, utilize o código abaixo:

    Private Sub UserForm_Click()
        Dim ctrl As Control
        
        For Each ctrl In Me.Controls
            If ctrl.Name Like "TextBox*" Then
                ctrl = "Benzadeus!"
            End If
        Next ctrl
    End Sub
    
    'ou:
    
    Private Sub UserForm_Click()
        Dim ctrl As Control
        Dim lIndex As Long
        
        For lIndex = 1 To 20
            Set ctrl = Controls("TextBox" & lIndex)
            ctrl = "Benzadeus!"
        Next lIndex
    
    End Sub

    Quando se trata de formulários, não é possível fazer algo simples como esse exemplo que mostrei (e nem como você fez). Isso acontece porque formulários devem ser declarados de acordo com sua classe. Se você possui os formulários Userform1, Userform2, Userform3, etc, não pode criar simplesmente uma variável que represente cada uma dessas classes. O melhor que acredito que possa fazer é:

    Sub Exemplo()
        Dim frm As Object
        Dim lIndex As Long
        
        For lIndex = 1 To 20
            Set frm = GetFormulário("UserForm" & lIndex)
            frm.Show
        Next lIndex
    End Sub
    
    Function GetFormulário(sFormulário As String) As Object
        Select Case sFormulário
            Case "UserForm1": Set GetFormulário = New UserForm1
            Case "UserForm2": Set GetFormulário = New UserForm1
            Case "UserForm3": Set GetFormulário = New UserForm1
            'E assim por diante
        End Select
    End Function

    ---

    Pergunta: os formulários são muito diferentes entre si ou mudam apenas algumas coisas como texto de um rótulo, etc.?


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    • Marcado como Resposta vbdeantoni segunda-feira, 24 de dezembro de 2012 21:42
    segunda-feira, 24 de dezembro de 2012 21:18
    Moderador
  • Os formulários são bem semelhantes, eu gostaria de colocar o código entretanto esta dividido em várias partes.

    Já percebi que usando o link que enviou eu poderia ter simplificado muito o projeto, fica a dica para o próximo.

    Na verdade a questão surgiu quando eu queria ativar alguns optionbutton em um mesmo FOrm.

    O que eu queria fazer era que como cada conjunto de optionbutton correspondia a uma celula do excel, após ele ser preenchido (mais de 100 questões) era poder voltar com as respostas já em default

    minha idéia era fazer um laço com um contador (optionbutton1, 2... até 12) e associar o contador com a célula que ele estava relacionado, a célula com a resposta recebiria1 ,2 até o 12 e então esse optionbutton receberia Enable = true.

    por exemplo se a célula estivesse com 6, significava que era o optionbutton6 ficaria ativo.

    Daí comecei a testar para a userform também.

    O que fiz foi colocar um IF, se celula =1 then optionbutton1 = 1...........

    ....................

    Andei dando uma lida por aqui, e realmente depois de ler sua resposta entendi que o que eu queria fazer era bem mais complexo do que simplesmente colocar um numero na frente de uma string e achar que funcionaria.

    A sua solução acima funcionou, vou terminar de implantar ela e depois posto o resultado.

    Agradeço a ajuda.

    Feliz Natal

    segunda-feira, 24 de dezembro de 2012 21:42
  • Veja um exemplo neste link para te dar uma ideia: https://skydrive.live.com/redir?resid=FB206A2D510E0661!667


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 24 de dezembro de 2012 22:06
    Moderador
  • Exemplo bem ilustrativo.

    Valeu

    segunda-feira, 24 de dezembro de 2012 23:42