Prezad@s,
Estou tentando importar um arquivo xml pro excel 2010 e ando tendo problemas e, consequentemente, muitas dúvidas.
A primeira situação me ocorreu quando tentei importar o arquivo xml (Second.xml) através da via "convencional" do excel (Menu Abrir>Second.xml>Como lista xml ou através da guia Dados>Obter dados de outras fontes>XML). Os dados do arquivo citado, quando importados, ficam desconfigurados, formando uma espécie de "escada" pulando uma linha a cada nova informação. Como não tenho o hábito de trabalhar com xml, comecei a pesquisar na net e encontrei, no site http://examples.oreilly.com/9780596002527/, um modelo de arquivo xml (o arquivo First.xml) que quando importado da mesma maneira que o outro arquivo fica com a configuração exatamente da maneira que eu quero. Contudo, não consegui fazer com que o arquivo Second.xml fique como o First.xml após a importação. Uma solução aqui neste ponto, apesar de não ser via VBA, já será muito útil.
A segunda situação me ocorreu quando resolvi tentar obter a solução via VBA. Encontrei no site do Benzadeus (http://www.ambienteoffice.com.br/officevba/importar_dados_de_arquivos_xml/) um código para a importação de dados xml. Porém, como ele mesmo já explicou aqui no fórum, em outro tópico, o código dele é direcionado para a obtenção de dados localizados nos atributos de dados xml e não em dados que estiverem entre nós. Ainda assim, tentei adaptar o código, porém sempre me é retornado um erro quando a função ObterNó é chamada e começa a rodar (na linha Set objNodes = xmlDOM.SelectNodes(strNó)). O erro é o: Erro em tempo de execução nº 424 - O Objeto é obrigatório. A partir deste ponto não tenho conseguido evoluir.
Qualquer ajuda será de grande valia!
Os arquivos First.xml e Second.Xml estão compactados no arquivo Planilhando_xml
O código do Benzadeus com a minha tentativa de adaptar, encontra-se abaixo:
Private Sub teste()
Dim strArquivo As String
Dim ws As Worksheet
Dim c As Long
'Altere o valor abaixo para o arquivo que deseja abrir.
strArquivo = "C:Usersisrael.gamboaDesktopsecond.xml"
Set ws = ActiveSheet
'O objeto DOMDocument deve ser usado para manipular dados XML:
Set xmlDOM = CreateObject("MSXML2.DOMDocument")
xmlDOM.async = False
'Carrega o arquivo especificado par ao objeto DOMDocument:
xmlDOM.Load strArquivo
With ws
'Apaga conteúdo da Planilha, cria e formata cabeçalho:
.Cells.Delete
.Range("A1:AN1") = Array("CodMsg", "NumCtrlIF", "CNPJEntRespons", "QtdCed", "NumRefBCCOR", "SitOpCOR", "TpCedlCOR", "DtEms", "DtVenc", "NumCedlCredRuralIF", "TpInstntoCred", "VlrTotOp", "TpCatgEmit", "TpPessoaEmit", "CNPJ_CPFEmit", "TpFnteRec", "CodMunic", "CodEmpnmnt", "CodSistProdc", "VlrParclCred", "VlrParclRecProprio", "PercJurosEncargoFinanc", "CodSTNCOR", "Area", "QtdPrvProdc", "IdentcSafra", "TpPessoaPropt", "CNPJBase_CPFPropt", "TpGarEmpnmnt", "VlrReceitaBrutEsprdEmpnmnt", "NumParcl", "DtPrvPgto", "VlrPrincipalParcl", "IdentcGleba LatPonto", "LongPonto", "CNPJBaseIFSubemprt", "NumRefBCCORSubemprt", "DtHrBC", "DtMovto")
.Rows(1).Font.Bold = True
'Importa informações de arquivo XML:
'Importa CodMsg
c = 1
ObterNó "/SISMSG/COR0003R1/CodMsg", .Cells(2, c)
'Importa NumCtrlIF
c = c + 1
ObterNó "/SISMSG/COR0003R1/NumCtrlIF", .Cells(2, c)
'Importa CNPJEntRespons
c = c + 1
ObterNó "/SISMSG/COR0003R1/CNPJEntRespons", .Cells(2, c)
'Importa QtdCed
c = c + 1
ObterNó "/SISMSG/COR0003R1/QtdCed", .Cells(2, c)
'Importa NumRefBCCOR
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/NumRefBCCOR", .Cells(2, c)
'Importa SitOpCOR
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/SitOpCOR", .Cells(2, c)
'Importa TpCedlCOR
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/TpCedlCOR", .Cells(2, c)
'Importa DtEms
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/DtEms", .Cells(2, c)
'Importa DtVenc
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/DtVenc", .Cells(2, c)
'Importa NumCedlCredRuralIF
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/NumCedlCredRuralIF", .Cells(2, c)
'Importa TpInstntoCred
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/TpInstntoCred", .Cells(2, c)
'Importa VlrTotOp
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/VlrTotOp", .Cells(2, c)
'Importa TpCatgEmit
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/TpCatgEmit", .Cells(2, c)
'Importa TpPessoaEmit
c = c + 1
ObterNó "/SISMSG/COR0003R1/Grupo_COR0003R1_Cedl/Grupo_COR0003R1_Emit/TpPessoaEmit", .Cells(2, c)
'...Continua a importação...
.Columns.AutoFit
End With
Set xmlDOM = Nothing
End Sub
Private Function ObterNó(strNó As String, rng As Range)
Dim objNodes As IXMLDOMNodeList
Dim objNode As IXMLDOMNode
Dim FileName As String
Dim r As Long
Dim c As Long
Set objNodes = xmlDOM.SelectNodes(strNó)
For Each objNode In objNodes
If objNodes.Length > 0 Then
rng.Offset(r) = objNode.Text
r = r + 1
Else
Exit For
End If
Next objNode
End Function
Atenciosamente,
Postado : 27/12/2012 9:32 am