Aquí están los pasos:
1. Para empezar, crearemos una macro en Excel (macro que no tenía previsto escribir inicialmente). Para ello, actuaremos de la misma manera que con la macro de Word de la entrada anterior:
- Abre Excel, crea un documento en blanco y guárdalo con el nombre que estimes oportuno, cuidando de que el tipo de archivo sea "Libro de Excel habilitado para macros (*.xlsm)".
- En el menú "Vista", pulsa la ficha «Macros», la que está más a la derecha.
- En la casilla "Nombre de la macro" de la ventana que se ha abierto, escribe "Repeticiones" (sin las comillas, claro; en realidad valdría cualquier palabra o expresión, siempre que no dejes espacios entre las palabras y la utilices cada vez que hablemos de "Repeticiones").
- Pulsa el botón "Crear".
- Se abrirá una ventana con el editor de Visual Basic, en cuyo cuerpo principal aparecerá algo así:
End Sub
- Borra manualmente las dos líneas anteriores (desde el "Sub" del comienzo hasta el del final, ambos incluidos) y, mediante copiar y pegar, incluye el siguiente texto:
Dim NumeroHojas As Integer
Dim HojaActiva As Integer
Dim FilaPrimera As Integer
Dim Fila As Integer
Dim FilaUltima As Integer
Application.DisplayAlerts = False
NumeroHojas = ActiveWorkbook.Worksheets.Count
For HojaActiva = 1 To NumeroHojas
If Sheets(HojaActiva).Name = "TOTAL" Then Sheets(HojaActiva).Delete
Next
NumeroHojas = ActiveWorkbook.Worksheets.Count
Sheets(NumeroHojas).Select
Sheets.Add
Sheets(NumeroHojas).Move After:=Sheets(NumeroHojas + 1)
Sheets(NumeroHojas + 1).Select
Sheets(NumeroHojas + 1).Name = "TOTAL"
For HojaActiva = 1 To NumeroHojas
Sheets(HojaActiva).Select
Range("A1").Select
Range("A1").Activate
ActiveWorkbook.Worksheets(HojaActiva).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(HojaActiva).Sort.SortFields.Add Key:=Range("B1:B100000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets(HojaActiva).Sort.SortFields.Add Key:=Range("A1:A100000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(HojaActiva).Sort
.SetRange Range("A1:B100000")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
FilaPrimera = 1
Fila = FilaPrimera
Cells(Fila, 1).Select
Do While Not Cells(Fila, 1) < 1
Fila = Fila + 1
Cells(Fila, 1).Select
Loop
FilaUltima = Fila
If FilaUltima > 1 Then
Range(Cells(1, 1), Cells(FilaUltima - 1, 2)).Select
End If
Sheets("TOTAL").Select
Range("A1").Select
Range("A1").Activate
FilaPrimera = 1
Fila = FilaPrimera
Cells(Fila, 1).Select
Do While Not Cells(Fila, 1) < 1
Fila = Fila + 1
Cells(Fila, 1).Select
Loop
FilaUltima = Fila
Sheets(HojaActiva).Select
Selection.Copy
Sheets("TOTAL").Select
Cells(Fila, 1).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Next
Sheets("TOTAL").Select
Range("A1").Select
ActiveWorkbook.Worksheets("TOTAL").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("TOTAL").Sort.SortFields.Add Key:=Range("B1:B100000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("TOTAL").Sort.SortFields.Add Key:=Range("A1:A100000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("TOTAL").Sort
.SetRange Range("A1:B100000")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Columns("A:A").Select
Selection.Cut
Columns("C:C").Select
ActiveSheet.Paste
Columns("A:A").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Select
Rows("1:4").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select
ActiveCell.FormulaR1C1 = "nº de palabras"
Range("A2").Select
ActiveCell.FormulaR1C1 = "nº de páginas"
Range("B2").Select
ActiveCell.FormulaR1C1 = 200
Range("A3").Select
ActiveCell.FormulaR1C1 = "palabras x página"
Range("A4").Select
ActiveCell.FormulaR1C1 = "palabras x resalte"
Range("B4").Select
ActiveCell.FormulaR1C1 = 50
Columns("A:A").EntireColumn.AutoFit
Range("C4").Select
ActiveCell.FormulaR1C1 = "página nº"
Range("D4").Select
ActiveCell.FormulaR1C1 = "difª nº pal."
Range("B1").Select
ActiveCell.FormulaR1C1 = "=MAX(R[4]C:R[99999]C)"
Range("B3").Select
ActiveCell.FormulaR1C1 = "=+R[-2]C/R[-1]C"
Range("C5").Select
ActiveCell.FormulaR1C1 = "=RC[-1]/R3C2"
Range("D6").Select
ActiveCell.FormulaR1C1 = "=+IF(RC1=R[-1]C1,RC[-2]-R[-1]C[-2],"""")"
Rows("5:5").Select
ActiveWindow.FreezePanes = True
Range("A1:B1").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Range("A2:B2").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Range("A3:B3").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Range("A4:B4").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThick
.ColorIndex = 1
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Range("B2").Select
ActiveCell.Interior.ColorIndex = 6
Range("B4").Select
ActiveCell.Interior.ColorIndex = 6
Columns("A:D").Select
Selection.NumberFormat = "#,##0"
FilaPrimera = 1
Fila = FilaPrimera
Cells(Fila, 1).Select
Do While Not Cells(Fila, 1) < 1
Fila = Fila + 1
Cells(Fila, 1).Select
Loop
FilaUltima = Fila
Range("C5").Select
Selection.Copy
Range(Cells(5, 3), Cells(FilaUltima - 1, 3)).Select
ActiveSheet.Paste
Range("D6").Select
Application.CutCopyMode = False
Selection.Copy
Range(Cells(5, 4), Cells(FilaUltima - 1, 4)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Cells.FormatConditions.Delete
Range(Cells(6, 4), Cells(FilaUltima - 1, 4)).Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$D6<=$B$4"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Font
.ColorIndex = 2
.Bold = True
.Italic = False
End With
With Selection.FormatConditions(1).Interior
.Pattern = xlSolid
.PatternColorIndex = xlSolid
.ColorIndex = 26
End With
Selection.FormatConditions(1).StopIfTrue = False
Sheets("TOTAL").Select
Range("B2").Select
Range("B2").Activate
Application.DisplayAlerts = True
MsgBox ("HE TERMINADO")
End Sub
(Sí, lo sé, esta macro ya son palabras mayores, pero respira porque para utilizarla no tienes que hacer más que lo que has hecho: copiar y pegar).
- Acabas de crear una macro llamada "Repeticiones". Pulsa el icono de guardar para no perder lo hecho y cierra el editor de Visual Basic. Para que puedas reutilizarla en el futuro con cuantos documentos quieras, graba el archivo de Excel con el nombre que deseas, pero procura que sea uno acorde con su finalidad, para que puedas reconocerlo. En esas ocasiones bastará con que abras el fichero y continúes desde el siguiente paso 2.
2. Volcaremos en un único documento de Excel los datos de los diferentes archivos de procedencia en Word.
- Inicia Word, abre el primero de los documentos que creaste siguiendo el artículo anterior ("Análisis-1" en nuestro caso), selecciona el contenido íntegro (a mano o mediante el comando Edición-Seleccionar todo) y cópialo.
- Vuelve a la hoja de cálculo vacía de Excel en la que está guardada la macro "Repeticiones". Coloca el cursor en la celda "A1" de la primera pestaña en blanco y pega lo seleccionado en el documento de Word.
- Repite los dos pasos anteriores en pestañas diferentes de Excel para cada uno de los documentos de Word resultantes del análisis en las que hayas tenido que trocear el texto original.
- Cierra Word y deja abierto Excel.
- Renombra las pestañas del documento de Excel. Puedes poner 1-2-3-4, A-B-C-D, o cualquier otro nombre. Solo está "prohibido" llamar a alguna de ellas "TOTAL", ya que lo utilizará la macro. Es importante que los datos que aparezcan en las pestañas sean solo los que procedan del documento que pretendes analizar.
- Guarda por seguridad el fichero de Excel, pero no lo cierres aún.
3. Ejecutaremos la macro "Repeticiones" sobre el documento de Excel.
- Sitúate en una de las pestañas del archivo de Excel, no importa cuál.
- En el menú "Vista", pulsa la ficha «Macros», la que está más a la derecha.
- En la ventana que se ha abierto, selecciona la macro que has creado ("Repeticiones") y presiona la tecla "Ejecutar".
- La macro se habrá puesto a trabajar y, mientras lo hace, durante unos segundos/minutos, en función de la longitud del texto, el ordenador parecerá bloqueado. Es correcto. Ten paciencia y no utilices el teclado ni el ratón.
- Una vez aparezca en el centro de la pantalla el mensaje "HE TERMINADO", pulsa el botón "Aceptar".
- Guarda el documento creado con el nombre que desees.
La pestaña que estás viendo del fichero Excel, la llamada "TOTAL", ya tiene dispuesta para su análisis toda la información que necesitas para evaluar la densidad de las palabras que has utilizado en tu texto. Puedes empezar por tu cuenta a investigar cómo hacerlo o esperar a la siguiente entrega de esta serie de artículos.
Por supuesto, estaré encantado de escuchar tus comentarios y/o recomendaciones.
Ah, y si te ha gustado este artículo no te cortes y recomiéndalo en las redes sociales.
Uf, no sé si me atreveré, aunque supongo que puedo intentarlo. Suena muy interesante y seguramente es de mucha utilidad para chequear nuestros textos. Ya te diré, Javier, si acaso lo consigo. Desde luego, tú nos lo explicas claro y conciso. Otra cosa es el respeto que dan esas macros, esos big data... Pura cábala. Pues agradecerte tan buenos consejos y todo lo que siempre nos regalas por la red. Abrazo.
ResponderEliminarSi lo intentas y tienes algún problema, no dudes en decírmelo.
EliminarGracias a ti, Laura, por pasarte por aquí y comentar.
Otro abrazo.
Hola Javier, al probar la macro en excel me aparece un cartelito que dice: runtime error 438, Object doesn't suport this property or method. Solo necesito habilitar una pestaña en excel porque el texto es relativamente breve. Gracias
ResponderEliminarGracias a ti, Rodolfo, por pasarte por aquí y, sobre todo, por probar el procedimiento que propongo en esta serie de artículos. Por eso, lamento mucho que no te haya funcionado.
ResponderEliminarHe vuelto a seguir los pasos que se detallan en estos artículos y no he obtenido en ningún momento el mensaje de error que indicas. He investigado en internet el posible origen de dicho mensaje y puede que se trate de un error de escritura de la macro. Se me ocurre que, tal vez, en el paso de copiar y pegar el texto de la macro sobrara o faltara algo. A veces, una simple coma que falte o unas comillas que sobren es suficiente para que el programa falle.
Por ello, te propongo que, si te sigue interesando este procedimiento, vuelvas a seguir los pasos que se indican, incluidos los previos en Word, ya que sin ellos no servirá la macro de Excel.
Me gustaría poder ayudarte más, pero me es imposible al no poder estar presente para comprobar dónde y por qué se crea el error y, sobre todo, porque no soy más que un aficionado a la informática entusiasmado con aplicarla a la literatura.
Gracias de nuevo.
Saludos cordiales.
Hola, Javier.
ResponderEliminarAcabo de descubrir tu blog y he quedado gratamente sorprendido con tu magnífico invento. Estoy escribiendo una novela y esto ciertamente ayuda.
Muchas gracias por tu generosidad al compartirlo.
Carlos P.
Me alegro de que pueda servirte de ayuda.
EliminarGracias a ti por leerme.
Suerte con tu novela.
Saludos cordiales.
Hola Javier.
ResponderEliminarDespués de seguir los pasos recomendados; me da un error de compilación en la primera rutina (creo yo) error de sintaxis. Yo tengo la imagen; pero no se como enviártela.
Bueno es exactamente en este condicional:
ResponderEliminarIf Sheets(HojaActiva).Name = "TOTAL" Then Sheets(HojaActiva).Delete
Next
Muchas gracias por tu interés. He copiado y pegado todo el código, lo he vuelto a ejecutar y ha terminado sin errores. Es importante que copies y pegues el código desde la primera línea, Sub Repeticiones(), ya que en las líneas iniciales se definen las características de las variables, incluida "HojaActiva", que sospecho que es la que ha dado error.
EliminarSaludos cordiales.