Tengo un documento de Word con muchas tablas. ¿Alguien sabe cómo escribir una macro para exportar tales tablas a diferentes hojas de Excel?Macro para exportar tablas de MS Word a hojas de Excel
Respuesta
respuesta tomado de: http://www.mrexcel.com/forum/showthread.php?t=36875
Aquí hay un código que lee una tabla de Word en la hoja de trabajo activa de Excel. Le solicita el documento de Word y el número de tabla si Word contiene más de una tabla.
Sub ImportWordTable()
Dim wdDoc As Object
Dim wdFileName As Variant
Dim TableNo As Integer 'table number in Word
Dim iRow As Long 'row index in Excel
Dim iCol As Integer 'column index in Excel
wdFileName = Application.GetOpenFilename("Word files (*.doc),*.doc", , _
"Browse for file containing table to be imported")
If wdFileName = False Then Exit Sub '(user cancelled import file browser)
Set wdDoc = GetObject(wdFileName) 'open Word file
With wdDoc
TableNo = wdDoc.tables.Count
If TableNo = 0 Then
MsgBox "This document contains no tables", _
vbExclamation, "Import Word Table"
ElseIf TableNo > 1 Then
TableNo = InputBox("This Word document contains " & TableNo & " tables." & vbCrLf & _
"Enter table number of table to import", "Import Word Table", "1")
End If
With .tables(TableNo)
'copy cell contents from Word table cells to Excel cells
For iRow = 1 To .Rows.Count
For iCol = 1 To .Columns.Count
Cells(iRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
Next iCol
Next iRow
End With
End With
Set wdDoc = Nothing
End Sub
Esta macro se debe insertar en Excel (no Word) y puesto en un módulo macro estándar en lugar de en los módulos de código evento de hoja o un libro. Para hacerlo, vaya al VBA (teclado Alt-TMV), inserte un módulo de macro (Alt-IM) y pegue el código en el panel de códigos. Ejecute la macro desde la interfaz de Excel como lo haría con cualquier otro (Alt-TMM).
Si su documento contiene muchas tablas, como sería el caso si su tabla de más de 100 páginas es en realidad una tabla separada en cada página, este código podría modificarse fácilmente para leer todas las tablas. Pero por ahora espero que sea una sola tabla continua y no requiera ninguna modificación.
Keep Excelling.
Damon
VBAexpert Excel Consulting (mi otra vida: http://damonostrander.com)
Esta sección de código es el que recorre cada mesa y lo copia en Excel. Tal vez podría crear un objeto de hoja de cálculo que actualice dinámicamente la hoja de cálculo a la que se refiere usando el número de tabla como contador.
With .tables(TableNo)
'copy cell contents from Word table cells to Excel cells
For iRow = 1 To .Rows.Count
For iCol = 1 To .Columns.Count
Cells(iRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
Next iCol
Next iRow
End With
End With
No puedo hacer que esto funcione. El doble 'End With' no es correcto. – Wikis
Me encanta, esto es absolutamente genial, Damon (incluso si me llevó más de un año encontrar ...). Aquí está mi código final con una adición de bucle a través de todas las tablas (a partir de la tabla elegida):
Option Explicit
Sub ImportWordTable()
Dim wdDoc As Object
Dim wdFileName As Variant
Dim tableNo As Integer 'table number in Word
Dim iRow As Long 'row index in Excel
Dim iCol As Integer 'column index in Excel
Dim resultRow As Long
Dim tableStart As Integer
Dim tableTot As Integer
On Error Resume Next
ActiveSheet.Range("A:AZ").ClearContents
wdFileName = Application.GetOpenFilename("Word files (*.doc),*.doc", , _
"Browse for file containing table to be imported")
If wdFileName = False Then Exit Sub '(user cancelled import file browser)
Set wdDoc = GetObject(wdFileName) 'open Word file
With wdDoc
tableNo = wdDoc.tables.Count
tableTot = wdDoc.tables.Count
If tableNo = 0 Then
MsgBox "This document contains no tables", _
vbExclamation, "Import Word Table"
ElseIf tableNo > 1 Then
tableNo = InputBox("This Word document contains " & tableNo & " tables." & vbCrLf & _
"Enter the table to start from", "Import Word Table", "1")
End If
resultRow = 4
For tableStart = 1 To tableTot
With .tables(tableStart)
'copy cell contents from Word table cells to Excel cells
For iRow = 1 To .Rows.Count
For iCol = 1 To .Columns.Count
Cells(resultRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
Next iCol
resultRow = resultRow + 1
Next iRow
End With
resultRow = resultRow + 1
Next tableStart
End With
End Sub
siguiente truco: la elaboración de cómo extraer una tabla dentro de una mesa de la Palabra ... y lo que realmente quiero ¿a?
TC
Muchas gracias. Tuve que cambiar Para tableStart = 1 To tableTot to Para tableStart = tableNo To tableTot así que comienza donde se lo indicó. También hice una modificación para tener cada tabla almacenada en un libro de Excel separado. – javydreamercsw
Gracias tanto Damon y @Tim
lo modifico para abrir archivos docx, moví una línea clara hoja de trabajo después de la comprobación de fuga por el usuario.
Aquí es el código final:
Option Explicit
Sub ImportWordTable()
Dim wdDoc As Object
Dim wdFileName As Variant
Dim tableNo As Integer 'table number in Word
Dim iRow As Long 'row index in Excel
Dim iCol As Integer 'column index in Excel
Dim resultRow As Long
Dim tableStart As Integer
Dim tableTot As Integer
On Error Resume Next
wdFileName = Application.GetOpenFilename("Word files (*.docx),*.docx", , _
"Browse for file containing table to be imported")
If wdFileName = False Then Exit Sub '(user cancelled import file browser)
ActiveSheet.Range("A:AZ").ClearContents
Set wdDoc = GetObject(wdFileName) 'open Word file
With wdDoc
tableNo = wdDoc.tables.Count
tableTot = wdDoc.tables.Count
If tableNo = 0 Then
MsgBox "This document contains no tables", _
vbExclamation, "Import Word Table"
ElseIf tableNo > 1 Then
tableNo = InputBox("This Word document contains " & tableNo & " tables." & vbCrLf & _
"Enter the table to start from", "Import Word Table", "1")
End If
resultRow = 4
For tableStart = tableNo To tableTot
With .tables(tableStart)
'copy cell contents from Word table cells to Excel cells
For iRow = 1 To .Rows.Count
For iCol = 1 To .Columns.Count
Cells(resultRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
Next iCol
resultRow = resultRow + 1
Next iRow
End With
resultRow = resultRow + 1
Next tableStart
End With
End Sub
- 1. Exportación de tablas jsp a excel, word, pdf
- 2. Alternativa a MS-Access/Excel para manipulación de hojas de cálculo
- 3. ¿La mejor manera de exportar html a Word sin tener instalado MS Word?
- 4. Desencadenar MS Word macro después del evento de guardar
- 5. Macro independiente de Excel
- 6. Crear tablas en un archivo de MS Word usando Java
- 7. extracción de datos de MS Word
- 8. Exportar SQL a Excel
- 9. Exportar de PHP a Excel
- 10. Exportar a Excel C#
- 11. datagridview exportar a excel
- 12. Procedimiento almacenado de SQL Server exportar a libro de Excel con varias hojas
- 13. Rellenar un formulario ms-word VBA/Navegación inteligente más eficaz a través de Word
- 14. Cómo exportar todas las tablas de una Base de datos de Access a Excel - Una hoja para cada tabla
- 15. C# API para MS Word Editor de ecuaciones
- 16. ASP.Net Exportar datos a Excel
- 17. Exportar tabla HTML a Excel
- 18. Desarrollo de complemento MS Word
- 19. macro de MS Outlook para tachar el texto seleccionado
- 20. php + jqgrid + exportar a excel
- 21. Exportar registros de Datagridview a Excel
- 22. Exportación MS tablas de acceso a través de VBA a una hoja de cálculo de Excel en el mismo directorio
- 23. Microsoft Word Macro para resaltar varias palabras
- 24. automática la creación de tablas en Word a partir de un documento de Excel
- 25. Exportar datos de consulta SQL a Excel
- 26. Exportar informes de Jenkins a Excel
- 27. macro para Ocultar filas en excel 2010
- 28. apoyo MS Word en IOS
- 29. Cómo obtener hojas de excel con nombre al exportar desde SSRS
- 30. ¿Subir archivos de MS Word de Android a .Net WCF?
Gracias por el código. Creo que puedo modificar tu código para leer todas las tablas, pero ¿cómo puedo crear una hoja de Excel diferente para cada tabla? – QLands
Estas fuentes no mantienen el formato de texto de las tablas de Word originales. ¿Existe alguna solución? –
Si el código arroja un error al analizar la tabla, intente poner este código en una nueva línea después de la línea "With wdDoc": "On Error Resume Next". Esto básicamente dice que si una celda arroja un error recuperable, la ejecución del código no se detendrá, sino que reanudará la ejecución a la siguiente celda. – Santhos