Recuento de frecuencia de caracteres (Microsoft Word)
Scott está buscando una forma de obtener un «recuento de frecuencia» de todos los caracteres de un documento. Le gustaría saber cuántas veces aparece cada carácter, los códigos ASCII del 9 al 255. Es posible utilizar Buscar y reemplazar para determinar el recuento de caracteres individuales (simplemente busque un carácter en cuestión y luego reemplácelo por sí mismo), pero este enfoque sería tedioso, en el mejor de los casos, si necesitara hacerlo durante 247 diferentes códigos de caracteres para obtener la información deseada.
Esta tarea debe realizarse con una macro, pero hay varias formas de abordarla. Una forma es escribir una macro rápida que recorra cada miembro de la colección de Personajes, examinando cada uno y asignando ese carácter a uno de varios contadores.
Sub CountChars1() Dim iCount(0 To 255) As Integer Dim i As Integer Dim vCharacter As Variant Dim sTemp As String ' Initialize the array For i = 0 To 255 iCount(i) = 0 Next i ' Fill the array For Each oCharacter In ActiveDocument.Characters i = Asc(oCharacter) iCount(i) = iCount(i) + 1 Next ' Add document for results Documents.Add Selection.TypeText Text:="ASCII Character Count" & vbCrLf ' Only output codes 9 through 255 For i = 9 To 255 sTemp = Chr(i) If i < 32 Then sTemp = Trim(Str(i)) sTemp = sTemp & Chr(9) & Trim(Str(iCount(i))) sTemp = sTemp & vbCrLf Selection.TypeText Text:=sTemp Next i End Sub
La macro usa la matriz iCount para acumular los recuentos de cada código de carácter, y luego se crea un nuevo documento para generar los resultados. (El documento de resultados se puede formatear de la forma que se desee.)
Este enfoque puede funcionar bien para documentos relativamente cortos, de hasta unas pocas páginas. Cuando el documento se alarga, la macro se vuelve más lenta. ¿Por qué?
Porque lleva mucho tiempo usar la colección de Personajes por alguna razón. Si la macro es demasiado lenta para sus documentos, querrá cambiarla un poco para que funcione únicamente con cadenas.
Sub CountChars2() Dim iCount(0 To 255) As Long Dim i As Long Dim j as integer Dim lCharCount As Long Dim sDoc As String Dim sTemp As String ' Initialize the array For i = 0 To 255 iCount(i) = 0 Next i ' Assign document to a huge string lCharCount = ActiveDocument.Characters.Count sDoc = ActiveDocument.Range(0, lCharCount) ' Fill the array For i = 1 to Len(sDoc) j = Asc(Mid(sDoc, i, 1)) iCount(j) = iCount(j) + 1 Next ' Add document for results Documents.Add Selection.TypeText Text:="ASCII Character Count" & vbCrLf ' Only output codes 9 through 255 For i = 9 To 255 sTemp = Chr(i) If i < 32 Then sTemp = Trim(Str(i)) sTemp = sTemp & Chr(9) & Trim(Str(iCount(i))) sTemp = sTemp & vbCrLf Selection.TypeText Text:=sTemp Next i End Sub
Observe que esta versión de la macro incluye todo el documento en una sola cadena, sDoc. Esta cadena puede ser procesada muy, muy rápidamente por la macro. (Un documento de 635 páginas solo tardó unos 30 segundos en procesarse en mi sistema). Debido a que esta versión está diseñada para trabajar con documentos más largos, tenga en cuenta también que algunos de los tipos de variables se han cambiado para reflejar la probabilidad de conteos más grandes.
_Nota: _
Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios WordTips), he preparado una página especial que incluye información útil.
link: / wordribbon-WordTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador]
.
WordTips es su fuente de formación rentable en Microsoft Word.
(Microsoft Word es el software de procesamiento de texto más popular del mundo). Este consejo (411) se aplica a Microsoft Word 97, 2000, 2002 y 2003. Puede encontrar una versión de este consejo para la interfaz de cinta de Word (Word 2007 y más tarde) aquí:
link: / wordribbon-Character_Frequency_Count [Cuenta de frecuencia de caracteres]
.