Formatação De TextBox : Utilizando WithEvents No VBA : Diário Excel
Welisson Silva julho 8, 2019 0 Comentários Leitura: 8 min
Formatação de textbox é um trabalho quase que constante na vida de um programador. No entanto, fique sabendo que uma hora ou outra você precisará fazer esse trabalho. Então para facilitar sua vida, hoje vou mostrar como construir uma classe para formatação de textbox, a fim de economizar seu tempo mantendo o código mais limpo.
Primeiramente gostaria de ressaltar que temos uma seção de comentários logo a baixo. Então, é importante que você deixe sua opinião aqui no artigo. Se possível compartilhe esse conteúdo, você estará atribuindo grande força 💪 para nosso canal.
Também criei um video sobre esse artigo e publiquei no meu canal do youtube. Aproveitando para dizer se você não é inscrito no canal, inscreva-se e ative o sino de notificação para receber os conteúdos em primeira mão sempre que postarmos um novo video.
O Que É WithEvents?
Etapas Básicas Para Usar O WithEvents
O Que Vamos Construir Nesse Exemplo
Benefícios Ao Usar Uma Classe Para Formatação
Construído Nossa Classe
Implementando Nossa Classe No Formulário
O WithEvents especifica que um ou mais variáveis de membro declaradas, se referem a uma instância de uma classe que pode gerar eventos. Portanto, podemos usar essa função para manipular os eventos de uma TextBox ou de qualquer outro controle.
Quando uma variável é definida usando WithEvents, você pode especificar declarativamente que um método trata os eventos da variável usando o Handles palavra-chave.
Texto Fonte: Docs.microsoft.com
Se você quiser que um manipulador de eventos específico seja executado sempre que um determinado evento for acionado, será possível escrever um manipulador de eventos para o objeto. O manipulador de eventos será executado quando o evento apropriado ocorrer.
Para criar um manipulador de eventos no nível do aplicativo, você deve usar as seguintes etapas básicas:
Declare uma variável para o objeto usando a palavra-chave WithEvents
Crie o procedimento para o evento do aplicativo específico. Por exemplo, você pode criar um procedimento para o evento TextBox_KeyPress, ComboBox_KeyPress declarando o WithEvents.
Crie e execute um procedimento que inicie o manipulador de eventos.
Vamos construir uma classe para formatação de Datae CPFque poderá ser utilizada sempre que necessária. A idéia principal do projeto é formatar vários controles que compartilham das mesmas características, sem a necessidade de replicação de códigos.
Nossa classe vai implementar a biblioteca MsForms.TextBox, que por si poderá implementar os eventos KeyPressuma vez que objetos do tipo TextBoxos implementam . O keypressé disparado sempre que uma tecla que produz um valor de caractere é pressionada. Geralmente utilizamos o keypress para formatações do tipo CPF e Data.
Após definir os objetos e eventos da classe, vamos instância-la no corpo do formulário definindo quais controles serão formatados. É importante ressaltar que para realizar esse tipo de trabalho é obrigatório o uso demódulos de classe. Então , se você não sabe o que é módulo de classe, aqui no site postei um artigo referente a esse tema.
Benefícios Ao Usar Uma Classe Para Formatação De TextBox
Já falei em outros artigos que módulos de classes são uma mão na roda. A maior vantagem de se criar uma classe para formatação de textbox, é por conta do reaproveitamento de código. Pois uma vez que você define a estrutura da classe, você não precisa reescrever essas formatações.
Falando sobre reaproveitamento de código, se você é um programador VBA freelance talvez esse artigo seja muito importante pra você. Imagine ficar reescrevendo toda vez as mesmas funções, sendo que você poderia apenas importar uma classe que já tenha isso tudo pronto?
Vamos ser mais radicais um pouco, quando você usa a biblioteca OLEDB por exemplo?
O que muitos programadores não sabem é que trata-se de uma classe especifica para manipulação de banco de dados. Agora pensa comigo, imagina você escrevendo todas as API a unha somente para fazer uma conexão com o banco de dados?
Não é muito mais fácil importar a biblioteca OLEDB e fazer assim?
Private db as new OLEDB.Connection
Até pouco tempo atrás ainda formatava minhas TextBox dentro da própria estrutura do UserForm:
Private Sub TextBoxDataCadastro_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
With TextBoxDataCadastro
If .SelStart = 2 Then .SelText = "/"
If .SelStart = 5 Then .SelText = "/"
A final qual o problema disso?
No meu ponto de vista o maior problema é a replicação de códigos dentro do formulário. Porque se você tem um UserFormque necessita formatar quatro TextBox para datas, automaticamente você iria implementar um evento para cada objeto. Entretanto na maioria das vezes, essas formatações seriam iguais mudando apenas o objeto a ser formatado.
Com o tempo ficará muito mais complicado fazer manutenção no seu sistema. Se sua aplicação contiver muitos tipos de formatações, o excesso de códigos desnecessários fará com que o projeto final fique bem maior. Se você não sabe, quanto mais linhas de código na estrutura do formulário mais pesada essa aplicação ficará.
Construído Nossa Classe Para Formatação De TextBox
Acesse a guia de desenvolvedor do VBA: segundo botão do mouse/Inserir/Módulo de Classe
Renomeie essa classe para ClassFormat:
Adicione um novo UserForm e configure-o assim como da imagem a seguir, mas não precisa renomear as textbox vamos manter propriedades padrões para esse exemplo:
Agora vamos declarar variáveis em nossa classe usando a palavra-chave WithEvents. Para nosso exemplo vou chamar essas propriedades de ToCpf e ToData. Observe que nossas variáveis agora se referem a uma instância de uma classe que pode gerar eventos.
Ao definir nossas propriedades usando a palavra WithEvents, podemos implementar eventos da classe TextBox. Para fazer isso é muito simples, veja a imagem a seguir:
Implemente os eventos KeyPress para as propriedades ToCpf e ToData. Dentro do corpo de cada evento, vamos definir nossa condição de formatação, veja o código a seguir:
Public WithEvents ToCpf As MSForms.TextBox
Public WithEvents ToData As MSForms.TextBox
Private Sub ToCpf_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
With ToCpf
If .SelStart = 3 Then .SelText = "."
If .SelStart = 7 Then .SelText = "."
If .SelStart = 11 Then .SelText = "-"
Private Sub ToData_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
With ToData
Por fim, nossa classe estar pronta para ser usada!
Crie um procedimento que inicie o manipulador de eventos da classe. Defina uma variável que vai receber a instância deClassFormat, vou chama-la de xFormat(). Lembre-se que essa variável precisa ser definida como Matrix, portanto adicione um parente-se nela:
Private xFormat() As New ClassFormat
Crie um método no formulário para chamar nosso evento, vou chama-lo de ChamarFormat():
Private Sub ChamarFormat()
Em seu corpo cole o código a seguir:
cont = Me.Controls.Count - 1
ReDim xFormat(0 To cont)
Select Case Me.Controls(i).Tag
Case Is = "cpf"
Set xFormat(i).ToCpf = Me.Controls(i)
Case Is = "data"
Set xFormat(i).ToData = Me.Controls(i)
Seu bloco de código ficará parecido com isso!
Perceba que nosso método contem uma condição que verifica quais controles possuem os critérios da Tag. Essa TAG é uma forma de dizermos para compilador quais objetos do formulário podem ser formatados. Sem essa condição aconteceria um erro em tempo de execução, pois no formulário foi adicionado um controle Frameque não pode ser formatado nessa ocasião.
Tudo que precisamos fazer agora é passar essas tags nos controles do formulário:
Execute o projeto e perceba que todas os controles serão formatados com um bloco de código apenas. Você pode implementar essa classe em outras partes do sistema, ganhando tempo e mantendo seu código muito mais limpo.
O mais bacana disso tudo é que você pode construir sua classe definindo adversos tipos de formatações. Então use e abuse de sua criatividade testando outros tipos de formatações, se você tiver alguma idéia mostre para gente. 😀
Se você teve dúvidas as respeito do artigo, deixe seu comentário logo a baixo que ajudamos você. Para facilitar seus estudos, clique nesse link e baixe o projeto exemplo criado para esse artigo.