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,
gamboaisrael .'.
Boa tarde!!
Eu não entendi, eu importei indo em [Dados --> De Outras Fontes --> Da Importação de dados XML], selecionei o XML...no seu caso as colunas E em diante para você estão desfiguradas?
Leia também
http://support.microsoft.com/kb/305795/pt
http://www.tomasvasquez.com.br/artigos/ ... ndo_u.html
Att
Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel
Isso mesmo, Alexandre.
Eu gostaria que após a importação, os dados ficassem dispostos da mesma maneira que ficam os dados do arquivo First.xml, ou seja, todos na mesma linha, sem a formação dessa "escada" após a coluna "E".
Quanto aos sites indicados, eu agradeço, mas já li estes e muitos outros. Contudo não encontrei neles o que eu procuro.
Grato pela atenção,
gamboaisrael .'.
gamboaisrael,
Bom dia!
Veja se é deste jeito que você precisa!
Utilizo o Excel 2007:
Primeiro em mapiei o código fonte do xml na planilha:
Desenvolvedor > Código Fonte > Mapas XML... > Adicionar > Selecione o XML Second > Selecione o MAPA e dê OK
No lado direito será exibido o código fonte do XML. Clique no primeiro campo do mapa (SISMSG), segure e arraste para célula A1.
Em seguida importei o xml:
Os campos serão mapaeados na planilha, cada qual em sua devida coluna. Agora importe o XML Second em: Desenvolvedor > Importar > Abra o XML
Caso o campo desenvolvedor do seu Excel não esteja habilitado será necessário habilitá-lo:
1.Abra o MS Office Excel 2010;
2.Clique na guia ARQUIVO;
3.No menu lateral (Esquerda) clique em AJUDA;
4.No menu central clique em OPÇÕES;
5.Dentro da janela Opções do Excel, no meu lateral (Esquerda) clique em PERSONALIZAR FAIXA DE OPÇÕES;
6.No menu central serão listadas opções onde você pode habilitar ou desabilitar. No grupo de opções mais a direita procure a opção DESENVOLVEDOR e marque caixa de seleção localizada a esquerda desta opção.
7.Clique no botão OK para fechar a janela e aba DESENVOLVEDOR já estará habilitada.
Espero que tenha ajudado!
Qualquer coisa, é só falar.
Bom dia, Luiz Elias.
Muito obrigado pela ajuda. Contudo, após seguir suas orientações, meu problema persiste.
O que eu desejo é que as células a partir da coluna "E" não fique como estão no exemplo que você enviou. Por exemplo, a célula E2 está preenchida, porém a célula F2 está vazia e a celula F3 está preenchida, formando uma "escada". Eu gostaria que os dados ficassem organizados como estão no intervalo: A2:E2.
Ainda assim, agradeço sua disposição em ajudar!
Atenciosamente,
gamboaisrael .'.
Meus amigos, continuo procurando uma solução para o problema apontado aqui neste tópico.
Serei muito grato a qualquer ajuda.
Atenciosamente,
gamboaisrael .'.
bom dia gamboaisrael,
para resolver seu problema com "(na linha Set objNodes = xmlDOM.SelectNodes(strNó)). O erro é o: Erro em tempo de execução nº 424 - O Objeto é obrigatório."
basta você declarar a seguinte linha Dim xmlDOM As DOMDocument como variável global pois você esta chamando um objeto xmlDOM e ele não foi declarado.
isso resolve o problema.
ex:
Dim xmlDOM As DOMDocument '<<<<<<<<<<<<<< declaração de variável global.
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" ' depois segue o código normalmente......
Boa sorte.