Formatar máscara de entrada de dados [RESOLVIDO]
Enviado: 20 Jun 2018 às 16:28
Boa tarde a todos, estou montando um cadastro de empresas. Até aí, nada de mais. Neste cadastro guardarei a máscara do código de produto para cada empresa. Por exemplo: "00.0000>L.00" para a empresa A, "000.000" para a empresa B, etc. Cada empresa poderá ter qualquer quantidade de caracteres e também letras para os produtos
Terei uma tabela única para os produtos, amarrados por uma coluna que conterá o CNPJ da empresa e outra para o código do produto.
A pergunta é como validar esta máscara tanto na quantidade de caracteres e respeitar a regra do que possa ser inserido em cada posição de acordo com a regra: na posição que for "0", só poderá ser digitado números, "9" poderá ser ou não números, ">L" letra em maiúscula e assim por diante, além de demonstrar corretamente.
---------------------------------------------------------------------------------------------------------------------------------------------------------------
03/07 - 08:33 Bom dia a todos, após alguns dias afastado, ontem finalmente consegui solucionar o problema. Não sei se é a melhor forma, mas o importante é que esta funcionando:
Private Sub txtCodProd_Change()
' 0 - O usuário deve inserir um dígito (0 a 9).
' # - O usuário pode inserir um dígito, um sinal de mais ou de menos.
' .,:;-/ - Espaços reservados de decimais e milhares, separadores de data e hora. O caractere que você selecionar dependerá das configurações regionais do Microsoft Windows.
' > - Converte todos os caracteres seguintes em letras maiúsculas.
' < - Converte todos os caracteres seguintes em letras minúsculas.
Dim bytCont As Byte
Dim bytQTotCarac As Byte
Dim blnResp As Boolean
Dim strCaracMasc As String
Dim strCaracPesq As String
Dim strCaracIns As String
'
blnResp = True
bytQTotCarac = Len(txtCodProd)
'
If frmProdutos.strTpRotina = "I" Then
'
For bytCont = 1 To bytQTotCarac
strCaracPesq = IIf(bytCont = 1, Left(txtCodProd.Text, 1), Right(Left(txtCodProd.Text, bytCont), 1))
'
strCaracMasc = IIf(bytCont = 1, Left(strMascProd, 1), Right(Left(strMascProd, bytCont), 1))
'
Select Case strCaracMasc
'
Case "0", "9"
If Asc(strCaracPesq) < 48 Or Asc(strCaracPesq) > 57 Then 'Números de 0 a 9
blnResp = False
Exit For
End If
'
Case Is = "#"
If Asc(strCaracPesq) < 48 Then ' Número: 0
If strCaracPesq <> "-" And strCaracPesq <> "+" Then
blnResp = False
Exit For
End If
ElseIf Asc(strCaracPesq) > 57 Then ' Número: 9
blnResp = False
Exit For
End If
'
Case ".", ",", ":", ";", "-", "/"
strCaracIns = Empty
'
If strCaracPesq <> "." And strCaracPesq <> "," And strCaracPesq <> ":" And _
strCaracPesq <> ";" And strCaracPesq <> "-" And strCaracPesq <> "/" Then
'
Select Case strCaracMasc
Case Is = "."
strCaracIns = "."
Case Is = ","
strCaracIns = ","
Case Is = ":"
strCaracIns = ":"
Case Is = "-"
strCaracIns = "-"
Case Is = "/"
strCaracIns = "/"
End Select
End If
txtCodProd.Text = Left(txtCodProd.Text, Len(txtCodProd) - 1) & _
strCaracIns & Right(txtCodProd.Text, 1)
'
Case "<", ">"
If strCaracMasc = ">" Then
'
' Caracteres: De A - ASC(65) até Z - ASC(90)
' À - ASC(192); Á - ASC(193); Â - ASC(194); Ã - ASC(195)
' É - ASC(201); Ó - ASC(211); Ô - ASC(212); Õ - ASC(213)
'
strCaracPesq = UCase(strCaracPesq)
If (Asc(strCaracPesq) < 65 Or Asc(strCaracPesq) > 90) And _
(Asc(strCaracPesq) < 192 Or Asc(strCaracPesq) > 195) And _
(Asc(strCaracPesq) < 211 Or Asc(strCaracPesq) > 213) And _
Asc(strCaracPesq) <> 201 Then
blnResp = False
Exit For
End If
Else
'
' Caracteres: De a - ASC(97) até z - ASC(122)
' à - ASC(224); Á - ASC(225); Â - ASC(226); Ã - ASC(227)
' É - ASC(233); Ó - ASC(243); Ô - ASC(244); Õ - ASC(245)
'
strCaracPesq = LCase(strCaracPesq)
If (Asc(strCaracPesq) < 97 Or Asc(strCaracPesq) > 122) And _
(Asc(strCaracPesq) < 224 Or Asc(strCaracPesq) > 227) And _
(Asc(strCaracPesq) < 243 Or Asc(strCaracPesq) > 245) And _
Asc(strCaracPesq) <> 233 Then
blnResp = False
Exit For
End If
End If
txtCodProd.Text = txtCodProd.Text & strCaracPesq
End Select
Next bytCont
End If
'
If Not blnResp Then
MsgBox "O Caracter é inválido na posição! Verificar!", vbCritical, "ERRO"
txtCodProd.Text = Left(txtCodProd.Text, Len(txtCodProd.Text) - 1)
End If
End Sub
Terei uma tabela única para os produtos, amarrados por uma coluna que conterá o CNPJ da empresa e outra para o código do produto.
A pergunta é como validar esta máscara tanto na quantidade de caracteres e respeitar a regra do que possa ser inserido em cada posição de acordo com a regra: na posição que for "0", só poderá ser digitado números, "9" poderá ser ou não números, ">L" letra em maiúscula e assim por diante, além de demonstrar corretamente.
---------------------------------------------------------------------------------------------------------------------------------------------------------------
03/07 - 08:33 Bom dia a todos, após alguns dias afastado, ontem finalmente consegui solucionar o problema. Não sei se é a melhor forma, mas o importante é que esta funcionando:
Private Sub txtCodProd_Change()
' 0 - O usuário deve inserir um dígito (0 a 9).
' # - O usuário pode inserir um dígito, um sinal de mais ou de menos.
' .,:;-/ - Espaços reservados de decimais e milhares, separadores de data e hora. O caractere que você selecionar dependerá das configurações regionais do Microsoft Windows.
' > - Converte todos os caracteres seguintes em letras maiúsculas.
' < - Converte todos os caracteres seguintes em letras minúsculas.
Dim bytCont As Byte
Dim bytQTotCarac As Byte
Dim blnResp As Boolean
Dim strCaracMasc As String
Dim strCaracPesq As String
Dim strCaracIns As String
'
blnResp = True
bytQTotCarac = Len(txtCodProd)
'
If frmProdutos.strTpRotina = "I" Then
'
For bytCont = 1 To bytQTotCarac
strCaracPesq = IIf(bytCont = 1, Left(txtCodProd.Text, 1), Right(Left(txtCodProd.Text, bytCont), 1))
'
strCaracMasc = IIf(bytCont = 1, Left(strMascProd, 1), Right(Left(strMascProd, bytCont), 1))
'
Select Case strCaracMasc
'
Case "0", "9"
If Asc(strCaracPesq) < 48 Or Asc(strCaracPesq) > 57 Then 'Números de 0 a 9
blnResp = False
Exit For
End If
'
Case Is = "#"
If Asc(strCaracPesq) < 48 Then ' Número: 0
If strCaracPesq <> "-" And strCaracPesq <> "+" Then
blnResp = False
Exit For
End If
ElseIf Asc(strCaracPesq) > 57 Then ' Número: 9
blnResp = False
Exit For
End If
'
Case ".", ",", ":", ";", "-", "/"
strCaracIns = Empty
'
If strCaracPesq <> "." And strCaracPesq <> "," And strCaracPesq <> ":" And _
strCaracPesq <> ";" And strCaracPesq <> "-" And strCaracPesq <> "/" Then
'
Select Case strCaracMasc
Case Is = "."
strCaracIns = "."
Case Is = ","
strCaracIns = ","
Case Is = ":"
strCaracIns = ":"
Case Is = "-"
strCaracIns = "-"
Case Is = "/"
strCaracIns = "/"
End Select
End If
txtCodProd.Text = Left(txtCodProd.Text, Len(txtCodProd) - 1) & _
strCaracIns & Right(txtCodProd.Text, 1)
'
Case "<", ">"
If strCaracMasc = ">" Then
'
' Caracteres: De A - ASC(65) até Z - ASC(90)
' À - ASC(192); Á - ASC(193); Â - ASC(194); Ã - ASC(195)
' É - ASC(201); Ó - ASC(211); Ô - ASC(212); Õ - ASC(213)
'
strCaracPesq = UCase(strCaracPesq)
If (Asc(strCaracPesq) < 65 Or Asc(strCaracPesq) > 90) And _
(Asc(strCaracPesq) < 192 Or Asc(strCaracPesq) > 195) And _
(Asc(strCaracPesq) < 211 Or Asc(strCaracPesq) > 213) And _
Asc(strCaracPesq) <> 201 Then
blnResp = False
Exit For
End If
Else
'
' Caracteres: De a - ASC(97) até z - ASC(122)
' à - ASC(224); Á - ASC(225); Â - ASC(226); Ã - ASC(227)
' É - ASC(233); Ó - ASC(243); Ô - ASC(244); Õ - ASC(245)
'
strCaracPesq = LCase(strCaracPesq)
If (Asc(strCaracPesq) < 97 Or Asc(strCaracPesq) > 122) And _
(Asc(strCaracPesq) < 224 Or Asc(strCaracPesq) > 227) And _
(Asc(strCaracPesq) < 243 Or Asc(strCaracPesq) > 245) And _
Asc(strCaracPesq) <> 233 Then
blnResp = False
Exit For
End If
End If
txtCodProd.Text = txtCodProd.Text & strCaracPesq
End Select
Next bytCont
End If
'
If Not blnResp Then
MsgBox "O Caracter é inválido na posição! Verificar!", vbCritical, "ERRO"
txtCodProd.Text = Left(txtCodProd.Text, Len(txtCodProd.Text) - 1)
End If
End Sub