Importar datos a Excel desde Word

cgcamal

Active Member
Joined
May 2, 2007
Messages
472
Saludos a todos,

Tengo muchos archivos de MS Word que contienen ciertos datos que están bajo un título. La situación es que quisiera extraer esos datos y pegarlos organizadamente en una hoja de Excel.

Si son N libros de MS-Word, serían N filas en Excel. Y si son M datos que quiero extraer de cada libro de MS-Word, serían M columnas en Excel.


Alguien me puede dar una ayuda de cómo importar esto desde Excel.

Muchas gracias de antemano.
 
Hola cgcamal,

Aquí está un nuevo ' EncuentreDocumentos' macro para substituir el anterior.

Code:
Sub EncuentreDocumentos()
Dim strFldr As String
Dim StrDoc As String
Dim DirectoryListArray() As String
Dim x As Integer
x = 0
On Error GoTo Abort
strFldr = ConsigaCarpeta(Title:="Seleccione por favor una carpeta", RootFolder:=&H400) 'o &H11
StrDoc = Dir$(strFldr & "\*.doc")
Do While StrDoc <> ""
  x = x + 1
  ReDim Preserve DirectoryListArray(x)
  DirectoryListArray(x) = strFldr & "\" & StrDoc
  StrDoc = Dir$
Loop
MsgBox x & " documentos fueron encontrados."
If x > 0 Then
  i = 1
  ReDim Datos(6, i)
  Datos(1, i) = "CP"
  Datos(2, i) = "NDT"
  Datos(3, i) = "NDC"
  Datos(4, i) = "NDV"
  Datos(5, i) = "NP"
  Datos(6, i) = "NH"
  For x = 1 To UBound(DirectoryListArray)
    StrDoc = DirectoryListArray(x)
    MsgBox StrDoc
    Documents.Open Filename:=StrDoc
    Call ConsigaDatos
    With Documents.Item(StrDoc)
      .Saved = True
      .Close
    End With
  Next x
  Call EscribaDatos
End If
Abort:
End Sub
¡Goce!
 
Upvote 0

Excel Facts

When they said...
When they said you are going to "Excel at life", they meant you "will be doing Excel your whole life".
Macropod, ¿qué tal?

Estuve investigando qué sustituye a Application.FileSearch en Office 2007 y
parece ser FileSystemObject y la cual se debe definir como sigue:

Set fso = CreateObject("Scripting.FileSystemObject")<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p>
<o:p></o:p>
Pero probando y probando no pude lograr lo que necesito.

He estado pensando una manera más fácil, y es así:

<o:p></o:p>
1- Abrir el primer libro y almacenar el nombre
2- Buscar palabra que limita el inicio “Información personal” por ej.
3- Almacenar el número de línea en que se encuentra esta palabra = L1
4- Buscar la última palabra que me interesa dentro del libro
5- Almacenar el número de línea en que se encuentra esta última palabra = L2
6- Copiar rango entre L1-L2
7- Pegar el nombre del libro actual en el libro Destino.doc
8- Debajo del nombre del libro pegar el rango entre L1-L2
9- Cerrar el libro actual y abrir el siguiente hasta terminar todos los libros en el directorio.

Al unir todos los rangos en un solo libro de MS-Word, sería más fácil pasarlo a MS-Excel y trabajar con él.

Ojalá me pudieras ayudar.

Saludos
 
Upvote 0
Macropod,

Antes que nada, disculpas porque antes de mi ultimo post, no me había dado cuenta que me habías repondido con la macro "EncuentreDocumentos" ya modificada, sorry.

La macro "EncuentreDocumentos" ahora si funcionó con Dir, ya que pide buscar la carpeta, pero la macro "ConsigaDatos" parece que se queda en loop infinito, lo he probado con F8 paso a paso y nunca sale del ciclo
For Each.

Tal vez si solo se copia el rango que contiene la información, buscando una primera y una ultima palabra para almacenar posiciones de limite de inicio y final del rango. No sé, es una idea, me parece menos complicado que buscar cada campo.

Saludos
Saludos
 
Upvote 0
Hola César,

La macro parece trabajar correctamente para mí. Porque la macro tiene que hacer mucho trabajo, documentos de abertura, prueba todas las células en todas las tablas para los valores uces de los que usted quiere, puede tardar un cierto tiempo para procesar cada documento. Si usted tiene muchos documentos en la carpeta, ésta podría significar que la macro tardará un tiempo largo para terminar. Cuando está terminado, usted debe ver una hoja de trabajo de MS_Excel con todos los datos.

Hay dos declaraciones de Msgbox que usted podría suprimir: "MsgBox StrDoc" y "MsgBox "Hello"" que me fui accidentalmente adentro allí después de probar. Eso ayudaría a las macros para funcionar más rápidamente.

Inténtelo en una carpeta que tenga dos o tres documentos y déjeme saber si trabaja muy bien.

Saludos
 
Upvote 0
Macropod,

La he probado y funciona, pero no en todos los casos. por ejemplo, me
encontré con un libro que en el campo NDT tenía escritos en un solo cuadro pero en diferentes renglones(30) varios números asi:

600
607
610
617
.
.
697

pero en la celda NDT en Excel apareció

60.060.761.061.762.700.000.000...........000 y muchos triples ceros más separados por punto.

Para evitar esto sería posible separar hacia abajo este tipo de listas de números para un mismo campo, en lugar de hacerlo por comas dentro de una misma celda? o sea.

CP---NDT--NDC-NDV-NP-NH
504-12345-2345-117--2--4
-----54321-112- - - -
-----35378- - - - - - - -
-------.
-------.
-------.
-----98363

55-46897-546-114--1--3
----15567-23
------.
------.

Una pregunta más, cómo se podría dejar el nombre del libro que se abre en una columna al final, o sea, agregando un campo en el libro de Excel con el nombre en la misma linea de CP, para saber de qué libro es la información?

Bueno, saludos y muchas gracias de nuevo.
 
Upvote 0
No tengo mucho tiempo, ya estoy en la oficina. Pasaré hoy por la noche para ver cómo anda la cosa aquí, pero...

César, agregue un "watch" sobre el término oCel.Range.Text para poder ver qué está pasando mientras corre el bucle de for each oCel... y así tal vez aprende el por qué le está devolviendo un valor diferente a lo esperado.

Una pregunta más, cómo se podría dejar el nombre del libro que se abre en una columna al final, o sea, agregando un campo en el libro de Excel con el nombre en la misma linea de CP, para saber de qué libro es la información?

¿Qué piensa usted? ¿Dónde es que Macropod está llenando las celdas? En la rutina EscribaDatos, ¿verdad? ¿Cómo se escribe? Con una matriz. ¿Entonces? Habrá que ampliar la matriz y poner el nombre del archivo como último elemento de la matriz. ¿Entonces? Habrá que pasar el nombre del archivo a la rutina que llena la matriz como parametro o cambiar el alcance (scope) del variable que contiene el nombre del archivo para que sea visible a la rutina que llena la matriz.

Con una copia para hacer experimentos, hága pruebas para ver si puede lograrlo. (Sí, sé, otra vez yo dando lecturas de cómo pescar en vez de regalando pecesitos. Que profesor más duro, ¿verdad?)

Bueno, ya al trabajo para mi.

Saludos,
 
Upvote 0
Hola Greg,

Pienso entiendo que el problema César está teniendo y eso puedo fijarlo.

En cuanto a agregar el nombre del archivo, eso es fácil de hacer.

Convengo que no sería difícil que César agregue el nombre del archivo a la matriz, pero el otro problema es más difícil de solucionar.

Saludos
 
Upvote 0
Hola Macropod,
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p>
Actualmente la pregunta que hizo César fue bastante buena. Y usted tiene razón, es un poquito complicado para alguien con experiencia limitada con VBA. Pero mi forma de ayudar es tratar de enseñar más que regalar. Con pedir a César (u otro miembro leyendo) leer el código de usted y pensar en como uno lo haría, se crece un poco sus habilidades. A veces, termino "regalando el pez", pero no hasta que la persona haya hecho un esfuerzo primero. Si no, el estudiante seguirá débil para siempre. Por ejemplo, aquí hice a César sufrir bastante antes de darle las respuestas. :-D
<o:p></o:p>
Y un consejito no tanto para usted sino más para los demás que leen esto en el futuro. En un caso donde tenemos una sopa de aplicaciones, yo cambiaría el protocolo para nombrar variables para que fuera más claro a cual aplicación pertenece cada variable porque los objetos CELL y RANGE existen en ambas aplicaciones (también habrá que poner una referencia a Excel para poder utilizar early binding.)<o:p></o:p>
<o:p></o:p>
<o:p>
Code:
<o:p>Private Sub ConsigaDatos()
    Dim wd_docSource As Word.Document, _
        wd_tblSource As Word.Table, _
        wd_celSource As Word.Cell, _
        wd_rngSource As Word.Range
...</o:p>
<o:p>Private Sub EscribaDatos()
    Dim xl_appTarget As Excel.Application, _
        xl_wbTarget As Excel.Workbook, _
        xl_wsTarget As Excel.Worksheet</o:p>
</o:p><o:p></o:p>
 
Upvote 0
Macropod/Greg,

Hoy mi trabajo al fin me permitió un par de horas libres después de las horas de oficina para poder analizar sus consejos y códigos que tan gentilmente nos ofrecen en aras de nuestra ayuda y aprendizaje. Gracias por hacerme aprender de la mejor manera,la manera dificil, o sea, buscando, investigando, probando, fallando y al final triunfando.


He logrado, al menos de forma rudimentaria, colocar en la misma línea del campo "CP", el nombre del archivo.doc correspondiente con la sentencia "Datos(7, i - 1) = ActiveDocument.Name" al final de la macro "ConsigaDatos".Pero no sé porque el campo "NH" y el que agregué del "Nombre de Archivo", al pasar la información a Excel los estaba colocando una línea más abajo del campo "CP". Bueno, esto lo corregí restando uno al contador para ambos campos por ejemplo "Datos(7, i - 1) = ....".

Del código original de Macropod estoy aprendiendo sobre bastantes cosas nuevas, y sigo tratando de comprender cómo funciona cada línea de grupos de sentencias como la de abajo, especialmente la forma en que usó de la fucnión Replace::confused:

"If InStr(oCel.Range.Text, "(NP)") > 0 Then
Set oRng = oTbl.Cell(oCel.RowIndex + 1, oCel.ColumnIndex).Range
oRng.End = oRng.End - 1
Datos(1, i) = Replace(Replace(Replace(Trim(oRng.Text), vbCr, ","), vbTab, " "), ",,", ",")
End If"


Pero directamente Macropod, me te solicito me ayudés con las siguientes preguntas:

En la macro Sub EncuentreDocumentos(), en la línea

strFldr = ConsigaCarpeta(Title:="Seleccione por favor una carpeta", RootFolder:=&H400) 'o &H11

1-)¿Qué significa la parte "&H400" de la sentencia RootFolder:=&H400 o o &H11?

2-)¿Qué significa igualar a Dir$ en la sentencia StrDoc = Dir$?


Greg,

Limitado no, limitadísimo conocimiento mio en VBA, jaja, pero con los ejemplos y consejos como los de ustedes se va aprendiendo de a poco a lanzar el anzuelo al menos :-) y capturar a veces, sólo a veces sardinitas jajaja.:laugh:


Me gustaría tener más tiempo para la programación ya que me apasiona y me ayuda, pero mientras, seguiré tratando de ver la forma separar hacia abajo los diferentes datos que pueda tener el campo NDT o NDV. Lo bueno es que la macro funciona, sólo restan estos detalles. Además me queda pendiente lo de agregar la inspección (watch), aún me da fuera de contexto.

Les agradezco mucho, seguimos en contacto, saludos;)
 
Upvote 0
Estaba pensando que para evitar que los datos de NDT que al pasarse a Excel no son separados por comas de buena forma en algunos casos, porque tiende a tomarlo como un número muy grande ya que los une y por consiguiente aparece como 6.25388E-36 por ejemplo, tal vez se corrije enviando los datos a un archivo de excel ya existente y que tenga cierto formato en las celdas destino, por ejemplo, la columna en donde se escribirá NDT en formato de texto.


Pero no sé como direcccionar los datos en la macro "EscribaDatos()" a un libro de excel ya existente, por ejemplo que se llame,


"Datos importados.xls"


Les agradecería un consejo en este sentido.


Saludos cordiales.
 
Upvote 0

Forum statistics

Threads
1,223,970
Messages
6,175,710
Members
452,667
Latest member
vanessavalentino83

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top