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].