ramo102e
23-04-2008, 17:37
Ciao a tutti, ho una macro VBA di Word che dovrebbe contare tutti i caratteri presenti in un documento, compresi quelli che Word stesso esclude dal conteggio, come header e footer (le note a pie' di pagine si possono facilmente includere o meno).
Il problema e' che la suddetta macro, non appena inserico nel documento una nota o un header/footer, sballa il conteggio aumentando di 4 il numero di parole e caratteri presenti.
Ecco il codice:
Option Explicit
Sub CountAllCharacters()
Dim ostory As Object
Dim caratteri As Long, Parole As Long, CaratteriWord As Long, ParoleWord As Long, CaratteriSelezione As Long, ParoleSelezione As Long
Dim Percent As Integer
Dim RigheSelezioneArr As Integer
Dim Selezione As Range
Dim Righe As Double, CartelleSelezione As Double, RigheSelezione As Double, Cartelle As Double
Dim MessaggioSelezione As String, MessaggioDiverso As String, Messaggio As String
Dim RigheArr
For Each ostory In ActiveDocument.StoryRanges
caratteri = caratteri + ostory.ComputeStatistics(wdStatisticCharactersWithSpaces)
Parole = Parole + ostory.ComputeStatistics(wdStatisticWords)
Do While Not (ostory.NextStoryRange Is Nothing)
Set ostory = ostory.NextStoryRange
caratteri = caratteri + ostory.ComputeStatistics(wdStatisticCharactersWithSpaces)
Parole = Parole + ostory.ComputeStatistics(wdStatisticWords)
Loop
Next ostory
CaratteriWord = ActiveDocument.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces)
ParoleWord = ActiveDocument.ComputeStatistics(Statistic:=wdStatisticWords)
Cartelle = caratteri / 1500
Cartelle = Round(Cartelle, 2)
Righe = caratteri / 55
RigheArr = -Int(-Righe)
Righe = Round(Righe, 2)
If Not Selection.Start = Selection.End Then
CaratteriSelezione = Selection.Range.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces)
ParoleSelezione = Selection.Range.ComputeStatistics(Statistic:=wdStatisticWords)
CartelleSelezione = CaratteriSelezione / 1500
CartelleSelezione = Round(CartelleSelezione, 2)
RigheSelezione = CaratteriSelezione / 55
RigheSelezioneArr = -Int(-RigheSelezione)
RigheSelezione = Round(RigheSelezione, 2)
Percent = CaratteriSelezione * 100 / caratteri
MessaggioSelezione = "Conteggio nella selezione:" & vbCr _
& " parole: " & ParoleSelezione & vbCr _
& " caratteri spazi inclusi: " & CaratteriSelezione & vbCr _
& " cartelle: " & CartelleSelezione & vbCr _
& " righe: " & RigheSelezioneArr & " (" & RigheSelezione & ")" & vbCr & vbCr _
& "La selezione corrisponde al " & Percent & "% del testo totale." & vbCr _
& "_____________________________________________________" & vbCr & vbCr
End If
If caratteri <> CaratteriWord Then
MessaggioDiverso = "Conteggio di Word:" & vbCr _
& " parole: " & ParoleWord & vbCr _
& " caratteri spazi inclusi: " & CaratteriWord & vbCr _
& "_____________________________________________________" & vbCr & vbCr
End If
Messaggio = "Conteggio comprensivo di cornici di testo, pié di pagina, note, ecc." & vbCr _
& "_____________________________________________________" & vbCr & vbCr _
& MessaggioSelezione _
& MessaggioDiverso _
& "Conteggio completo:" & vbCr _
& " parole: " & Parole & vbCr _
& " caratteri spazi inclusi: " & caratteri & vbCr _
& " cartelle: " & Cartelle & vbCr _
& " righe: " & RigheArr & " (" & Righe & ")" & vbCr _
& "_____________________________________________________" & vbCr & vbCr _
& " Buon lavoro!!!"
MsgBox Messaggio, 64
End Sub
Faccio un esempio: se aggiungo come header la parola "Intestazione" mi aspetterei di avere il risultato:
word: 1 characters: 12
Invece ottengo:
word: 5 characters: 16
Successivamente invece il conteggio dei caratteri di queste entita' avviene correttamente.
Qualcuno sa come correggerlo? Grazie! ;)
Il problema e' che la suddetta macro, non appena inserico nel documento una nota o un header/footer, sballa il conteggio aumentando di 4 il numero di parole e caratteri presenti.
Ecco il codice:
Option Explicit
Sub CountAllCharacters()
Dim ostory As Object
Dim caratteri As Long, Parole As Long, CaratteriWord As Long, ParoleWord As Long, CaratteriSelezione As Long, ParoleSelezione As Long
Dim Percent As Integer
Dim RigheSelezioneArr As Integer
Dim Selezione As Range
Dim Righe As Double, CartelleSelezione As Double, RigheSelezione As Double, Cartelle As Double
Dim MessaggioSelezione As String, MessaggioDiverso As String, Messaggio As String
Dim RigheArr
For Each ostory In ActiveDocument.StoryRanges
caratteri = caratteri + ostory.ComputeStatistics(wdStatisticCharactersWithSpaces)
Parole = Parole + ostory.ComputeStatistics(wdStatisticWords)
Do While Not (ostory.NextStoryRange Is Nothing)
Set ostory = ostory.NextStoryRange
caratteri = caratteri + ostory.ComputeStatistics(wdStatisticCharactersWithSpaces)
Parole = Parole + ostory.ComputeStatistics(wdStatisticWords)
Loop
Next ostory
CaratteriWord = ActiveDocument.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces)
ParoleWord = ActiveDocument.ComputeStatistics(Statistic:=wdStatisticWords)
Cartelle = caratteri / 1500
Cartelle = Round(Cartelle, 2)
Righe = caratteri / 55
RigheArr = -Int(-Righe)
Righe = Round(Righe, 2)
If Not Selection.Start = Selection.End Then
CaratteriSelezione = Selection.Range.ComputeStatistics(Statistic:=wdStatisticCharactersWithSpaces)
ParoleSelezione = Selection.Range.ComputeStatistics(Statistic:=wdStatisticWords)
CartelleSelezione = CaratteriSelezione / 1500
CartelleSelezione = Round(CartelleSelezione, 2)
RigheSelezione = CaratteriSelezione / 55
RigheSelezioneArr = -Int(-RigheSelezione)
RigheSelezione = Round(RigheSelezione, 2)
Percent = CaratteriSelezione * 100 / caratteri
MessaggioSelezione = "Conteggio nella selezione:" & vbCr _
& " parole: " & ParoleSelezione & vbCr _
& " caratteri spazi inclusi: " & CaratteriSelezione & vbCr _
& " cartelle: " & CartelleSelezione & vbCr _
& " righe: " & RigheSelezioneArr & " (" & RigheSelezione & ")" & vbCr & vbCr _
& "La selezione corrisponde al " & Percent & "% del testo totale." & vbCr _
& "_____________________________________________________" & vbCr & vbCr
End If
If caratteri <> CaratteriWord Then
MessaggioDiverso = "Conteggio di Word:" & vbCr _
& " parole: " & ParoleWord & vbCr _
& " caratteri spazi inclusi: " & CaratteriWord & vbCr _
& "_____________________________________________________" & vbCr & vbCr
End If
Messaggio = "Conteggio comprensivo di cornici di testo, pié di pagina, note, ecc." & vbCr _
& "_____________________________________________________" & vbCr & vbCr _
& MessaggioSelezione _
& MessaggioDiverso _
& "Conteggio completo:" & vbCr _
& " parole: " & Parole & vbCr _
& " caratteri spazi inclusi: " & caratteri & vbCr _
& " cartelle: " & Cartelle & vbCr _
& " righe: " & RigheArr & " (" & Righe & ")" & vbCr _
& "_____________________________________________________" & vbCr & vbCr _
& " Buon lavoro!!!"
MsgBox Messaggio, 64
End Sub
Faccio un esempio: se aggiungo come header la parola "Intestazione" mi aspetterei di avere il risultato:
word: 1 characters: 12
Invece ottengo:
word: 5 characters: 16
Successivamente invece il conteggio dei caratteri di queste entita' avviene correttamente.
Qualcuno sa come correggerlo? Grazie! ;)