Ir ao conteúdo
  • Cadastre-se

Excel Excel, VBA, Como executar um mesmo comando em todas as TextBox


Ir à solução Resolvido por Basole,

Posts recomendados

Bom dia, mais uma vez venho pedir ajuda. Tenho uma UserForm onde insiro datas nas TextBox1 e nelas aparecem as barras automaticamente, para isso estou usando este código:

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)


    If KeyAscii < 48 Or KeyAscii > 57 Then 'Não permite inserir letras
        KeyAscii = 0
    Else
        If Len(TextBox1) = 2 Then  'Len retorna a quantidade de caracteres
            TextBox1 = TextBox1 & "/"
        End If
        If Len(TextBox1) = 5 Then
            TextBox1 = TextBox1 & "/"
        End If
    End If

End Sub

 

O problema é que eu tenho 12 TextBox então teria que inserir uma sub dessa para cada um. Tem algum jeito de eu fazer somente isso somente 1 vez para funcionar em todas as TextBox?

Link para o comentário
Compartilhar em outros sites

  • Solução

Se quer fazer isso dinamicamente falando, ou seja se de 12, aumentar a quantidade de textbox para 24, sem precisar mexer no código, segue sugestão:

 

Crie um modulo de classe, e renomeie como SuaClasse e cole o codigo abaixo:

Option Explicit

Public WithEvents TextGroup As MSForms.TextBox

Private Sub TextGroup_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    
            TextGroup.MaxLength = 10 ' limita a qtd max. de caracteres => 01/01/2018

    If KeyAscii < 48 Or KeyAscii > 57 Then 'Não permite inserir letras
    KeyAscii = 0
Else
    If Len(TextGroup) = 2 Then  'Len retorna a quantidade de caracteres
    TextGroup = TextGroup & "/"
End If
If Len(TextGroup) = 5 Then
    TextGroup = TextGroup & "/"
End If
End If

End Sub

E no seu userform que contem as textbox (data), acrescente o código abaixo:

 

Option Explicit

Public WithEvents TextGroup As MSForms.TextBox

Dim TextBoxes() As New SuaClasse

Private Sub UserForm_Initialize()
    
    Call CarregaSuaClasseTextbox ' Chama a sub que configura os textbox, adicionando a classe
    
End Sub

Sub CarregaSuaClasseTextbox()
    Dim ctl As MSForms.Control
    Dim i!
    
    i = 1
    
    For Each ctl In Me.Controls
        
        If TypeName(ctl) = "TextBox" Then
            ReDim Preserve TextBoxes(1 To i)
            Set TextBoxes(i).TextGroup = ctl
            i = i + 1
        End If
        
    Next ctl    

End Sub

 

* Desta forma em todos os textbox aparecerão as barras automaticamente, ao digitar os numeros

 

Uma outra opção seria, colocar um form/calendário, que abre como um pop-up para o usuário clicar para inserir uma data. Desta forma evitará erros na formatação ou data inválida do tipo: 30/02/2018.

 

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...

@Basole o meu senario e praticamente o que você indicou no inicio deste poste, e esta a funcionar bem 

o meu único problema e que tenho 900 textbox e queria que a funçao fosse aplicada apenas da textbox32 ate a textbox800

porque da forma que tenho está a a funcionar mas nas outras textbox também esta a aplicar a função

muito obrigado

 

(MODULO CLASSE)

Option Explicit

Public WithEvents TextGroup As MSForms.TextBox


Private Sub TextGroup_Change()
If TextGroup = "A" Then
               TextGroup.BackColor = &HFF&

                ElseIf TextGroup = "B" Then
                TextGroup.BackColor = &HFF00&
                Else
                TextGroup.BackColor = &H80000005
                End If

End Sub

 

'-----------------------------------------------------------------

Sub CarregaSuaClasseTextbox()
    

    
    Dim ctl As MSForms.control
    Dim i!
    
    i = 1
    
    For Each ctl In Me.Controls
    
        If TypeName(ctl) = "TextBox" Then

           ReDim Preserve TextBoxes(1 To i)

            Set TextBoxes(i).TextGroup = ctl

            i = i + 1
        End If

    Next ctl

'-----------------------------------------------------------

Sub UserForm_Initialize()
Call CarregaSuaClasseTextbox ' Chama a sub que configura os textbox, adicionando a classe

End  Sub

 

Link para o comentário
Compartilhar em outros sites

5 horas atrás, Silvio Alves Nitro disse:

o meu único problema e que tenho 900 textbox e queria que a funçao fosse aplicada apenas da textbox32 ate a textbox800

Para aplicar o evento apenas nesses controles é só extrair o valor numérico do nome do TextBox e fazer a comparação do intervalo, p.ex,

 

Numero = Replace(ctl.Name, "TextBox", "")
If IsNumeric(Numero) Then
    If Numero >= 32 And Numero <= 800 Then
    ...
    End If
End If

 

Esse é o critério para a atribuição da coleção de TextBoxes.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, Midori disse:

Para aplicar o evento apenas nesses controles é só extrair o valor numérico do nome do TextBox e fazer a comparação do intervalo, p.ex,

 

Numero = Replace(ctl.Name, "TextBox", "")
If IsNumeric(Numero) Then
    If Numero >= 32 And Numero <= 800 Then
    ...
    End If
End If

 

Esse é o critério para a atribuição da coleção de TextBoxes.

Desde já agradeço a ajuda, podia me indicar um pouco mais onde colocar esse código ? já testei de algumas formas mas sem sucesso, dá-me  sempre erro e pede -me uma variável para numero. Peço desculpa pelo incomodo, obrigado

Link para o comentário
Compartilhar em outros sites

@Silvio Alves Nitro 

Citação

....... como posso fazer para que a função só seja aplicado entre a textbox30 e a textbox50? no exemplo a cima aplica a todas as textbox do userform.

 

👆No seu primeiro post voce afirmou que queria aplicar entre a textbox 30 a 50 

 

Na minhas resposta com pequena correção atenderia.

   

If VBA.Right(ctl.Name, 2) > 29 And VBA.Right(ctl.Name, 2) < 51 Then
   Set TextBoxes(i).TextGroup = ctl
  i = i + 1
End If

 

 

Já com a sua nova solicitacao e a colaboracao do colega @Midori 

fica assim o codigo no userfom.... declarando a variavel Numero

 

Option Explicit

Public WithEvents TextGroup As MSForms.TextBox

Dim TextBoxes() As New SuaClasse

Sub CarregaSuaClasseTextbox() 
    
    Dim ctl As MSForms.Control
    Dim i!
    Dim Numero
    
    i = 1
    
    For Each ctl In Me.Controls
    
        If TypeName(ctl) = "TextBox" Then

           ReDim Preserve TextBoxes(1 To i)
             
           Numero = Replace(ctl.Name, "TextBox", "")
            If IsNumeric(Numero) Then
             
              If Numero >= 32 And Numero <= 800 Then

                Set TextBoxes(i).TextGroup = ctl

                 i = i + 1
                 
              End If
              
            End If
                       
     End If
        
   Next ctl
 End Sub


Sub UserForm_Initialize()

Call CarregaSuaClasseTextbox

End Sub

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...