Es una maravilla saber esto, hace poco me cree el mío ahora con la versión 4 hay nuevos nodos que los sistemas de descarga masiva se tardan en habilitar pero como ya no queria depender de ellos ya me arme mi propio extractor de datos de xml para armar mis reportes a mi gusto.
Chingon tu trabajo, lo mejor de todo, es que, compartes tu codigo y en lo personal ello ayuda a los aficionados a la programación a mirar otras perspectivas, y pulir, o aprender aun más
Excelente tutorial, como comentario a mi también me daba como resultado 0 y al cambiar la palabra dentro del paréntesis "Folio" me di cuenta que al escribirlo con mayuscula me daba el resultado contenido en el XMLS, y ya estoy inscrito en tu canal, Dios te bendiga.
6 ปีที่แล้ว
Es muy frecuente el error en el uso de mayúsculas.
Perfecto, me costó un poco de trabajo ya que me daba error de valor o a veces cero pero me di cuenta de que tal cual debemos de poner la palabra a buscar (en la fórmula) como se encuentra en el xml con las mayúsculas y minúsculas. DIOS TE BENDIGA AMIGO
Muchísimas gracias, me ayudaste muchísimo, no se porque a mi me funciona solo si le pongo una , en lugar de ; en la fórmula final pero funciona muy bien, muchas gracias
Gracias por este gran aporte, gracias a tu tutorial logre hacerme una hoja para poder imprimir mis facturas de acuerdo a mi formato, solo jalando el xml. DTB
Muchas gracias por estos tutoriales y este curso. Me queda una inquietud: Si los datos que necesitamos extraer no están en los atributos de los nodos sino entre las etiquetas de apertura y cierre, ejemplo: exoluciones..............como tendría que ir el texto de la macro en visual basic ??
Buen trabajo! A partir de 2013 ya se cuenta con la función "XMLFILTRO" la cual trabaja de manera similar. Otra observación tu función puede llegar, mas sera sumamente lenta con una gran cantidad de archivos a extraer es mejor procesar el XML como texto usando expresiones regulares o funciones de cadena!
6 ปีที่แล้ว
Estoy de acuerdo contigo, aunque bien podrías realizar otro proceso que transforme las funciones en valores. Aunque para mi resultó más atractivo crear una función con la que el usuario pudiera utilizar, ya que muchos usuarios de Excel buscan el tema de funciones.
6 ปีที่แล้ว
El inconveniente que encuentro es que tienes que cargar completamente el XML probablemente en una celda si lo quieres hacer así y luego utilizar la función XMLFILTRO y no existe una función de Excel para cargarlo, salvo que crees una y entonces sí podrías usar la función XMLFILTRO. Pero con la librería que utilizo puedes extenderte aún más para obtener todo tipo de información del XML como puede ser el número de atributos, el número de nodos y eso no te lo devuelve la función XMLFILTRO.
6 ปีที่แล้ว
Además con otra función que cree OBTENER_ATRIBUTOS puedes pasarle directamente los parámetros y con la función XMLFILTRO tendrías que hacer un concatenado que se adapte a la función. La función OBTENER_ATRIBUTOS se adapta al usuario, así que está mejor.
Están muy buenos los tutoriales, una pregunta se podría hacer eso en una tabla dinámica de manera que se puedan escojer los valores que necesitan los contadores. Gracias
Si les marca error en la fórmula es porque están utilizando versión de Office superior a la que se utiliza en el vídeo. Basta con sustituir el ; (punto y coma) por , (coma) y queda resuelto. ¡Saludos!
HOLA Te pregunto a ti porque veo que el del tutorial no responde a nadie. En las herramientas de "visual basic" en referencias en mi computadora viene microsoft office 16.0 y no 14.0, mi pregunta es cual tengo debo seleccionar "microsoft xml v3.0, v4.0 o v6.0? te agradezco de antemano
@@facturacionganaderos3839 Sugiero que igualmente escojas V3.0, en caso de que la macro no corra por incompatibilidad podrías saltar a la V4.0. Aunque en realidad no debería haber ningún problema si seleccionaras las 3 opciones. Saludos.
Una felicitación y un agradecimiento por compartir tus conocimientos y trabajo, son de gran utilidad. Ahora, tengo una pregunta, ¿Como puedo hacer para que Total e IVA puedan ser tratados como números y asi poderlos sumar? Saludos.
7 ปีที่แล้ว +1
Tienes dos opciones desde el código usar la función VAL o desde la hoja de cálculo utilizar la función VALOR.
disculpa la ignorancia, pero como lo pongo, mi función es la siguiente Function Total(ruta, dato) carga (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante") For Each nodo In listanodos Total = nodo.Attributes.getNamedItem(dato).Text Next End Function
Muchas gracias por este aporte, una pregunta funciona igual para excel 2013 porque al ponerle la formula para obtener el folio me dice error en la formula, gracias de nuevo.
Quiero hacer lo mismo pero mi xml engloba los datos así 49928... yo quiero sacar ese número 49928 en una celda. Así como esa etiqueta hay otra llamada dd/mm/yyyy. Con ese código puedo obtener el resultado? O se debe cambiar algo?
disculpe la molestia pero cuando tecleo la funcion comrpobante para que me de el folio excel me marca uncuadro de dialogo de error y me selecciona dentro de la formula la celda donce esta la ruta , me podria ayudar a solucionar esto tengo windows 7 home basico de 32 bits y excel 2010 gracias
Excelente video, me sirbió de mucho. En el caso de conceptos, si me salió bien, extrae unidad, importe y precio unitario, pero en el caso de facturas con dos conceptos como le hago? ya que solo me arroja un concepto, y los demas no, de antemano muchas gracias.
Hola. Ya seguí los pasos, e incluso regresé a poner mayúsculas y minúsculas tal cual el nombre que refleja el XML (como algún comentario que alguien antes posteó), y aún así, me marcar un error #¡VALOR!. Tengo excel 2013 y asumo eso debe hacer diferencia. He hecho el cambio en las indicaciones de =comprobante(A3;"Folio") por =comprobante(A3,"Folio") pues de la primer manera no lo acepta. ¿hay algo más que debiera considerar para que las indicaciones funcionen?
disculpa aprovechando , podrías subir los tutos en donde muestres como crear las otras funciones para los demás nodos y el de obtener las rutas de los xmls por favor . gracias y sigue así bro
Hola que tal muy bien explicado el video. Ya intenté hacer la función solo que cuando quiero hacer la prueba me manda el siguiente mensaje: "Hemos encontrado un problema en la fórmula. Puede intentar repararlo haciendo clic en Insertar función de la pestaña fórmulas..." no se a que se deba este error me podría apoyar porfavor. Gracias.
Se calculan promedio del XML pero en si no vienen como tal.
8 ปีที่แล้ว +1
Es que es solo lo que venga en el CFDI, por ejemplo el certificado, el sello, noCertificado los puedes obtener con la función COMPROBANTE y si creas una función que se llamase TIMBREFISCAL podrías obtener con ella el selloSAT, noCertificadoSAT y el selloCFD. Si tienes las versiones de OFFICE 2013 O 2016 puedes insertar una aplicación de la Tienda de Office que se llama QR4Office para obtener el QR. Espero que esto te sirva de ayuda.
Hola. mis xml son 3.2, 1.1, 1.2 y no sé si por eso me da "0" en cada consulta de cada nodo. No me da lo que señala el CFDI. Gracias por tu video. Espero tu respuesta.
6 ปีที่แล้ว
Debe ser porque debes escribir el nombre del atributo tal y como aparece en el XML, respetando mayúsculas y minúsculas, eso puede ser una opción, la otra es el nombre de la función. Por ejemplo; si tú escribes function OBTENER_IVA() y en el cuerpo de la función escribes OBTNER_IVA = .... Revisa cómo lo escribiste.
hola bro , realice todos tus pasos pero al realizar la prueba como tu la haces , me da "0",a que crees que se deba ? soy de México y lo hice en office 365
8 ปีที่แล้ว +3
En la descripción del vídeo de cómo crear tu programa visor de documentos xml o cfdi esté el código fuente.
8 ปีที่แล้ว +3
Private documentoxml As MSXML2.DOMDocument Private listanodos As MSXML2.IXMLDOMNodeList Private nodo As MSXML2.IXMLDOMNode Function CARGA(ruta) Set documentoxml = New DOMDocument documentoxml.Load (ruta) End Function Function COMPROBANTE(ruta, dato) CARGA (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante") For Each nodo In listanodos COMPROBANTE = nodo.Attributes.getNamedItem(dato).Text Next End Function Function EMISOR(ruta, dato) CARGA (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Emisor") For Each nodo In listanodos EMISOR = nodo.Attributes.getNamedItem(dato).Text Next End Function Function RECEPTOR(ruta, dato) CARGA (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Receptor") For Each nodo In listanodos RECEPTOR = nodo.Attributes.getNamedItem(dato).Text Next End Function Function UUID(ruta, dato) CARGA (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital") For Each nodo In listanodos UUID = nodo.Attributes.getNamedItem(dato).Text Next End Function Function IVA(ruta, dato) CARGA (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado") For Each nodo In listanodos IVA = nodo.Attributes.getNamedItem(dato).Text Next End Function Sub DESCARGAR() Dim dg As FileDialog Range("A3").Select Set dg = Application.FileDialog(msoFileDialogFilePicker) Dim archivo As Variant With dg If .Show = -1 Then For Each archivo In .SelectedItems ActiveCell.Value = archivo ActiveCell.Cells(2, 1).Select Next archivo End If End With Set dg = Nothing End Sub
hola muy excelente tu video pero tengo un problema al parecer igual que algunas personas de aqui y es que me sale de resultado cero, me podrias ayudar a decifrar el porque de este error muchas gracias
compañero tengo un problema a que correo te puedo enviar mi archivo y que lo vea a ver que error hay en la formula para empezar no puedo usar ; con solo , si me acepta los datos y la otra cosita es que mi xml es 4.3 de costa rica no se si te lo envio y vemos en que me puedes dar una luz al problema.
hola buen tarde. entonces este código no aplica para la version 3.3 de los xml ? o por que me manda error de valor? o que tengo que modificar disculpa.
Debes revisar como esta esta escrito tu atributo en el archivo, en mi xml el atributo iniciaba con una mayúscula "Folio" en vez de "folio" también revisa tu formula, al escribir en excel a mi me funciono así: =comprobante(C1,"Folio") usando coma entre la celda de la dirección del archivo y el atributo. Saludos.
muy buen video pero hoy Dic 2019 quisiera saber como saco de 1000 archivos de xml una lista donde tenga el campo de FOLIO FISCAL Y TOTAL, tengo que hacerlo 1 por 1 para pasarlos a excel pero 1000 me tardo mucho te agradecería con algún ejemplo de varios archivos (5 o 10) muchas gracias
Excelente tu aporte muy bueno, cuando pongo la formula de comprobante me marca cero como resultado no sabrás a que se debe. Gracias.
7 ปีที่แล้ว +1
A mi normalmente me pasa si escribo por ejemplo cfdi:comprobante en lugar de cfdi:Comprobante. Ya con eso te manda cero, porque no lo encuentra tienes que escribirlo tal como aparece en el XML.
Ok déjame verlo jejejeje gracias, ¿no tendrás toda la función ya escrita, podrás pasármela? se te agradecera mucho.
7 ปีที่แล้ว
Creo que ya lo resolví, si Tu nombre de función en el encabezado de tu código no coincide con el que aparece en el cuerpo del código, te puede mandar el error, supongamos esto: Tienes la función de la siguiente manera: Function COMPROBANTE(ruta as String, nombrenodo as String, estenodo as Integer, atributo as String) as String COMPROBNTE="El código que devuelve el valor de la función" End Function Como podrás notar no correponden, por lo tanto si tu escribes el nombre del título de la función en la celda de la hoja de cálculo te aparecerá Cero porque COMPROBANTE NO ES IGUAL A NINGÚN VALOR. Es decir que te aparece cero porque en la función no se ha definido el valor que devuelve la función. Esto quiere decir dos cosas que está mal escrito el nombre de la función dentro del cuerpo del código ó no se definió dentro del cuerpo de la función el valor que devuelve. Por eso yo recomiendo copiar el nombre de la función, literalmente Copiar y pegarlo en el cuerpo de la función.
No sé si alguien sepa por qué, pero cuando quiero escribir la última fórmula no puedo colocar el punto y coma después de escribir la celda de la ruta. Si también les pasó me avisan para sufrir juntos.
Hola, muy buena aportación, a mí me devuelve el valor "0" ya rectifiqué las mayúsculas y minúsculas y aún así me sigue devolviendo un cero
7 ปีที่แล้ว
Si quieren pásenme sus archivos por correo y les ayudo.
7 ปีที่แล้ว
Creo que ya lo resolví, si Tu nombre de función en el encabezado de tu código no coincide con el que aparece en el cuerpo del código, te puede mandar el error, supongamos esto: Tienes la función de la siguiente manera: Function COMPROBANTE(ruta as String, nombrenodo as String, estenodo as Integer, atributo as String) as String COMPROBNTE="El código que devuelve el valor de la función" End Function Como podrás notar no correponden, por lo tanto si tu escribes el nombre del título de la función en la celda de la hoja de cálculo te aparecerá Cero porque COMPROBANTE NO ES IGUAL A NINGÚN VALOR. Es decir que te aparece cero porque en la función no se ha definido el valor que devuelve la función. Esto quiere decir dos cosas que está mal escrito el nombre de la función dentro del cuerpo del código ó no se definió dentro del cuerpo de la función el valor que devuelve. Por eso yo recomiendo copiar el nombre de la función, literalmente Copiar y pegarlo en el cuerpo de la función.
Hola buenas tardes, soy de Argentina. tengo el siguiente XML. Como hago para que la función me devuelva "2019"? En este caso no es un atributo. Puede ser? Muchas gracias - 2019 11 2020-01-16 + + +
Buen día, tratando de hacer el ejercicio me arroja error #¡VALOR! y no se a que se deba, estuve leyendo los comentarios y observe que en tu video como crear tu programa visor vi que esta el codigo fuente y lo copie y pegue y me sigue dando el mismo error, si no es error en el codigo fuente que otra cosa puede ser? tengo excel 365, de antemano gracias por su ayuda.
Hola buenas tardes, tengo problemas con el archivo ya que estoy trabajando en MAC office 365 me da un error que me dice que "Error de Compilación:" No se ha definido el tipo definido por el usuario yo creo que el problema es que en la Mac no se sale la opción de habilitar las bibliotecas como que la herramienta de Visual Basic no está completa (este comentario por si tienes alguna solución para Mac) por otra parte recree el archivo tal como lo describes en el tutoría pero me da un error en Office 2007 la formula me devuelve el error Valor te agradezco mucho que me ayudes con el tema si necesitas que mande el archivo o me indiques que hacer. de antemano gracias.
Estoy haciendo el programa en Excel 2010 pero cuando trato de capturar el folio del archivo para probar el código me aparce un error. El código está igual al del vídeo. Qué puede ser? Gracias
utiliza la "coma" yo tambien pense que era el office 2013 y instale el 2010 pero no resulto con el punto y coma, hasta que se me ocurrio solo la "coma".
Hola, buenas tardes, muchisimas gracias por el tutorial, me ha servido muchisimo en el trabajo, solo tengo un pequeño problema; hay valores que necesito sacar del archivo xml pero estos se encuentran en un subtitulo y no estan asociados a una palabra, osea de esta manera: 54 Necesito sacar el valor de 54 pero me aparece un error y no se a que palabra asociar el valor. La funcion la realice de esta manera siguiendo tu tutorial: Function CARGAPERIODO(ruta, dato) CARGA (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Addenda/cfe:CFE/clsRegArchFact/TotalMed4") For Each nodo In listanodos CARGAPERIODO = nodo.Attributes.getNamedItem(dato).Text Next End Function espero tu amable y pronta respuesta y de nuevo te agradezco la ayuda
Hola Amigo, m nombre es Alberto, ante que nada felicitarte por tus vídeos, los mejores que he visto muy bien explicados. En base a tus vídeos hice un archivo para extraer la información de los xml complementos de pago, todo bien el archivo que muy bien, la cuestión es que al extraer la información del nodo "pago10:Pagos/pago10:Pago/pago10:DoctoRelacionado" cuando hay mas de un documento relacionado, osea que yo en mi complemento de pago ampara por ejemplo 5 facturas de ingresos dentro del xml irán relacionados los 5 UUID, sin embargo este archivo que cree solo me jala el ultimo, mi pregunta es ¿como puedo hacer que me jale los datos de cada documento relacionado?, y que cada documento lo inserte en una fila distinta recorriendo las demás facturas hacia abajo para no amontonar información. Si gustas te puedo enviar mi archivo y lo puedo compartir, acabo todo el código es lo que tu explicaste yo solo lo arme a mis necesidades, espero me puedas ayuda y muchas gracias. mi correo arv86.romano@hotmail.com
Function Dpago(ruta, dato) carga (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Complemento/pago10:Pagos/pago10:Pago/pago10:DoctoRelacionado") For Each nodo In listanodos Dpago = nodo.Attributes.getNamedItem(dato).Text Next End Function
Este es un ejemplo, en este xml de pago son tres las facturas relacionadas, pero solo me jala la tercera, yo quiero me jales los datos de las 3 y distintas filas, el nodo hijo de las 3 documentos relacionados se llama igual en todos los casos: " " - - -
5 ปีที่แล้ว
Si me pudieras compartir tu XML a mi correo amaranto1114@gmail.com.
ya he pasado varias veces esta función para obtener datos xml, pero al momento de aplicar la función hay una falla y en la parte donde se indica la celda de la ruta se marca como en negro y me dice que hay un error lo he repetido varias veces el video y la captura pero no logro el resultado
Me da un error dice que hay un problema con la formula que cuando el primer carácter es un signo igual = o un signo menos (-) Excel piensa que es una fórmula Sí escribe: 1+1 la celda muestra: 2.... Como se puede corregir este error?
Saludos, muchas gracias por su ayuda. le escribo desde chile. deseo realizar la misma operación, pero encuentro que los archivos generados por la facturación electrónica, estan en encoding="ISO-8859-1, el cual cambia y no es operacional su tutorial. Me puedes ayudar con esto. Mil Gracias
Me da resultado en 0 que puedo hacer? :( Tengo que decir que los XML que traro de leer son distintos a los tuyos (por el hecho de que somos de paises distintos), si me puedes ayudar, te lo agradeceria.
7 ปีที่แล้ว
Sucede que el lenguaje xml es sensible a mayúsculas y minúsculas, por lo tanto, si en el CFDI está en mayúsculas y lo escribes en minúsculas, te lo tomará como un valor diferente e inexistente.
Hola mi xml es diferente tal vez me puedes ayudar aqui te dejo una parte AUTORIZADO 0801201607004909900057370013064239631 2016-01-08T07:00:49-05:00 PRODUCCIÓN 21BANCO DEL PACIFICO S.A.BANCO DEL PACIFICO S.A.0990005737001
amigo una duda como hago para que me coloque el iva ret en un campo y el isr ret en otro campo este es el codigo que utilizo Function RETENCION(ruta As String, nombrenodo As String, nombreatributo As String) As String Set documentoxml = New DOMDocument documentoxml.Load (ActiveCell.Value) Set listanodos = documentoxml.getElementsByTagName("cfdi:Retencion") For Each nodo In listanodos MsgBox nodo.Attributes.Length For x = 0 To nodo.Attributes.Length - 1 With ActiveCell .Offset(0, fila + 1).Range("A1").Value = nodo.Attributes.Item(atributo).Text End With Next x Next nodo End Function
7 ปีที่แล้ว +1
UTILIZA desde las CELDAS la siguiente función Function OBTENER_ATRIBUTOS(ruta As String, nombrenodo As String, estenodo As Integer, nombreatributo As String) As String Set documentoxml = New DOMDocument documentoxml.Load (ruta) Set listanodos = documentoxml.getElementsByTagName(nombrenodo) OBTENER_ATRIBUTOS = listanodos.Item(estenodo).Attributes.getNamedItem(nombreatributo).Text End Function Ejemplo de fragmento de CFDI Si quieres el IVA Retenido estenodo = 0, si quieres el ISR Retenido estenodo = 1 (los nodos se enumeran o indizan empezando desde cero hasta el número total de nodos menos uno.) O sea que el nodo cfdi:Retencion tiene dos nodos y se indizan 0 , 1, Por lo tanto el nodo cfdi:Retencion índice 0 tiene los atributos importe="455.11" e impuesto="IVA" y el nodo cfdi:Retencion índice 1 tiene los atributos importe="426.67" e impuesto="ISR" --------------------------------------------------------------------------------------------------------------------------------- Los argumentos completos de la función serían: Para el IVA Retenido ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta) nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo) estenodo =0 (o C1 que contenga el número de nodo iniciando desde 0) nombreatributo="importe" (o D1 que contenga el nombre del atributo) Para el ISR Retenido ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta) nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo) estenodo =1 (o C1 que contenga el número de nodo iniciando desde 0) nombreatributo="importe" (o D1 que contenga el nombre del atributo) =OBTENER_ATRIBUTOS(A1,B1,0,"importe") valor=455.11 Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe")) Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades. =OBTENER_ATRIBUTOS(A1,B1,1,"importe") valor=426.67 Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe")) Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades. ------------------------------------------------------------------------------------------------------------------------------------ si en el XML están acomodadas diferente las retenciones Si quieres el IVA Retenido estenodo = 1, si quieres el ISR Retenido estenodo=0 Los argumentos completos de la función serían: Para el IVA Retenido ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta) nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo) estenodo =1 (o C1 que contenga el número de nodo iniciando dede 0) nombreatributo="importe" (o D1 que contenga el nombre del atributo) Para el ISR Retenido ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta) nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo) estenodo =0 (o C1 que contenga el número de nodo iniciando dede 0) nombreatributo="importe" (o D1 que contenga el nombre del atributo) =OBTENER_ATRIBUTOS(A1,B1,0,"importe") valor=426.67 Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe")) Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades. =OBTENER_ATRIBUTOS(A1,B1,1,"importe") valor=455.11 Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe")) Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades. (los nodos se enumeran o indizan empezando desde cero hasta el número total de nodos menos uno.) O sea que el nodo cfdi:Retencion tiene dos nodos y se indizan 0 , 1 O sea que el nodo cfdi:Retencion tiene dos nodos y se indizan 0 , 1, Por lo tanto el nodo cfdi:Retencion índice 0 tiene los atributos importe="426.67" e impuesto="ISR" y el nodo cfdi:Retencion índice 1 tiene los atributos importe="455.11" e impuesto="IVA" --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Si quieres que te los acomode automáticamente usa la función de la siguiente manera: =OBTENER_ATRIBUTOS(A1,B1,0,"impuesto") Te devolverá IVA o ISR según este acomodado en el XML Y lo puedes acomodar si en tu encabezados colocas IVA y luego ISR Tienes que comparar el valor de la función con tus encabezados y escribir la función si anidada en el argumento estenodo. si tu encabezado es igual al valor de la función =OBTENER_ATRIBUTOS(A1,B1,0,"impuesto") poner cero y si no entonces 1. =VALOR(OBTENER_ATRIBUTOS(C7,D7,SI(F$6=E7,0,1);"importe")) F$6 para comparar siempre el encabezado. C7 sería la ruta D7 el nombre del nodo: cfdi:Retencion F6 Sería tu encabezado (que contiene el texto IVA o ISR según corresponda) E7 contendría la función =OBTENER_ATRIBUTOS(C7,D7,0,"impuesto") Acomoda esta función a tu Libro y obtendrás el resultado que deseas. Solo hay que pensar tranquilamente y hacer prueba y error hasta que te salga y no desesperarte. Bueno después de todo el discurso que ojalá y lo leas detenidamente antes de rendirte, espero que te sirva de ayuda.
segui todo al pide de la letra y no me sale al hacer la formula de excel este es mi codigo Private documentoxml As MSXML2.DOMDocument Private listanodos As MSXML2.IXMLDOMNodeList Private nodo As MSXML2.IXMLDOMNode Function carga(ruta) Set documentoxml = New DOMDocument documentoxml.Load (ruta) End Function Function comprobante(ruta, dato) carga (ruta) Set listanodos = documentoxml.SelectNodes("/cfdiComprobante") For Each nodo In listanodos comprobante = nodo.Attributes.getNamedItem(dato).Text Next End Function
Debes revisar como esta esta escrito tu atributo en el archivo, en mi xml el atributo iniciaba con una mayúscula "Folio" en vez de "folio" también revisa tu formula, al escribir en excel a mi me funciono así: =comprobante(C1,"Folio") usando coma entre la celda de la dirección del archivo y el atributo. Saludos
Hola. Aquí actualizando para 2023 con versión 4.0. Private documentoxml As MSXML2.DOMDocument Private listanodos As MSXML2.IXMLDOMNodeList Private nodo As MSXML2.IXMLDOMNode Function carga(ruta) Set documentoxml = New DOMDocument documentoxml.Load (ruta) End Function Function Comprobante(ruta, dato) carga (ruta) Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante") For Each nodo In listanodos Comprobante = nodo.Attributes.getNamedItem(dato).Text Next End Function
Hola buenas tardes, esta genial el programa y llegó a hasta el nodo que necesito. solo que al tratar de extraer el valor del atributo no me devuelve nada. De este nodo quiero sacar los datos: 0 0 00000 81DW22A016913720 0 0 0 495.59 68008.62 1370.08 -978.24 68896.05 11023.36 79919.41 3444.8 81028.01 -81028 83364.22 Como puedo extraer los importes?
6 ปีที่แล้ว
Eso es porque tu XML no tiene la misma estructura, es decir, del tipo donde cada atributo tiene un nombre y un valor.
Hola, muy bueno tu aporte, pero esto se da para nodos con varios atributos, pero como podria hacerlo para nodo hijo, ejemplo: 3241-2211-2294-1 900331273 LABORATORIO DE PATOLOGIA Y CITOLOGIA DR RODRIGO R SEDE POBLADO - PA17 estaré atento gracias
6 ปีที่แล้ว
¿Hola, de qué país eres? Si queres pásame tu correo y te ayudo.
Es una maravilla saber esto, hace poco me cree el mío ahora con la versión 4 hay nuevos nodos que los sistemas de descarga masiva se tardan en habilitar pero como ya no queria depender de ellos ya me arme mi propio extractor de datos de xml para armar mis reportes a mi gusto.
Chingon tu trabajo, lo mejor de todo, es que, compartes tu codigo y en lo personal ello ayuda a los aficionados a la programación a mirar otras perspectivas, y pulir, o aprender aun más
Excelente tutorial, como comentario a mi también me daba como resultado 0 y al cambiar la palabra dentro del paréntesis "Folio" me di cuenta que al escribirlo con mayuscula me daba el resultado contenido en el XMLS, y ya estoy inscrito en tu canal, Dios te bendiga.
Es muy frecuente el error en el uso de mayúsculas.
Perfecto, me costó un poco de trabajo ya que me daba error de valor o a veces cero pero me di cuenta de que tal cual debemos de poner la palabra a buscar (en la fórmula) como se encuentra en el xml con las mayúsculas y minúsculas. DIOS TE BENDIGA AMIGO
Eres un gran maestro. Muy claros tu vídeos. Muchas gracias por compartir tu conocimiento.
Muchísimas gracias, me ayudaste muchísimo, no se porque a mi me funciona solo si le pongo una , en lugar de ; en la fórmula final pero funciona muy bien, muchas gracias
Gracias por este gran aporte, gracias a tu tutorial logre hacerme una hoja para poder imprimir mis facturas de acuerdo a mi formato, solo jalando el xml. DTB
Muchas gracias por estos tutoriales y este curso.
Me queda una inquietud:
Si los datos que necesitamos extraer no están en los atributos de los nodos sino entre las etiquetas de apertura y cierre, ejemplo: exoluciones..............como tendría que ir el texto de la macro en visual basic ??
Buen trabajo! A partir de 2013 ya se cuenta con la función "XMLFILTRO" la cual trabaja de manera similar.
Otra observación tu función puede llegar, mas sera sumamente lenta con una gran cantidad de archivos a extraer es mejor procesar el XML como texto usando expresiones regulares o funciones de cadena!
Estoy de acuerdo contigo, aunque bien podrías realizar otro proceso que transforme las funciones en valores. Aunque para mi resultó más atractivo crear una función con la que el usuario pudiera utilizar, ya que muchos usuarios de Excel buscan el tema de funciones.
El inconveniente que encuentro es que tienes que cargar completamente el XML probablemente en una celda si lo quieres hacer así y luego utilizar la función XMLFILTRO y no existe una función de Excel para cargarlo, salvo que crees una y entonces sí podrías usar la función XMLFILTRO. Pero con la librería que utilizo puedes extenderte aún más para obtener todo tipo de información del XML como puede ser el número de atributos, el número de nodos y eso no te lo devuelve la función XMLFILTRO.
Además con otra función que cree OBTENER_ATRIBUTOS puedes pasarle directamente los parámetros y con la función XMLFILTRO tendrías que hacer un concatenado que se adapte a la función. La función OBTENER_ATRIBUTOS se adapta al usuario, así que está mejor.
Están muy buenos los tutoriales, una pregunta se podría hacer eso en una tabla dinámica de manera que se puedan escojer los valores que necesitan los contadores. Gracias
ya lo tienes actualizado para Excel 2016?
Si les marca error en la fórmula es porque están utilizando versión de Office superior a la que se utiliza en el vídeo.
Basta con sustituir el ; (punto y coma) por , (coma) y queda resuelto.
¡Saludos!
HOLA Te pregunto a ti porque veo que el del tutorial no responde a nadie. En las herramientas de "visual basic" en referencias en mi computadora viene microsoft office 16.0 y no 14.0, mi pregunta es cual tengo debo seleccionar "microsoft xml v3.0, v4.0 o v6.0? te agradezco de antemano
@@facturacionganaderos3839 Sugiero que igualmente escojas V3.0, en caso de que la macro no corra por incompatibilidad podrías saltar a la V4.0.
Aunque en realidad no debería haber ningún problema si seleccionaras las 3 opciones.
Saludos.
@@aaronespejel6612 Gracias muy amable en responder, lo intentare.
Tendrás alguna opción para la versión 3.3? Saludos
Una felicitación y un agradecimiento por compartir tus conocimientos y trabajo, son de gran utilidad. Ahora, tengo una pregunta, ¿Como puedo hacer para que Total e IVA puedan ser tratados como números y asi poderlos sumar? Saludos.
Tienes dos opciones desde el código usar la función VAL o desde la hoja de cálculo utilizar la función VALOR.
Lo probé y funciono a la perfección, ahora puedo hacer cálculos, gracias, saludos.
disculpa la ignorancia, pero como lo pongo, mi función es la siguiente
Function Total(ruta, dato)
carga (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante")
For Each nodo In listanodos
Total = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Muchas gracias por este aporte, una pregunta funciona igual para excel 2013 porque al ponerle la formula para obtener el folio me dice error en la formula, gracias de nuevo.
Quiero hacer lo mismo pero mi xml engloba los datos así 49928... yo quiero sacar ese número 49928 en una celda. Así como esa etiqueta hay otra llamada dd/mm/yyyy. Con ese código puedo obtener el resultado? O se debe cambiar algo?
Muchas gracias por el tutorial. Me va a servir mucho. Se puede con cfdi nominas me imagino
Buenas Tardes, gracias por el apoyo, sigo los pasos del video pero el resultado siempre es 0
disculpe la molestia pero cuando tecleo la funcion comrpobante para que me de el folio excel me marca uncuadro de dialogo de error y me selecciona dentro de la formula la celda donce esta la ruta , me podria ayudar a solucionar esto tengo windows 7 home basico de 32 bits y excel 2010 gracias
Excelente video, me sirbió de mucho. En el caso de conceptos, si me salió bien, extrae unidad, importe y precio unitario, pero en el caso de facturas con dos conceptos como le hago? ya que solo me arroja un concepto, y los demas no, de antemano muchas gracias.
Hola. Ya seguí los pasos, e incluso regresé a poner mayúsculas y minúsculas tal cual el nombre que refleja el XML (como algún comentario que alguien antes posteó), y aún así, me marcar un error #¡VALOR!. Tengo excel 2013 y asumo eso debe hacer diferencia. He hecho el cambio en las indicaciones de =comprobante(A3;"Folio") por =comprobante(A3,"Folio") pues de la primer manera no lo acepta. ¿hay algo más que debiera considerar para que las indicaciones funcionen?
Excel 2019 hijo
Estas funciones solo aplican para xml 3.2. Que puedo usar para xml versiones 3.3?
disculpa aprovechando , podrías subir los tutos en donde muestres como crear las otras funciones para los demás nodos y el de obtener las rutas de los xmls por favor . gracias y sigue así bro
Aplica para la versión 2019 de office?
Hola que tal muy bien explicado el video. Ya intenté hacer la función solo que cuando quiero hacer la prueba me manda el siguiente mensaje: "Hemos encontrado un problema en la fórmula. Puede intentar repararlo haciendo clic en Insertar función de la pestaña fórmulas..." no se a que se deba este error me podría apoyar porfavor. Gracias.
HOLA, por favor me puedes decir como saco el resultado dentro de 26 , gracias.
Explicas súper bien!
Dios te bendiga amigo!!! Muchas Gracias
De lujo le tuto, sera possible calcular la Cadena Original del complemento de certificación digital del SAT y el QR?
Si se encuentra en el XML, sí.
Se calculan promedio del XML pero en si no vienen como tal.
Es que es solo lo que venga en el CFDI, por ejemplo el certificado, el sello, noCertificado los puedes obtener con la función COMPROBANTE y si creas una función que se llamase TIMBREFISCAL podrías obtener con ella el selloSAT, noCertificadoSAT y el selloCFD. Si tienes las versiones de OFFICE 2013 O 2016 puedes insertar una aplicación de la Tienda de Office que se llama QR4Office para obtener el QR. Espero que esto te sirva de ayuda.
Gracias
@ buenas tardes me podras mandar la liga para descargar el archivo
Muchas gracias por el tutorial! Ya me suscribí a tu canal y estoy en espera del siguiente! Saludos!
Ya lo subí.
Hola. mis xml son 3.2, 1.1, 1.2 y no sé si por eso me da "0" en cada consulta de cada nodo. No me da lo que señala el CFDI. Gracias por tu video. Espero tu respuesta.
Debe ser porque debes escribir el nombre del atributo tal y como aparece en el XML, respetando mayúsculas y minúsculas, eso puede ser una opción, la otra es el nombre de la función. Por ejemplo; si tú escribes function OBTENER_IVA() y en el cuerpo de la función escribes OBTNER_IVA = .... Revisa cómo lo escribiste.
Gracias por tu apoyo. Ya logré que funcionara. Felicitaciones
hola bro , realice todos tus pasos pero al realizar la prueba como tu la haces , me da "0",a que crees que se deba ? soy de México y lo hice en office 365
En la descripción del vídeo de cómo crear tu programa visor de documentos xml o cfdi esté el código fuente.
Private documentoxml As MSXML2.DOMDocument
Private listanodos As MSXML2.IXMLDOMNodeList
Private nodo As MSXML2.IXMLDOMNode
Function CARGA(ruta)
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
End Function
Function COMPROBANTE(ruta, dato)
CARGA (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante")
For Each nodo In listanodos
COMPROBANTE = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Function EMISOR(ruta, dato)
CARGA (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Emisor")
For Each nodo In listanodos
EMISOR = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Function RECEPTOR(ruta, dato)
CARGA (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Receptor")
For Each nodo In listanodos
RECEPTOR = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Function UUID(ruta, dato)
CARGA (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital")
For Each nodo In listanodos
UUID = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Function IVA(ruta, dato)
CARGA (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Impuestos/cfdi:Traslados/cfdi:Traslado")
For Each nodo In listanodos
IVA = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Sub DESCARGAR()
Dim dg As FileDialog
Range("A3").Select
Set dg = Application.FileDialog(msoFileDialogFilePicker)
Dim archivo As Variant
With dg
If .Show = -1 Then
For Each archivo In .SelectedItems
ActiveCell.Value = archivo
ActiveCell.Cells(2, 1).Select
Next archivo
End If
End With
Set dg = Nothing
End Sub
Excelente vídeo, sera que puedes realizar otro vídeo pero para un XML de acá de Ecuador porque parece que la estructura del XML es diferente
Mi correo es amaranto1114@gmail.com, podrías compartirme tu XML y te ayudo.
no se puede pegar y copiar?
Excelente video! gracias
10/10
hola muy excelente tu video pero tengo un problema al parecer igual que algunas personas de aqui y es que me sale de resultado cero, me podrias ayudar a decifrar el porque de este error muchas gracias
compañero tengo un problema a que correo te puedo enviar mi archivo y que lo vea a ver que error hay en la formula para empezar no puedo usar ; con solo , si me acepta los datos y la otra cosita es que mi xml es 4.3 de costa rica no se si te lo envio y vemos en que me puedes dar una luz al problema.
HOla amigo, tengo un problema en mis archivos xml no tengo cfdi, ayuda por favor
hola buen tarde. entonces este código no aplica para la version 3.3 de los xml ? o por que me manda error de valor? o que tengo que modificar disculpa.
Debes revisar como esta esta escrito tu atributo en el archivo, en mi xml el atributo iniciaba con una mayúscula "Folio" en vez de "folio"
también revisa tu formula, al escribir en excel a mi me funciono así:
=comprobante(C1,"Folio")
usando coma entre la celda de la dirección del archivo y el atributo.
Saludos.
muy buen video pero hoy Dic 2019 quisiera saber como saco de 1000 archivos de xml una lista donde tenga el campo de FOLIO FISCAL Y TOTAL, tengo que hacerlo 1 por 1 para pasarlos a excel pero 1000 me tardo mucho te agradecería con algún ejemplo de varios archivos (5 o 10) muchas gracias
Yo tengo un archivo de excel. Por si te interesa te lo mando mediante email.
@@ElContaTrejo podrías pasarmelo? te paso mi correo: bernal.eduardo80@uabc.edu.mx
estimado para sacar el concepto cuando tienes mas de uno como se le hace?? gracias
Excelente tu aporte muy bueno, cuando pongo la formula de comprobante me marca cero como resultado no sabrás a que se debe. Gracias.
A mi normalmente me pasa si escribo por ejemplo cfdi:comprobante en lugar de cfdi:Comprobante. Ya con eso te manda cero, porque no lo encuentra tienes que escribirlo tal como aparece en el XML.
Ok déjame verlo jejejeje gracias, ¿no tendrás toda la función ya escrita, podrás pasármela? se te agradecera mucho.
Creo que ya lo resolví, si Tu nombre de función en el encabezado de tu
código no coincide con el que aparece en el cuerpo del código, te puede
mandar el error, supongamos esto:
Tienes la función de la siguiente manera:
Function COMPROBANTE(ruta as String, nombrenodo as String, estenodo as Integer, atributo as String) as String
COMPROBNTE="El código que devuelve el valor de la función"
End Function
Como
podrás notar no correponden, por lo tanto si tu escribes el nombre del
título de la función en la celda de la hoja de cálculo te aparecerá Cero
porque COMPROBANTE NO ES IGUAL A NINGÚN VALOR. Es decir que te aparece
cero porque en la función no se ha definido el valor que devuelve la
función.
Esto quiere decir dos cosas que está mal escrito el
nombre de la función dentro del cuerpo del código ó no se definió dentro
del cuerpo de la función el valor que devuelve. Por eso yo recomiendo
copiar el nombre de la función, literalmente Copiar y pegarlo en el
cuerpo de la función.
ya lo vi si funciona jejeje gracias, pero para otros como ¿descripción del cfdi? no sale me muestra valor y ya
No sé si alguien sepa por qué, pero cuando quiero escribir la última fórmula no puedo colocar el punto y coma después de escribir la celda de la ruta. Si también les pasó me avisan para sufrir juntos.
Buenos días, cómo me podría comunicar contigo para que me ayudes, lo que pasa es que soy de Costa Rica y el formato de los XML es un poco distinto
Hola, muy buena aportación, a mí me devuelve el valor "0" ya rectifiqué las mayúsculas y minúsculas y aún así me sigue devolviendo un cero
Si quieren pásenme sus archivos por correo y les ayudo.
Creo que ya lo resolví, si Tu nombre de función en el encabezado de tu código no coincide con el que aparece en el cuerpo del código, te puede mandar el error, supongamos esto:
Tienes la función de la siguiente manera:
Function COMPROBANTE(ruta as String, nombrenodo as String, estenodo as Integer, atributo as String) as String
COMPROBNTE="El código que devuelve el valor de la función"
End Function
Como podrás notar no correponden, por lo tanto si tu escribes el nombre del título de la función en la celda de la hoja de cálculo te aparecerá Cero porque COMPROBANTE NO ES IGUAL A NINGÚN VALOR. Es decir que te aparece cero porque en la función no se ha definido el valor que devuelve la función.
Esto quiere decir dos cosas que está mal escrito el nombre de la función dentro del cuerpo del código ó no se definió dentro del cuerpo de la función el valor que devuelve. Por eso yo recomiendo copiar el nombre de la función, literalmente Copiar y pegarlo en el cuerpo de la función.
Hola buenas tardes, soy de Argentina. tengo el siguiente XML. Como hago para que la función me devuelva "2019"? En este caso no es un atributo. Puede ser? Muchas gracias
-
2019
11
2020-01-16
+
+
+
Buen día, tratando de hacer el ejercicio me arroja error #¡VALOR!
y no se a que se deba, estuve leyendo los comentarios y observe que en tu video como crear tu programa visor vi que esta el codigo fuente y lo copie y pegue y me sigue dando el mismo error, si no es error en el codigo fuente que otra cosa puede ser? tengo excel 365, de antemano gracias por su ayuda.
ya vi que con xml 3.2 si funciona pero con xml 3.3 no
Son las letras mayúsculas.
Hola buenas tardes, tengo problemas con el archivo ya que estoy trabajando en MAC office 365 me da un error que me dice que "Error de Compilación:" No se ha definido el tipo definido por el usuario yo creo que el problema es que en la Mac no se sale la opción de habilitar las bibliotecas como que la herramienta de Visual Basic no está completa (este comentario por si tienes alguna solución para Mac) por otra parte recree el archivo tal como lo describes en el tutoría pero me da un error en Office 2007 la formula me devuelve el error Valor te agradezco mucho que me ayudes con el tema si necesitas que mande el archivo o me indiques que hacer. de antemano gracias.
Me podrias ayudar con una macro para cargar todo un xml mediante un boton
Aca te lo hacen gratis. th-cam.com/video/YpDOqeSKn1o/w-d-xo.html
Excelente
Estoy haciendo el programa en Excel 2010 pero cuando trato de capturar el folio del archivo para probar el código me aparce un error. El código está igual al del vídeo. Qué puede ser? Gracias
Es bueno el aporte... Pero al trabajar en bases de datos de empresas muy grandes es demasiado impractico... Lo. Mejor es la. Programación
En office 2013 no funciona o no acepta el punto y como en la fórmula ¿cómo se resuelve esto, o sólo funciona con Office 2010?
Si no lo acepta usa lo que sí acepte, amigo, vas a ver que sí funciona.
utiliza la "coma" yo tambien pense que era el office 2013 y instale el 2010 pero no resulto con el punto y coma, hasta que se me ocurrio solo la "coma".
me sirvio tu aportacion!!! gracias!!!
Hola, buenas tardes, muchisimas gracias por el tutorial, me ha servido muchisimo en el trabajo, solo tengo un pequeño problema; hay valores que necesito sacar del archivo xml pero estos se encuentran en un subtitulo y no estan asociados a una palabra, osea de esta manera:
54
Necesito sacar el valor de 54 pero me aparece un error y no se a que palabra asociar el valor. La funcion la realice de esta manera siguiendo tu tutorial:
Function CARGAPERIODO(ruta, dato)
CARGA (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Addenda/cfe:CFE/clsRegArchFact/TotalMed4")
For Each nodo In listanodos
CARGAPERIODO = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
espero tu amable y pronta respuesta y de nuevo te agradezco la ayuda
Hola Amigo, m nombre es Alberto, ante que nada felicitarte por tus vídeos, los mejores que he visto muy bien explicados. En base a tus vídeos hice un archivo para extraer la información de los xml complementos de pago, todo bien el archivo que muy bien, la cuestión es que al extraer la información del nodo "pago10:Pagos/pago10:Pago/pago10:DoctoRelacionado" cuando hay mas de un documento relacionado, osea que yo en mi complemento de pago ampara por ejemplo 5 facturas de ingresos dentro del xml irán relacionados los 5 UUID, sin embargo este archivo que cree solo me jala el ultimo, mi pregunta es ¿como puedo hacer que me jale los datos de cada documento relacionado?, y que cada documento lo inserte en una fila distinta recorriendo las demás facturas hacia abajo para no amontonar información. Si gustas te puedo enviar mi archivo y lo puedo compartir, acabo todo el código es lo que tu explicaste yo solo lo arme a mis necesidades, espero me puedas ayuda y muchas gracias. mi correo arv86.romano@hotmail.com
Function Dpago(ruta, dato)
carga (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante/cfdi:Complemento/pago10:Pagos/pago10:Pago/pago10:DoctoRelacionado")
For Each nodo In listanodos
Dpago = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Este es un ejemplo, en este xml de pago son tres las facturas relacionadas, pero solo me jala la tercera, yo quiero me jales los datos de las 3 y distintas filas, el nodo hijo de las 3 documentos relacionados se llama igual en todos los casos: " "
-
-
-
Si me pudieras compartir tu XML a mi correo amaranto1114@gmail.com.
ya he pasado varias veces esta función para obtener datos xml, pero al momento de aplicar la función hay una falla y en la parte donde se indica la celda de la ruta se marca como en negro y me dice que hay un error lo he repetido varias veces el video y la captura pero no logro el resultado
El código está en la descripción
Hola, excelente explicación, sin embargo como recupero información dentro de , ayudame xfa
¿me podrías compartir tu XML?
Me da un error dice que hay un problema con la formula que cuando el primer carácter es un signo igual = o un signo menos (-) Excel piensa que es una fórmula
Sí escribe: 1+1 la celda muestra: 2....
Como se puede corregir este error?
hey, gracias me sirvio mucho :D
Puedes checar los demás vídeos dentro de la lista de reproducción. De cualquier manera, gracias.
Muchisimas gracias!!!!
De nada, falta pulirlo todavía, pero ya es un comienzo.
Buen dia, no me carga me marca un error en el renglon 1, me podrias ayudar de favor?
Saludos, muchas gracias por su ayuda. le escribo desde chile. deseo realizar la misma operación, pero encuentro que los archivos generados por la facturación electrónica, estan en encoding="ISO-8859-1, el cual cambia y no es operacional su tutorial. Me puedes ayudar con esto. Mil Gracias
robinson habrás encontrado la solución? yo tengo como nombre "EnvioDTE" y aun asi me aparece cero
Me da resultado en 0 que puedo hacer? :(
Tengo que decir que los XML que traro de leer son distintos a los tuyos (por el hecho de que somos de paises distintos), si me puedes ayudar, te lo agradeceria.
Sucede que el lenguaje xml es sensible a mayúsculas y minúsculas, por lo tanto, si en el CFDI está en mayúsculas y lo escribes en minúsculas, te lo tomará como un valor diferente e inexistente.
Hola mi xml es diferente tal vez me puedes ayudar aqui te dejo una parte
AUTORIZADO
0801201607004909900057370013064239631
2016-01-08T07:00:49-05:00
PRODUCCIÓN
21BANCO DEL PACIFICO S.A.BANCO DEL PACIFICO S.A.0990005737001
@@Elganador95185 a mi también me pasa lo mismo lo solucionasts
amigo una duda como hago para que me coloque el iva ret en un campo y el isr ret en otro campo
este es el codigo que utilizo
Function RETENCION(ruta As String, nombrenodo As String, nombreatributo As String) As String
Set documentoxml = New DOMDocument
documentoxml.Load (ActiveCell.Value)
Set listanodos = documentoxml.getElementsByTagName("cfdi:Retencion")
For Each nodo In listanodos
MsgBox nodo.Attributes.Length
For x = 0 To nodo.Attributes.Length - 1
With ActiveCell
.Offset(0, fila + 1).Range("A1").Value = nodo.Attributes.Item(atributo).Text
End With
Next x
Next nodo
End Function
UTILIZA desde las CELDAS la siguiente función
Function OBTENER_ATRIBUTOS(ruta As String, nombrenodo As String, estenodo As Integer, nombreatributo As String) As String
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
Set listanodos = documentoxml.getElementsByTagName(nombrenodo)
OBTENER_ATRIBUTOS = listanodos.Item(estenodo).Attributes.getNamedItem(nombreatributo).Text
End Function
Ejemplo de fragmento de CFDI
Si quieres el IVA Retenido estenodo = 0, si quieres el ISR Retenido estenodo = 1 (los nodos se enumeran o indizan empezando desde cero hasta el número total de nodos menos uno.)
O sea que el nodo cfdi:Retencion tiene dos nodos y se indizan 0 , 1, Por lo tanto el nodo cfdi:Retencion índice 0 tiene los atributos importe="455.11" e impuesto="IVA"
y el nodo cfdi:Retencion índice 1 tiene los atributos importe="426.67" e impuesto="ISR"
---------------------------------------------------------------------------------------------------------------------------------
Los argumentos completos de la función serían:
Para el IVA Retenido
ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta)
nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo)
estenodo =0 (o C1 que contenga el número de nodo iniciando desde 0)
nombreatributo="importe" (o D1 que contenga el nombre del atributo)
Para el ISR Retenido
ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta)
nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo)
estenodo =1 (o C1 que contenga el número de nodo iniciando desde 0)
nombreatributo="importe" (o D1 que contenga el nombre del atributo)
=OBTENER_ATRIBUTOS(A1,B1,0,"importe")
valor=455.11
Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe"))
Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades.
=OBTENER_ATRIBUTOS(A1,B1,1,"importe")
valor=426.67
Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe"))
Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades.
------------------------------------------------------------------------------------------------------------------------------------
si en el XML están acomodadas diferente las retenciones
Si quieres el IVA Retenido estenodo = 1, si quieres el ISR Retenido estenodo=0
Los argumentos completos de la función serían:
Para el IVA Retenido
ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta)
nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo)
estenodo =1 (o C1 que contenga el número de nodo iniciando dede 0)
nombreatributo="importe" (o D1 que contenga el nombre del atributo)
Para el ISR Retenido
ruta ="C:\Users\carlos quezada\Documents\XMLconRetenciones.xml" (o A1 que tenga la ruta)
nombrenodo ="cfdi:Retencion" o (B1 que contenga el nombre del nodo)
estenodo =0 (o C1 que contenga el número de nodo iniciando dede 0)
nombreatributo="importe" (o D1 que contenga el nombre del atributo)
=OBTENER_ATRIBUTOS(A1,B1,0,"importe")
valor=426.67
Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe"))
Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades.
=OBTENER_ATRIBUTOS(A1,B1,1,"importe")
valor=455.11
Si quieres trabajar como valor puedes usar la función =VALOR(OBTENER_ATRIBUTOS(A1,B1,0,"importe"))
Y así ya podrías SUMAR, RESTAR, MULTIPLICAR O DIVIDIR las cantidades. (los nodos se enumeran o indizan empezando desde cero hasta el número total de nodos menos uno.)
O sea que el nodo cfdi:Retencion tiene dos nodos y se indizan 0 , 1 O sea que el nodo cfdi:Retencion tiene dos nodos y se indizan 0 , 1,
Por lo tanto el nodo cfdi:Retencion índice 0 tiene los atributos
importe="426.67" e impuesto="ISR"
y el nodo cfdi:Retencion índice 1 tiene los atributos importe="455.11" e impuesto="IVA"
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Si quieres que te los acomode automáticamente usa la función de la siguiente manera:
=OBTENER_ATRIBUTOS(A1,B1,0,"impuesto")
Te devolverá IVA o ISR según este acomodado en el XML
Y lo puedes acomodar si en tu encabezados colocas IVA y luego ISR
Tienes que comparar el valor de la función con tus encabezados y escribir la función si anidada en el argumento estenodo.
si tu encabezado es igual al valor de la función =OBTENER_ATRIBUTOS(A1,B1,0,"impuesto") poner cero y si no entonces 1.
=VALOR(OBTENER_ATRIBUTOS(C7,D7,SI(F$6=E7,0,1);"importe"))
F$6 para comparar siempre el encabezado.
C7 sería la ruta
D7 el nombre del nodo: cfdi:Retencion
F6 Sería tu encabezado (que contiene el texto IVA o ISR según corresponda)
E7 contendría la función =OBTENER_ATRIBUTOS(C7,D7,0,"impuesto")
Acomoda esta función a tu Libro y obtendrás el resultado que deseas. Solo hay que pensar tranquilamente y hacer prueba y error hasta que te salga y no desesperarte.
Bueno después de todo el discurso que ojalá y lo leas detenidamente antes de rendirte, espero que te sirva de ayuda.
gracias amigo si me funciono, saludos
Muy interesante el aporte, me gustaría contactarme con usted para enviarle un archivo
Buenos días , me gustaría comunicarme contigo para una desarrollo si te interesa, que necesito y si tu lo puedes realizar como un servicio.
Hola, mi correo es amaranto1114@gmail.com
ESTA BIEN SOLO QUE IMAGÍNATE QUE QUE TENGAMOS QUE HACER ESO DE 100 XML,S , NO ACABARÍAMOS NUNCA DE TENER LA INFORMACIÓN
segui todo al pide de la letra y no me sale al hacer la formula de excel este es mi codigo
Private documentoxml As MSXML2.DOMDocument
Private listanodos As MSXML2.IXMLDOMNodeList
Private nodo As MSXML2.IXMLDOMNode
Function carga(ruta)
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
End Function
Function comprobante(ruta, dato)
carga (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdiComprobante")
For Each nodo In listanodos
comprobante = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Es cfdi:Comprobante, solo añade los dos puntos.
Debes revisar como esta esta escrito tu atributo en el archivo, en mi xml el atributo iniciaba con una mayúscula "Folio" en vez de "folio"
también revisa tu formula, al escribir en excel a mi me funciono así:
=comprobante(C1,"Folio")
usando coma entre la celda de la dirección del archivo y el atributo.
Saludos
Excelente video, lastima que no me sirvió, al finalizar todos los paso, no pude correr la formula en excel, me marco error :(
Muchas veces es porque tal como aparece en el XML debe ser escrito en la función.
Hola buenas tardes, no me queda el archivo ya revise que este bien escrito pero me manda error #¡VALOR!
Debe ser por las mayúsculas.
Hola. Aquí actualizando para 2023 con versión 4.0.
Private documentoxml As MSXML2.DOMDocument
Private listanodos As MSXML2.IXMLDOMNodeList
Private nodo As MSXML2.IXMLDOMNode
Function carga(ruta)
Set documentoxml = New DOMDocument
documentoxml.Load (ruta)
End Function
Function Comprobante(ruta, dato)
carga (ruta)
Set listanodos = documentoxml.SelectNodes("/cfdi:Comprobante")
For Each nodo In listanodos
Comprobante = nodo.Attributes.getNamedItem(dato).Text
Next
End Function
Como ves a estos que lo hacen gratis? th-cam.com/video/YpDOqeSKn1o/w-d-xo.html
Cuando lo compruebo me da valor y no se porque
Ya los tengo con, y también lo intente con ; y nada que me da el valor
Hola buenas tardes, esta genial el programa y llegó a hasta el nodo que necesito. solo que al tratar de extraer el valor del atributo no me devuelve nada.
De este nodo quiero sacar los datos:
0
0
00000
81DW22A016913720
0
0
0
495.59
68008.62
1370.08
-978.24
68896.05
11023.36
79919.41
3444.8
81028.01
-81028
83364.22
Como puedo extraer los importes?
Eso es porque tu XML no tiene la misma estructura, es decir, del tipo donde cada atributo tiene un nombre y un valor.
Entonces no se puede extraer el dato, por el tipo de escritura?
Sí se puede si gustas me podrías pasar tu correo y te ayudo.
me sale 0
error en formula excel 2010 =comprobante(B1;"TipoCambio") xml 3.3
UPPS NO ME FUNCIONÓ
Hola, muy bueno tu aporte, pero esto se da para nodos con varios atributos, pero como podria hacerlo para nodo hijo, ejemplo:
3241-2211-2294-1
900331273
LABORATORIO DE PATOLOGIA Y CITOLOGIA DR RODRIGO R
SEDE POBLADO
-
PA17
estaré atento gracias
¿Hola, de qué país eres? Si queres pásame tu correo y te ayudo.
PERDI MI TIEMPO VIENDO ESTE VIDEO