Ir ao conteúdo

Excel VBA - Evento KeyPress Avançado


PeHeBaCaSo

Posts recomendados

Postado

Boa tarde galera,

mais uma vez necessito da ajuda de vocês, tenho um formulário com 55 TextBox's com os respectivos nomes TextBox101 a TextBox155, eu preciso que em todos só aceite números inteiros. Com o código abaixo eu consigo extamente o que preciso:


Private Sub TextBox101_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 8 'Aceita o BACK SPACE
Case 13: SendKeys "{TAB}" 'Emula o TAB
Case 48 To 57
Case Else: KeyAscii = 0 'Ignora os outros caracteres
End Select
End Sub

Porém terei de repetir 55 vezes o mesmo código mudando somente o os números finais do do TextBox de 101 até 155. Para que o código fique mais elegante, sem redundância e com redução na chance de erro, eu queria um evento "KeyPress avançado" o qual através de Loop, Next ou qualquer outra ferramente me desse apenas um único código que rodasse em todas as minhas TextBox's, isso é possível e alguém conhece?

Obrigado Amigos

Pedro Souza

Postado

para permitir a inserção de dígitos somente, em todas as TextBoxes do Form; para permitir outros caracteres em uma ou mais TextBoxes basta incluir seus nomes na condição 'If'.

1. insira um módulo de classe, nomeie-o clsFormEvents, cole nele o código abaixo

Option Explicit

Public WithEvents txtBox As MSForms.TextBox

Private Sub txtBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If Shift Then KeyCode = 0
Select Case KeyCode
Case 8, 13, 46, 48 To 57, 96 To 105, 109, 110, 189, 190
Case Else
KeyCode = 0
End Select
End Sub

2.no módulo do UserForm cole o código abaixo

Option Explicit

Private collTextBoxes As Collection

Private Sub UserForm_Initialize()
Dim tbEvents As clsFormEvents
Dim ctl As Object
Set collTextBoxes = New Collection
For Each ctl In Me.Controls
If TypeName(ctl) = "TextBox" Then
Set tbEvents = New clsFormEvents
Set tbEvents.txtBox = ctl
collTextBoxes.Add tbEvents
End If
Next ctl
End Sub

Postado

Boa tarde Osvaldo,

nunca trabalhei com Módulo de Classe, então estou cometendo alguma gafe, veja se pode me ajudar.

Meus TextBoxe's se chamam respectivamente TextBox101, TextBox 102, até o TextBox155, sendo assim meu código tem de ficar:

Módulo de Classe:


Option Explicit

Public WithEvents txtBox As MSForms.TextBox

Private Sub txtBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If Shift Then KeyCode = 0
Select Case KeyCode
Case 8, 13, 48 To 57 [COLOR="YellowGreen"]'Código para aceitar somente números[/COLOR]
Case Else
KeyCode = 0
End Select
End Sub

Módulo:


Option Explicit

Private collTextBoxes As Collection

Private Sub UserForm_Initialize()
Dim tbEvents As clsFormEvents
Dim ctl As Object
Set collTextBoxes = New Collection
For Each ctl In Me.Controls
If TypeName(ctl) = "[COLOR="Red"]TextBox101[/COLOR]" Then
Set tbEvents = New clsFormEvents
Set tbEvents.txtBox = ctl
collTextBoxes.Add tbEvents
End If
Next ctl
End Sub

Esse foi como ficou meus códigos, eu teria de colocar alguma observação dentro do Form? :confused:

Obrigado

Pedro Souza

Postado

Aê, Pedro.

Os códigos, instalados em conjunto, estão prontos pra uso. Não é necessária qualquer alteração.

Sugestão - para testar os códigos, em um arquivo em branco, insira um Form e nele algumas 'TextBox', após isso, siga o passo-a-passo abaixo:

instalando o primeiro código em um módulo de classe

1. copie o primeiro código que postei

2. no editor de VBA >> menu Inserir >> Módulo de Classe

3. cole o código na janela em branco que se abrirá

renomeando o módulo de classe

4. na janela menor, à esquerda, está o nome 'Classe1', ainda selecionado

5. tecle F4, abre-se a janela 'Propriedades-Classe1'

6. copie este nome que será dado ao módulo de classe >> clsFormEvents

7. (Name) >> onde está 'Classe1' dê duplo clique para selecionar e cole este novo nome para esse módulo >> clsFormEvents >> clique no 'X' para fechar (feche somente a janela Propriedades, não feche o editor de VBA)

instalando o segundo código no módulo do Form

8. copie o segundo código que postei

9. duplo clique no nome UserForm1, na janela à esquerda, para acessar o Form >> duplo clique sobre o UserForm1 para abrir seu módulo

10. cole o segundo código que postei na janela que vai se abrir em substuição ao que lá estiver

11. pronto pra testes, feche o editor, carregue o Form e faça os testes em todas as 'TextBox'

Postado

Osvaldo,

desculpa a ignorância mas eu apliquei o segundo código em um módulo, não dentro do Form, agora funcionou conforme descrito.

Com tudo tenho um pequeno empecilho meu From é composto por uma MultPage, a qual na primeira página tem a inserção dos dados do cliente, neles vão nome, CNPJ, telefone, etc. (conforme a imagem 01) ondes os TextBox's tem nomes definidos como no campo Razão Social - inputNome, CNPJ - inputCNPJ, Tel. - inputTel e assim sucessivamente.

imagem1by.jpg

A segunda pagina deve ser composta pelo número de vidas em cada faixa etária, deste modo eu renomeei cada TextBox com os seguintes nomes TextBox101, TextBox102 até o TextBox155, porque já tinha a ideia de utilizar um evento KeyPress (para que estes TextBox's aceitassem somente números) junto com um evento Loop ou algo semelhante para aproveitar a númeração criada de 101 a 155.

imagem2fq.jpg

Acontece que o seu código funciona perfeitamente, porém parla todos as minhas TextBox's, daí tenho o problema da primeira página que tem um mix onde apenas algumas são para aceitar apenas números, por isso eu coloquei a segunda pagina com o nome deles numerados.

Se tiver algum meio de "burlar" esse meu empecilho ficarei grato, caso contrario irei colocar a regra de KeyPress um a um em cada TextBox da página 2.

:mellow::mellow::mellow:

Abraços

Pedro Souza

Postado

Aê, Pedro.

1.Seria viável nomear cada página do Form e assim direcionar o filtro dos códigos para atuar nessa página que aloja os TextBox que vão receber somente números ?

ou

2. Seria viável montar um novo Form isolado para alojar os TextBox que vão receber somente números, e assim aplicar o filtro somente nele ?

  • 2 meses depois...
Postado

Osvaldo,

desculpa ter sumido, mas tive de tomar outras atividades aqui na empresa, inclusive viagens.

Gostaria de saber sobre a primeira opção como eu nomeio as páginas do Form e direciono o filtro que você mencionou.

Att,

Pedro Souza

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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