Chamar uma API externa para consultar os CEPs de uma cidade usando VBA pode ser realizado através de APIs públicas disponíveis. Uma das APIs que você pode usar para este propósito é a ViaCEP, que permite consultar informações de CEPs no Brasil.
Function ConsultarCEPsPorCidade(CEP As String) As String
Dim httpObject As Object
Set httpObject = CreateObject("MSXML2.XMLHTTP")
Dim url As String
url = "https://viacep.com.br/ws/" & CEP & "/json/"
httpObject.Open "GET", url, False
httpObject.Send
If httpObject.Status = 200 Then
ConsultarCEPsPorCidade = httpObject.responseText
Else
ConsultarCEPsPorCidade = "Erro na solicitação: " & httpObject.Status
End If
Set httpObject = Nothing
End Function
Sub ProcessarRespostaJSON()
Dim CEP As String
Dim resposta As String
Dim linhas() As String
Dim partes() As String
Dim linha As String
Dim i As Integer
CEP = ThisWorkbook.Sheets(1).Range("A1").Value
resposta = ConsultarCEPsPorCidade(CEP)
' Quebrar a resposta em linhas (cada CEP)
linhas = Split(resposta, "},{")
' Processar cada linha
For i = LBound(linhas) To UBound(linhas)
linha = linhas(i)
linha = Replace(linha, "{", "")
linha = Replace(linha, "}", "")
linha = Replace(linha, """", "")
linha = Replace(linha, "[", "")
linha = Replace(linha, "]", "")
partes = Split(linha, ",")
' Atribuir os valores nas células
ThisWorkbook.Sheets(1).Cells(1 + 3, 1).Value = ExtrairValorJSON(partes, "cep")
ThisWorkbook.Sheets(1).Cells(2 + 3, 1).Value = ExtrairValorJSON(partes, "logradouro")
ThisWorkbook.Sheets(1).Cells(3 + 3, 1).Value = ExtrairValorJSON(partes, "complemento")
ThisWorkbook.Sheets(1).Cells(4 + 3, 1).Value = ExtrairValorJSON(partes, "bairro")
ThisWorkbook.Sheets(1).Cells(5 + 3, 1).Value = ExtrairValorJSON(partes, "localidade")
ThisWorkbook.Sheets(1).Cells(6 + 3, 1).Value = ExtrairValorJSON(partes, "uf")
ThisWorkbook.Sheets(1).Cells(7 + 3, 1).Value = ExtrairValorJSON(partes, "ibge")
ThisWorkbook.Sheets(1).Cells(8 + 3, 1).Value = ExtrairValorJSON(partes, "gia")
ThisWorkbook.Sheets(1).Cells(9 + 3, 1).Value = ExtrairValorJSON(partes, "ddd")
ThisWorkbook.Sheets(1).Cells(10 + 3, 1).Value = ExtrairValorJSON(partes, "saifi")
Next i
End Sub
Function ExtrairValorJSON(partes() As String, chave As String) As String
Dim parte As Variant
For Each parte In partes
If InStr(parte, chave) > 0 Then
ExtrairValorJSON = Trim(Split(parte, ":")(1))
Exit Function
End If
Next parte
ExtrairValorJSON = ""
End Function
Cole o código no módulo que você criou no Editor do VBA.
Insira o nome da cidade na célula A1 e a sigla do estado na célula A2.
Execute a sub-rotina ConsultarCEPs.
Este exemplo faz uma solicitação GET para a API ViaCEP e retorna os dados em formato JSON, que será exibido na célula A3. Dependendo do volume de dados, você pode precisar de um processamento adicional para extrair e formatar as informações de maneira adequada para a sua necessidade.
Criar uma função em VBA que converte números em valores por extenso pode ser um pouco complexo, devido às regras de numeração em português. Abaixo, segue uma função básica que pode converter números inteiros até 999. Se você precisar de uma função mais abrangente, que lide com números maiores e decimais, recomendo procurar uma biblioteca específica ou expandir o código.
Function NumeroPorExtenso(ByVal Numero As Integer) As String
Dim Unidades As Variant
Dim Dezenas As Variant
Dim Centenas As Variant
Dim NumExtenso As String
Dim Resto As Integer
' Arrays de strings para as unidades, dezenas e centenas
Unidades = Array("", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove")
Dezenas = Array("", "dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa")
Centenas = Array("", "cento", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos")
' Verificar centenas
If Numero = 100 Then
NumExtenso = "cem"
Else
NumExtenso = Centenas(Numero \ 100)
End If
Resto = Numero Mod 100
' Verificar dezenas
If Resto >= 10 And Resto <= 19 Then
NumExtenso = NumExtenso & " " & Array("dez", "onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezessete", "dezoito", "dezenove")(Resto - 10)
Else
NumExtenso = NumExtenso & " " & Dezenas(Resto \ 10)
Resto = Resto Mod 10
End If
' Verificar unidades
NumExtenso = NumExtenso & " " & Unidades(Resto)
' Remover espaços extras
NumeroPorExtenso = Trim(Replace(NumExtenso, " ", " "))
End Function
Sub ConverterNumeroPorExtenso()
Dim Numero As Integer
Dim Extenso As String
' Lê o número da célula A1
Numero = ThisWorkbook.Sheets(1).Range("A1").Value
' Converte para extenso
Extenso = NumeroPorExtenso(Numero)
' Escreve o resultado na célula A2
ThisWorkbook.Sheets(1).Range("A2").Value = Extenso
End Sub
Abra o Excel e pressione ALT + F11 para abrir o Editor do VBA.
No menu “Inserir”, escolha “Módulo” para criar um novo módulo.
Cole o código acima no módulo.
Execute a sub-rotina ConverterNumeroPorExtenso com um número na célula A1 da primeira planilha.
Este código irá ler o número da célula A1, converter para por extenso e colocar o resultado na célula A2. Note que este código é limitado a números inteiros até 999. Para números maiores ou com decimais, a função precisaria ser significativamente expandida.
Saibam VBA em Excel® - Uma marca registrada da Microsoft Corporation.