sábado, 9 de março de 2013

G-MAPS - RETORNA A DISTÂNCIA ENTRE DOIS CEPS


Daê pessoal! 

Depois de longo e tenebroso inverso, volto para compartilhar um comando que achei muiiito interessante!
Vamos criar uma função que, baseada em duas condicionais (Cep 1 e Cep 2) retornará a distancias (em KM) entre dois pontos.
Agradecimentos aos participantes da turma de Macro e VBA de Nov/2012, Rogerio, Deyse e Naira que lançaram o desafio... Em especial a Jaime Bull responsável pela criação da função, a qual adaptamos as nossas necessidades.

Então vamos a prática! Primeiramente precisamos habilitar a guia desenvolvedor (Mais detalhes no post MACROS), depois clicamos em “Visual Basic”. Abrirá a tela abaixo:



Clicamos em “Inserir“ depois em “Módulo”:


Agora clicaremos duas vezes sobre o “Módulo” adicionado e colaremos as funções abaixo:

‘---------------------------------------------------------------------------------------------------

Function G_DISTANCIA(Origin As String, Destination As String)
' Requires a reference to Microsoft XML, v6.0
' Draws on the stackoverflow answer at bit.ly/parseXML
Dim myRequest As XMLHTTP60
Dim myDomDoc As DOMDocument60
Dim distanceNode As IXMLDOMNode
G_DISTANCIA = 0
' Check and clean inputs
On Error GoTo exitRoute
Origin = Replace(Origin, " ", "%20")
Destination = Replace(Destination, " ", "%20")
' Read the XML data from the Google Maps API
Set myRequest = New XMLHTTP60
& Origin & "&destination=" & Destination & "&sensor=false", False
myRequest.send
' Make the XML readable usign XPath
Set myDomDoc = New DOMDocument60
myDomDoc.LoadXML myRequest.responseText
' Get the distance node value
Set distanceNode = myDomDoc.SelectSingleNode("//leg/distance/value")
If Not distanceNode Is Nothing Then G_DISTANCIA = (distanceNode.Text / 1000) & " KM"
exitRoute:
' Tidy up
Set distanceNode = Nothing
Set myDomDoc = Nothing
Set myRequest = Nothing
End Function
‘---------------------------------------------------------------------------------------------------
Function G_duracao(Origin As String, Destination As String) As Double
' Requires a reference to Microsoft XML, v6.0
' Draws on the stackoverflow answer at bit.ly/parseXML
Dim myRequest As XMLHTTP60
Dim myDomDoc As DOMDocument60
Dim distanceNode As IXMLDOMNode
G_duracao = 0
' Check and clean inputs
On Error GoTo exitRoute
Origin = Replace(Origin, " ", "%20")
Destination = Replace(Destination, " ", "%20")
' Read the XML data from the Google Maps API
Set myRequest = New XMLHTTP60
& Origin & "&destination=" & Destination & "&sensor=false", False
myRequest.send
' Make the XML readable usign XPath
Set myDomDoc = New DOMDocument60
myDomDoc.LoadXML myRequest.responseText
' Get the distance node value
Set distanceNode = myDomDoc.SelectSingleNode("//leg/duration/value")
If Not distanceNode Is Nothing Then G_duracao = distanceNode.Text / 86400
exitRoute:
' Tidy up
Set distanceNode = Nothing
Set myDomDoc = Nothing
Set myRequest = Nothing
End Function
‘---------------------------------------------------------------------------------------------

A tela ficará assim:



Pronto! Agora retorne a planilha e digite as funções:


Para retornar a distancia: “=G_DISTANCIA(A1;A2)”
Para retornar o tempo: “=G_duracao(A1;A2)”

Nas funções acima você poderá utilizar CEP ou o endereço.

Grande abraço!

Prof. Darlan

57 comentários:

  1. Olá Fizemos um teste porem não funcionou todos os valores aparecem zerados

    ResponderEliminar
    Respostas
    1. Seu CEP está no formato CEP + 3? Precisa ter o traço... Ex: 88229-098.
      Abs!

      Eliminar
  2. Opa! eu de novo.. os CEPS estão sim com o traço, mesmo assim não funciona, disponibiliza sua planilha de exemplo pra download, será que é a minha versão do office ele é o 2013?

    ResponderEliminar
  3. Pode ser a versão... manda seu email para prof.darlan.excel@gmail.com que encaminho a planilha.
    Abs

    ResponderEliminar
    Respostas
    1. O meu só retorna zero, poderia por favor enviar a planilha pra jeffersonabezerra@hotmail.com

      Eliminar
  4. Olá Darlan,

    Pode me enviar por email a planilha?? Não estou conseguindo, está dando erro de Compilação.

    jjgermano@globo.com

    Abs!

    ResponderEliminar
    Respostas
    1. Olá Darlan, poderia me enviar a sua planilha, neiabn@hotmail.com, muito obrigada.

      Eliminar
  5. Olá, Darlan!
    Por favor, essa API só aceita a literal da RUA e não a string do CEP.
    Por favor, poderia me mandar sua planilha... wagnercarvalho_ti@hotmail.com

    ResponderEliminar
  6. Olá Darlan, tentei inserir um módulo no Excel 2013, mas ele não compila e retorna o erro "tipo não definido pelo usuário" na linha "Dim myRequest As XMLHTTP60". Você poderia me enviar a tua planilha? Obrigado. lcarmona (at) gmail (dot) com

    ResponderEliminar
  7. Olá Darlan, No Excel 2013, ele não compila e retorna o erro "tipo não definido pelo usuário" na linha "Dim myRequest As XMLHTTP60". Você pode me dar o caminho das pedras ?

    Um abraço

    Roberto - rcan.f@terra.com.br

    ResponderEliminar
    Respostas
    1. consegui fazer....tive que habilitar as referencias solicitadas

      Microsoft XML, v6.0 e Microsoft WinHTTP Services, version 5.1

      Funcionou.

      Eliminar
    2. Poderia enviar sua planilha, a minha só retorna zero. jeffersonabezerra@hotmail.com

      Eliminar
  8. A programação funcionou perfeitamente. Mas existem muitos CEP´s que retornam valor zero. Sabem me responder o porque?

    ResponderEliminar
  9. Serviço de Busca Cep com retorno xml do endereço completo, Latitude e longitude, codigo IBGE e população do municipio.

    Acesse o site http://www.mapacep.com.br/webservice.asp e solicite a key para usar o serviço

    MapaCEP – Busca CEP

    ResponderEliminar
  10. Alguém pode citar um exemplo de ceps origem e destino para eu poder testar o meu? os ceps q eu tento só retornam zero. obg.

    ResponderEliminar
  11. Parabéns, me ajudou muito !! fiz para ter retorno em km e deu super certo, obrigado.

    ResponderEliminar
  12. Olá Pode me enviar sua planilha por e-mail não consegui fazer!

    wrsilva@anhembi.br

    abs

    ResponderEliminar
  13. Olá
    Poderia me enviar a planilha não consegui.
    emerson@ovd.com.br

    ResponderEliminar
  14. Olá Darlan!
    Acabei de pedir pelo seu email que me enviasse a sua planilha.
    Estou tendo alguns problemas!
    Se puder me ajudar agradeço!

    Abraço

    ResponderEliminar
  15. Olá, é possível ter o cálculo de pedágios? Obrigado!

    ResponderEliminar
  16. Parabéns pela inciativa Darlan. O meu está dando erro! Poderia me enviar o seu? Obrigado. Leandro

    leandrobadann@gmail.com

    ResponderEliminar
  17. Professor,

    Na minha planilha ocorre o erro:"Dim myRequest As XMLHTTP60", conforme acima, é necessário atualizar o excel. A solução é somente essa ? Existe uma burocracia muito grande na empresa para atualização de softwares.

    Como poderia resolver esse problema ?

    Conto com a sua ajuda.

    Abs,

    ResponderEliminar
  18. Prezado Narlan, muito obrigado pela ajuda e Parabéns pelo post.
    Poderia me auxiliar como posso obter a distancia a pé?
    Grato

    ResponderEliminar
  19. Boa noite, poderia por favor, me enviar a planilha?
    livio_sp@hotmail.com

    Obrigado, abs

    ResponderEliminar
  20. Bom, recebi o feedback de Erro de compilação: o tipo definido pelo usuário não foi definido, dando enfase ao XMLHTTP60.
    Poderia enviar a planilha para mim? charlescoutinho85@gmail.com

    ResponderEliminar
  21. Professor Darlan, parabéns e obrigado pela ajuda. Você poderia disponibilizar sua planilha para me auxiliar, pois deu certo, mas para alguns cep's não funcionou. ddavidd.costa@gmail.com
    David Costa

    ResponderEliminar
  22. prof. Darlan, poderia por favor me disponibilizar a planilha? Estou tentando, mas dá o erro: O tipo definido pelo usuário não foi definido.
    Muito obrigada!
    mcgramani@gmail.com
    Cris.

    ResponderEliminar
  23. Gostaria de saber se há um código que busque também o valor do pedágio entre as localidades. Obrigado

    ResponderEliminar
  24. Segue código para obter pedágio através do site do MAPEIA, o valor obtido é por eixo:
    'Identifica se a página já foi totalmente carregada
    While IE.ReadyState <> READYSTATE_COMPLETE
    Wend

    'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
    'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
    'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
    'mais rápida a execução.
    sng = Timer
    Do While sng + 3 > Timer
    Loop

    'Carrega os dados de cidade e UF que serão preenchidos na página
    lCidade = Range("A2").Value
    lCidadeDest = Range("B2").Value

    'Carrega os dados de cidade e UF na página e submente os dados do formulário
    IE.Document.all("origin").innertext = lCidade
    IE.Document.all("destination").Value = lCidadeDest
    IE.Document.all.Item("calc").Click

    'Identifica se a página já foi totalmente carregada
    While IE.ReadyState <> READYSTATE_COMPLETE
    Wend

    'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
    'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
    'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
    'mais rápida a execução.
    sng = Timer
    Do While sng + 3 > Timer
    Loop


    Range("c2").Value = IE.Document.all("toll-value").innerHTML
    IE.Quit

    End Sub

    ResponderEliminar
  25. Segue código para obter pedágio através do site do MAPEIA, o valor obtido é por eixo:
    'Identifica se a página já foi totalmente carregada
    While IE.ReadyState <> READYSTATE_COMPLETE
    Wend

    'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
    'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
    'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
    'mais rápida a execução.
    sng = Timer
    Do While sng + 3 > Timer
    Loop

    'Carrega os dados de cidade e UF que serão preenchidos na página
    lCidade = Range("A2").Value
    lCidadeDest = Range("B2").Value

    'Carrega os dados de cidade e UF na página e submente os dados do formulário
    IE.Document.all("origin").innertext = lCidade
    IE.Document.all("destination").Value = lCidadeDest
    IE.Document.all.Item("calc").Click

    'Identifica se a página já foi totalmente carregada
    While IE.ReadyState <> READYSTATE_COMPLETE
    Wend

    'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
    'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
    'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
    'mais rápida a execução.
    sng = Timer
    Do While sng + 3 > Timer
    Loop


    Range("c2").Value = IE.Document.all("toll-value").innerHTML
    IE.Quit

    End Sub

    ResponderEliminar
  26. Segue código para obter pedágio através do site do MAPEIA, o valor obtido é por eixo:
    'Identifica se a página já foi totalmente carregada
    While IE.ReadyState <> READYSTATE_COMPLETE
    Wend

    'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
    'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
    'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
    'mais rápida a execução.
    sng = Timer
    Do While sng + 3 > Timer
    Loop

    'Carrega os dados de cidade e UF que serão preenchidos na página
    lCidade = Range("A2").Value
    lCidadeDest = Range("B2").Value

    'Carrega os dados de cidade e UF na página e submente os dados do formulário
    IE.Document.all("origin").innertext = lCidade
    IE.Document.all("destination").Value = lCidadeDest
    IE.Document.all.Item("calc").Click

    'Identifica se a página já foi totalmente carregada
    While IE.ReadyState <> READYSTATE_COMPLETE
    Wend

    'Como a página possui JavaScript que cria os objetos que são preenchidos após a carga completa, é necessário
    'aguardar um tempo, coloquei 3 segundos, alterar conforme a necessidade.
    'Caso não tenha javascript na criação dos objetos da página comentar esta parte do código, pois será bem
    'mais rápida a execução.
    sng = Timer
    Do While sng + 3 > Timer
    Loop


    Range("c2").Value = IE.Document.all("toll-value").innerHTML
    IE.Quit

    End Sub

    ResponderEliminar
    Respostas
    1. Ola Maicon,

      Consegue me ajudar com a macro que você disponibilizou?
      Não estou conseguindo montar ela no VBA.

      Eliminar
  27. Ola,

    Cocegue me enviar uma Macro que busca o valor de fretes?
    A que esta na descrição ao cima não consegui entender.

    Ja faz um tempo que estou procurando por algo do tipo.

    Grato.

    ResponderEliminar
  28. No meu aparece erro de sintaxe na primeira linha. O que pode ser?

    ResponderEliminar
  29. Este comentário foi removido pelo autor.

    ResponderEliminar
  30. Olá Professor Darlan... estou com dificuldades... resultado sempre 0. Pode me ajudar.

    henrique_duba@hotmail.com

    ResponderEliminar
  31. bom dia professor Darlan eu também estou com dificuldade pois sempre o resultado é zero. Será algum problema em estabelecer a conexão com o site de mapas?
    Gostari da sua ajuda. Grato. Juliano

    ResponderEliminar
  32. Olá professor Darlan, boa tarde.

    tentei realizar o procedimento informando mais o meu ocorre erro como uma parte do pessoal acima. poderia me enviar sua planilha como exemplo. desde ja conto com sua compreensão. felix_morais@hotmail.com

    ResponderEliminar
  33. Boa tarde.

    Pode encaminhar a planilha fabianeblima@gmail.com obrigada

    ResponderEliminar
  34. Olá. Poderia encaminhar a planilha para jealita.tanaka@gmail.com por gentileza? obrigada!

    ResponderEliminar
  35. Oi Professor Darlan,
    é possivel encaminhar a planilha para meu email?
    Nao aparece nenhum erro pra mim, mas só retorna o valor 0.
    camila.curi@gmail.com

    agradeço imensamente
    obrigada, abs

    ResponderEliminar
  36. Bom dia professor Darlan. Estou tendo dificuldades com a planilha. Pode me enviar a sua? rafaellobatomansur@gmail.com Obrigado

    ResponderEliminar
  37. Bom dia professor Darlan. Estou COM dificuldades com a planilha. Pode me enviar? AMARILIO.SIMSS@HOTMAIL.COM Obrigado

    ResponderEliminar
  38. Caro Professor, como foi dito pelos colegas acima, o resultado da pesquisa só vem valor zero, poderia ajudar nesta questão, desde já agradeço.

    ResponderEliminar
  39. Caro Professor, como foi dito pelos colegas acima, o resultado da pesquisa só vem valor zero, poderia ajudar nesta questão, desde já agradeço.Pode me enviar, email chaves_antonio@yahoo.com.br

    ResponderEliminar
  40. Ola professor, minha planilha so vem 0.
    Consegue me ajudar, pf?
    rtferreira@id.uff.br

    ResponderEliminar
    Respostas
    1. Olha, eu também estou com o mesmo problema. Pesquisei bastante e soube que é necessário adquirir a chave de API com a Google. O serviço gratuito foi desativado.

      Será que alguém pode confirmar essa informação?

      Eliminar
  41. Caro Professor, como foi dito pelos colegas acima, o resultado da pesquisa só vem valor zero, poderia ajudar nesta questão, desde já agradeço. Pode me enviar, email santangelo2807@gmail.com

    ResponderEliminar
  42. o meu excel esta em portugues e acho que não esta aceitando o codigo, tem a versão em portugues?

    ResponderEliminar
  43. Parabéns pelo trabalho, aqui infelizmente só da o valor 0, poderia me enviar a planilha? yurimr3193@gmail.com

    ResponderEliminar
  44. Olá Professor Darlan, minha planilha só retorna 0. Poderia me ajudar por favor ? snake.061@gmail.com

    ResponderEliminar
  45. Minha planilha só retorna 0, alguém pode enviar por favor thiagopacha@hotmail.com

    ResponderEliminar