Com esta função é possível fazer a validação da Inscrição Estadual (IE) para qualquer Estado (UF) da federação.
A Inscrição Estadual é o registro do contribuinte no cadastro do ICMS mantido pela Receita Estadual.
O algorítmo para a validação da IE é um tanto complicado e difícil de ser encontrado já que para cada estado existe uma fórmula.
<% '------------------------------------------ UF = "ES" inscricao = "080233880" valida = ChecaInscrE(UF,inscricao) response.write(valida) '------------------------------------------ function IIf(condicao,verdadeiro,falso) if(condicao) then IIF = verdadeiro else IIF = falso end if end function Function ChecaInscrE (pUF, pInscr) ChecaInscrE = False Dim strBase Dim strBase2 Dim strOrigem Dim strDigito1 Dim strDigito2 Dim intPos Dim intValor Dim intSoma Dim intResto Dim intNumero Dim intPeso Dim intDig strBase = "" strBase2 = "" strOrigem = "" If Trim(pInscr) = "ISENTO" or Trim(pInscr) = "EX" Then ChecaInscrE = True Exit Function End If For intPos = 1 To Len(Trim(pInscr)) If Instr(1, "0123456789P", Mid(pInscr, intPos, 1), vbTextCompare) > 0 Then strOrigem = strOrigem & Mid(pInscr, intPos, 1) End If Next Select Case pUF Case "AC" 'Acre strBase = Left(Trim(strOrigem) & "000000000", 13) d01 = Cint(mid(strBase,1,1)) d02 = Cint(mid(strBase,2,1)) d03 = Cint(mid(strBase,3,1)) d04 = Cint(mid(strBase,4,1)) d05 = Cint(mid(strBase,5,1)) d06 = Cint(mid(strBase,6,1)) d07 = Cint(mid(strBase,7,1)) d08 = Cint(mid(strBase,8,1)) d09 = Cint(mid(strBase,9,1)) d10 = Cint(mid(strBase,10,1)) d11 = Cint(mid(strBase,11,1)) dv01 = Cint(mid(strBase,12,1)) dv02 = Cint(mid(strBase,13,1)) if d01 <> 0 or d02 <> 1 then ChecaInscrE = false Exit Function end if ds = 4*d01 + 3*d02 + 2*d03 + 9*d04 + 8*d05 + 7*d06 + 6*d07 + 5*d08 + _ 4*d09 + 3*d10 + 2*d11 aux1 = Fix(ds / 11) aux1 = aux1 * 11 aux2 = ds - aux1 ' aux2 é o resto, ou mod digverificador1 = 11 - aux2 if digverificador1 = 10 or digverificador1 = 11 then digverificador1 = 0 'primeiro digito end if ds = 5*d01 + 4*d02 + 3*d03 + 2*d04 + 9*d05 + 8*d06 + 7*d07 + 6*d08 + _ 5*d09 + 4*d10 + 3*d11 + 2*digverificador1 aux1 = Fix(ds / 11) aux1 = aux1 * 11 aux2 = ds - aux1 ' aux2 é o resto, ou mod digverificador2 = 11 - aux2 if digverificador2 = 10 or digverificador2 = 11 then digverificador2 = 0 'primeiro digito end if if digverificador1 = dv01 and digverificador2 = dv02 then ChecaInscrE = true end if Case "AL" ' Alagoas strBase = Left(Trim(strOrigem) & "000000000", 9) If Left(strBase, 2) = "24" Then intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intSoma = intSoma * 10 intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto = 10, "0", Cstr(intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "AM" ' Amazonas strBase = Left(Trim(strOrigem) & "000000000", 9) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next If intSoma < 11 Then strDigito1 = Right(Cstr(11 - intSoma), 1) Else intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) End If strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "AP" ' Amapa strBase = Left(Trim(strOrigem) & "000000000", 9) intPeso = 0 intDig = 0 If Left(strBase, 2) = "03" Then intNumero = Fix(Left(strBase, 8)) If intNumero >= 3000001 And intNumero <= 3017000 Then intPeso = 5 intDig = 0 ElseIf intNumero >= 3017001 And intNumero <= 3019022 Then intPeso = 9 intDig = 1 ElseIf intNumero >= 3019023 Then intPeso = 0 intDig = 0 End If intSoma = intPeso For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 intValor = 11 - intResto If intValor = 10 Then intValor = 0 ElseIf intValor = 11 Then intValor = intDig End If strDigito1 = Right(Cstr(intValor), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "BA" ' Bahia strBase = Left(Trim(strOrigem) & "00000000", 8) If Instr(1, "0123458", Left(strBase, 1), vbTextCompare) > 0 Then intSoma = 0 For intPos = 1 To 6 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (8 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 10 strDigito2 = Right(IIf(intResto = 0, "0", Cstr(10 - intResto)), 1) strBase2 = Left(strBase, 6) & strDigito2 intSoma = 0 For intPos = 1 To 7 intValor = Cint(Mid(strBase2, intPos, 1)) intValor = intValor * (9 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 10 strDigito1 = Right(IIf(intResto = 0, "0", Cstr(10 - intResto)), 1) Else intSoma = 0 For intPos = 1 To 6 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (8 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito2 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 6) & strDigito2 intSoma = 0 For intPos = 1 To 7 intValor = Cint(Mid(strBase2, intPos, 1)) intValor = intValor * (9 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) End If strBase2 = Left(strBase, 6) & strDigito1 & strDigito2 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "CE" ' Ceara strBase = Left(Trim(strOrigem) & "000000000", 9) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 intValor = 11 - intResto If intValor > 9 Then intValor = 0 End If strDigito1 = Right(Cstr(intValor), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "DF" ' Distrito Federal strBase = Left(Trim(strOrigem) & "0000000000000", 13) If Left(strBase, 3) = "073" Then intSoma = 0 intPeso = 2 For intPos = 11 To 1 Step -1 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 9 Then intPeso = 2 End If Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 11) & strDigito1 intSoma = 0 intPeso = 2 For intPos = 12 To 1 Step -1 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 9 Then intPeso = 2 End If Next intResto = intSoma Mod 11 strDigito2 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 12) & strDigito2 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "ES" ' Espirito Santo strBase = Left(Trim(strOrigem) & "000000000", 9) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "GO" ' Goias strBase = Left(Trim(strOrigem) & "000000000", 9) If Instr(1, "10,11,15", Left(strBase, 2), vbTextCompare) > 0 Then intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 If intResto = 0 Then strDigito1 = "0" ElseIf intResto = 1 Then intNumero = Cint(Left(strBase, 8)) strDigito1 = Right(IIf(intNumero >= 10103105 And intNumero <= 10119997, "1", "0"), 1) Else strDigito1 = Right(Cstr(11 - intResto), 1) End If strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "MA" ' Maranhão strBase = Left(Trim(strOrigem) & "000000000", 9) If Left(strBase, 2) = "12" Then intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "MT" ' Mato Grosso while len(strOrigem) < 11 strOrigem = "0" & strOrigem wend strBase = Left(Trim(strOrigem) & "000000000", 11) d01 = Cint(mid(strBase,1,1)) d02 = Cint(mid(strBase,2,1)) d03 = Cint(mid(strBase,3,1)) d04 = Cint(mid(strBase,4,1)) d05 = Cint(mid(strBase,5,1)) d06 = Cint(mid(strBase,6,1)) d07 = Cint(mid(strBase,7,1)) d08 = Cint(mid(strBase,8,1)) d09 = Cint(mid(strBase,9,1)) d10 = Cint(mid(strBase,10,1)) dfinal = Cint(mid(strBase,11,1)) ds = 3*d01 + 2*d02 + 9*d03 + 8*d04 + 7*d05 + 6*d06 + 5*d07 + 4*d08 + _ 3*d09 + 2*d10 aux1 = Fix(ds / 11) aux1 = aux1 * 11 aux2 = ds - aux1 if aux2 = 0 or aux2 = 1 then digVerificador = 0 else digVerificador = 11 - aux2 end if if dfinal = digVerificador then ChecaInscrE = true end if Case "MS" ' Mato Grosso do Sul strBase = Left(Trim(strOrigem) & "000000000", 9) If Left(strBase, 2) = "28" Then intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "MG" ' Minas Gerais, aki onde tem FormatNumber ante era format strBase = Left(Trim(strOrigem) & "0000000000000", 13) strBase2 = Left(strBase, 3) & "0" & Mid(strBase, 4, 8) intNumero = 2 For intPos = 1 To 12 intValor = Cint(Mid(strBase2, intPos, 1)) intNumero = IIf(intNumero = 2, 1, 2) intValor = intValor * intNumero If intValor > 9 Then strDigito1 = FormatNumber(intValor, "00") intValor = Cint(Left(strDigito1, 1)) + Cint(Right(strDigito1, 1)) End If intSoma = intSoma + intValor Next intValor = intSoma While Right(FormatNumber(intValor, "000"), 1) <> "0" intValor = intValor + 1 Wend strDigito1 = Right(FormatNumber(intValor - intSoma, "00"), 1) strBase2 = Left(strBase, 11) & strDigito1 intSoma = 0 intPeso = 2 For intPos = 12 To 1 Step -1 intValor = Cint(Mid(strBase2, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 11 Then intPeso = 2 End If Next intResto = intSoma Mod 11 strDigito2 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = strBase2 & strDigito2 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "PA" ' Para strBase = Left(Trim(strOrigem) & "000000000", 9) If Left(strBase, 2) = "15" Then intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "PB" ' Paraiba strBase = Left(Trim(strOrigem) & "000000000", 9) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 intValor = 11 - intResto If intValor > 9 Then intValor = 0 End If strDigito1 = Right(Cstr(intValor), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "PE" ' Pernambuco strBase = Left(Trim(strOrigem) & "00000000000000", 14) intSoma = 0 intPeso = 2 For intPos = 13 To 1 Step -1 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 9 Then intPeso = 1 End If Next intResto = intSoma Mod 11 intValor = 11 - intResto If intValor > 9 Then intValor = intValor - 10 End If strDigito1 = Right(Cstr(intValor), 1) strBase2 = Left(strBase, 13) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "PI" ' Piaui strBase = Left(Trim(strOrigem) & "000000000", 9) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "PR" ' Parana strBase = Left(Trim(strOrigem) & "0000000000", 10) intSoma = 0 intPeso = 2 For intPos = 8 To 1 Step -1 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 7 Then intPeso = 2 End If Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 intSoma = 0 intPeso = 2 For intPos = 9 To 1 Step -1 intValor = Cint(Mid(strBase2, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 7 Then intPeso = 2 End If Next intResto = intSoma Mod 11 strDigito2 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = strBase2 & strDigito2 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "RJ" ' Rio de Janeiro strBase = Left(Trim(strOrigem) & "00000000", 8) intSoma = 0 intPeso = 2 For intPos = 7 To 1 Step -1 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 7 Then intPeso = 2 End If Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 7) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "RN" ' Rio Grande do Norte strBase = Left(Trim(strOrigem) & "000000000", 9) If Left(strBase, 2) = "20" Then intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intSoma = intSoma * 10 intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto > 9, "0", Cstr(intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "RO" ' Rondonia, estado alterado strBase = Left(Trim(strOrigem) & "000000000", 14) d01 = Cint(mid(strBase,1,1)) d02 = Cint(mid(strBase,2,1)) d03 = Cint(mid(strBase,3,1)) d04 = Cint(mid(strBase,4,1)) d05 = Cint(mid(strBase,5,1)) d06 = Cint(mid(strBase,6,1)) d07 = Cint(mid(strBase,7,1)) d08 = Cint(mid(strBase,8,1)) d09 = Cint(mid(strBase,9,1)) d10 = Cint(mid(strBase,10,1)) d11 = Cint(mid(strBase,11,1)) d12 = Cint(mid(strBase,12,1)) d13 = Cint(mid(strBase,13,1)) dfinal = Cint(mid(strBase,14,1)) ds = 6*d01 + 5*d02 + 4*d03 + 3*d04 + 2*d05 + 9*d06 + 8*d07 + 7*d08 + _ 6*d09 + 5*d10 + 4*d11 + 3*d12 + 2*d13 aux1 = Fix(ds / 11) aux1 = aux1 * 11 aux2 = ds - aux1 digVerificador = 11 - aux2 if digVerificador > 9 then resto_do_calculo = digVerificador - 10 else resto_do_calculo = digVerificador end if if dfinal <> resto_do_calculo then ChecaInscrE = false else ChecaInscrE = true end if Case "RR" ' Roraima strBase = Left(Trim(strOrigem) & "000000000", 9) If Left(strBase, 2) = "24" Then intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPos intSoma = intSoma + intValor Next intResto = intSoma Mod 9 strDigito1 = Right(Cstr(intResto), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "RS" ' Rio Grande do Sul strBase = Left(Trim(strOrigem) & "0000000000", 10) intNumero = Cint(Left(strBase, 3)) If intNumero > 0 And intNumero < 468 Then intSoma = 0 intPeso = 2 For intPos = 9 To 1 Step -1 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 9 Then intPeso = 2 End If Next intResto = intSoma Mod 11 intValor = 11 - intResto If intValor > 9 Then intValor = 0 End If strDigito1 = Right(Cstr(intValor), 1) strBase2 = Left(strBase, 9) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If Case "SC" ' Santa Catarina strBase = Left(Trim(strOrigem) & "000000000", 9) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "SE" ' Sergipe strBase = Left(Trim(strOrigem) & "000000000", 9) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 intValor = 11 - intResto If intValor > 9 Then intValor = 0 End If strDigito1 = Right(Cstr(intValor), 1) strBase2 = Left(strBase, 8) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If Case "SP" ' São Paulo If Left(strOrigem, 1) = "P" Then strBase = Left(Trim(strOrigem) & "0000000000000", 13) strBase2 = Mid(strBase, 2, 8) intSoma = 0 intPeso = 1 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso = 2 Then intPeso = 3 End If If intPeso = 9 Then intPeso = 10 End If Next intResto = intSoma Mod 11 strDigito1 = Right(Cstr(intResto), 1) strBase2 = Left(strBase, 8) & strDigito1 & Mid(strBase, 11, 3) Else strBase = Left(Trim(strOrigem) & "000000000000", 12) intSoma = 0 intPeso = 1 For intPos = 1 To 8 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso = 2 Then intPeso = 3 End If If intPeso = 9 Then intPeso = 10 End If Next intResto = intSoma Mod 11 strDigito1 = Right(Cstr(intResto), 1) strBase2 = Left(strBase, 8) & strDigito1 & Mid(strBase, 10, 2) intSoma = 0 intPeso = 2 For intPos = 11 To 1 Step -1 intValor = Cint(Mid(strBase, intPos, 1)) intValor = intValor * intPeso intSoma = intSoma + intValor intPeso = intPeso + 1 If intPeso > 10 Then intPeso = 2 End If Next intResto = intSoma Mod 11 strDigito2 = Right(Cstr(intResto), 1) strBase2 = strBase2 & strDigito2 End If If strBase2 = strOrigem Then ChecaInscrE = True End If Case "TO" ' Tocantins strBase = Left(Trim(strOrigem) & "00000000000", 11) If Instr(1, "01,02,03,99", Mid(strBase, 3, 2), vbTextCompare) > 0 Then strBase2 = Left(strBase, 2) & Mid(strBase, 5, 6) intSoma = 0 For intPos = 1 To 8 intValor = Cint(Mid(strBase2, intPos, 1)) intValor = intValor * (10 - intPos) intSoma = intSoma + intValor Next intResto = intSoma Mod 11 strDigito1 = Right(IIf(intResto < 2, "0", Cstr(11 - intResto)), 1) strBase2 = Left(strBase, 10) & strDigito1 If strBase2 = strOrigem Then ChecaInscrE = True End If End If End Select End Function %>