No meu sistema eu uso um só campo máscara (Txt_Cli_Codi), para a entrada de CPF, CNPJ ou um código qualquer. Antes dele tem um OptionButton (Opt_Cli_Tipo), onde o usuário informa o que vai digitar e dai eu monto a máscara para a escolha dele.
No LostFocus do campo máscara a sub está assim:
If Left(Txt_Cli_Codi, 1) = " " Then
Txt_Cli_Codi.BackColor = &HFFFFFF
Exit Sub
End If
'verifica CPF
If Opt_Cli_Tipo(1).Value = True Then
Dim Conta As Integer
Dim Soma As Integer
Dim Resto As Integer
Dim Passo As Integer
Dim intPos As Integer
Dim strOrigem As String
Dim CPF_Antes As String
CPF_Antes = Txt_Cli_Codi
For intPos = 1 To Len(Trim(Txt_Cli_Codi))
If InStr(1, "0123456789P", Mid$(Txt_Cli_Codi, intPos, 1), vbTextCompare) > 0 Then
strOrigem = strOrigem & Mid$(Txt_Cli_Codi, intPos, 1)
End If
Next
CPF = strOrigem
For Passo = 11 To 12
Soma = 0
For Conta = 1 To Passo - 2
Soma = Soma + Val(Mid(CPF, Conta, 1)) * (Passo - Conta)
Next
Resto = 11 - (Soma - (Int(Soma / 11) * 11))
If Resto = 10 Or Resto = 11 Then Resto = 0
If Resto <> Val(Mid(CPF, Passo - 1, 1)) Then
Txt_Cli_Codi = CPF_Antes
MsgBox "O CPF informado está incorreto !", vbCritical, "Erro de informação"
Txt_Cli_Codi.SetFocus
Exit Sub
End If
Next
Txt_Cli_Codi = CPF_Antes
End If
'verifica CNPJ
If Opt_Cli_Tipo(0).Value = True Then
Dim Contaj As Integer
Dim Somaj As Long
Dim Passoj As Integer
Dim Digito1 As Integer
Dim Digito2 As Integer
Dim Flag As Integer
Dim CNPJ_Antes As String
Dim intPosj As Integer
Dim strOrigemj As String
CNPJ_Antes = Txt_Cli_Codi
For intPosj = 1 To Len(Trim(Txt_Cli_Codi))
If InStr(1, "0123456789P", Mid$(Txt_Cli_Codi, intPosj, 1), vbTextCompare) > 0 Then
strOrigemj = strOrigemj & Mid$(Txt_Cli_Codi, intPosj, 1)
End If
Next
CNPJ = strOrigemj
For Passoj = 5 To 6
Somaj = 0
Flag = Passoj
For Contaj = 1 To Passoj + 7
Somaj = Somaj + (Val(Mid(CNPJ, Contaj, 1)) * Flag)
Flag = IIf(Flag > 2, Flag - 1, 9)
Next
Somaj = Somaj Mod 11
If Passoj = 5 Then Digito1 = IIf(Somaj > 1, 11 - Somaj, 0)
If Passoj = 6 Then Digito2 = IIf(Somaj > 1, 11 - Somaj, 0)
Next
If (Digito1 <> Val(Mid(CNPJ, 13, 1)) Or Digito2 <> Val(Mid(CNPJ, 14, 1))) Or Not IsNumeric(Right(Txt_Cli_Codi, 1)) Then
Txt_Cli_Codi = CNPJ_Antes
MsgBox "O CNPJ informado está incorreto !", vbCritical, "Erro de informação"
Txt_Cli_Codi.SetFocus
Exit Sub
End If
Txt_Cli_Codi = CNPJ_Antes
End If
Txt_Cli_Codi.BackColor = &HFFFFFF
O que eu preciso para melhorar este código é que caso o CPF ou CNPJ digitado esteja incorreto, na hora em que o sistema avisa deste erro ele também indicasse qual seria o controle correto para que fosse certo.
Ex: digitado: 51.531.051/0001-75
Ele informasse o erro e também que o correto seria controle = 80
Estes códigos eu peguei aqui mesmo nas dicas do site para VB. Só que não achei como fazer ele mostrar o controle correto.