Avatar billede Dan Elgaard Ekspert
04. september 2019 - 21:17 Der er 11 kommentarer og
1 løsning

Ord pr. linje makro

Hejsa,

jeg har brug for en makro kode, der løber et dokument, og tæller antal ord pr. linje i dokumentet.

Derefter, skal deles med antal linjer i dokumentet, så man får det gennemsnitlige antal ord pr. linje i dokumentet.

OG!  Alle linjer, der indeholde 3 eller mindre antal ord skal springes over.

Nogen, der vil hjælpe?
Avatar billede Mark H. Juniormester
04. september 2019 - 22:22 #1
Hvor har du din tekst? Online, i et Word dokument eller noget helt tredje?
04. september 2019 - 22:26 #2
Kig lidt på det... ellers skal du igennem alle Paragraphs
Sub test()
    Debug.Print ActiveDocument.Words.Count
    Debug.Print ActiveDocument.Paragraphs.Count
    Debug.Print ActiveDocument.BuiltInDocumentProperties(wdPropertyLines)
End Sub
04. september 2019 - 22:33 #3
Der kan også være paragraphs som er tomme
Avatar billede Dan Elgaard Ekspert
04. september 2019 - 23:08 #4
Hej Flemming,

Jeg har kigget på netop de metoder, som du henviser til, men de regner ganske enkelt forkert!
Visse tegn bliver medregnet som ord i sig selv, som f.eks., hvis en sætning starter med indrykning og "anførselstegn".
Ligeledes blive linjeskift medregnet som et ord.

Så, nu er jeg gået i gang med, at lave min helt eget udgave.
Tricket er, at læse linjerne ind i et array, og gennemløbe linerne.
Det virker nu, så nu er jeg gået i gang med, at lave mit eget interface - burde være klar om en halv times tid :-)
04. september 2019 - 23:20 #5
Hvis du griber fat i Paragraphs objektet til en start... anyways god fornøjelse
Avatar billede Dan Elgaard Ekspert
04. september 2019 - 23:51 #6
Done :-)

Lukker spørgsmålet - fik selv strikket en makro sammen :-)

Tak for input...
Avatar billede mort1 Ekspert
05. september 2019 - 11:17 #7
Ved selvfølgelig ikke, om det er noget du vil holde for dig selv, men ellers kunne det jo være interessant for os andre, at se løsningen.
Avatar billede Dan Elgaard Ekspert
05. september 2019 - 18:32 #8
Makroen er blevet udvidet med en del ekstra ting, så den er for stor, til, at blive bragt her.

Men, i bund og grund er det , som jeg skriver: Læs hver enkelt linje ind i variabel, og gør, med linjen, hvad du har behov for, gennem denne variabel.
14. september 2019 - 09:39 #9
Her er lidt til dem der har fulgt... eller i fremtiden søger...

Lav et Word dokument - skriv  =rannd(8,4)  og tryk enter (for at få lidt demo tekst)
Skriv noget i sidehoved også... og leg lidt med denne makro

God fornøjelse


Public Sub WordsInfo()
    Dim oStory As Object
    Dim lWordCount As Long, lMainCount As Long, lHeaderCount As Long
   
    'Loop through each story range and only include the footer and Main story to the word count
    For Each oStory In ActiveDocument.StoryRanges
        'Vi kunne lave en select case på hver story type, hvis deres individuelle word count var vigtig - se types her
        'https://docs.microsoft.com/en-us/office/vba/api/word.wdstorytype
        Select Case oStory.StoryType
            Case wdMainTextStory
                lMainCount = oStory.ComputeStatistics(wdStatisticWords)
                lWordCount = lWordCount + oStory.ComputeStatistics(wdStatisticWords)
            Case wdPrimaryHeaderStory, wdFirstPageHeaderStory, wdEvenPagesHeaderStory
                lHeaderCount = lHeaderCount + oStory.ComputeStatistics(wdStatisticWords)
                lWordCount = lWordCount + oStory.ComputeStatistics(wdStatisticWords)
            Case Else
                lWordCount = lWordCount + oStory.ComputeStatistics(wdStatisticWords)
        End Select
    Next oStory
   
    Debug.Print "Antal ord i Headers er: " & lHeaderCount
    Debug.Print "Antal ord i Mainstory er: " & lMainCount
    Debug.Print "Antal ord story by story er: " & lWordCount
    With ActiveDocument.Range
        Debug.Print .ComputeStatistics(wdStatisticWords)
        Debug.Print .ComputeStatistics(wdStatisticCharacters)
        Debug.Print .ComputeStatistics(wdStatisticCharactersWithSpaces)
        Debug.Print .ComputeStatistics(wdStatisticFarEastCharacters)
        Debug.Print .ComputeStatistics(wdStatisticLines)
        Debug.Print .ComputeStatistics(wdStatisticPages)
        Debug.Print .ComputeStatistics(wdStatisticParagraphs)
       
        'Svar på dette spørgsmål kunne være - men den tæller 0 linier med... og giver en skæv statistik
        Debug.Print "Antal ord pr. linie: " & .ComputeStatistics(wdStatisticWords) / .ComputeStatistics(wdStatisticLines)
    End With


    'Det mere korrekte svar på dette spørgsmål er
    Dim lLines As Long, x As Long, lCountLines As Long
    lLines = ActiveDocument.Range.ComputeStatistics(wdStatisticLines)
    Selection.HomeKey wdStory
    For x = 1 To lLines
        With Selection
            .EndKey Unit:=wdLine, Extend:=wdExtend
            If .Characters.Count > 1 Then lCountLines = lCountLines + 1
            .Collapse wdCollapseStart
            .MoveDown Unit:=wdLine, Count:=1
      End With
    Next x
   
    Debug.Print "Antal ord pr. linie: " & ActiveDocument.Range.ComputeStatistics(wdStatisticWords) / lCountLines
End Sub
14. september 2019 - 09:45 #10
Du kan også downloade denne DEMO FIL
Avatar billede Dan Elgaard Ekspert
14. september 2019 - 11:32 #11
Hej Flemming,

Tak for info, og du har helt ret: Word tæller forskellige ting med, som giver et forkert billede, f.eks. tomme linjer ved beregning af ord per linje.
Desuden synes jeg også at meget korte linjer (3 ord eller mindre) bør udelades, ligesom Word også tæller visse special tegn med, som hele ord.
Desuden mangler der ordenlig LIX statistik.

Det er dog lykkedes mig, at komme frem til min helt egen Dokument Statistik, der viser præcist, hvad jeg ønsker.
Du kan se et skærmbillede af det her:
http://www.EXCELGAARD.dk/Articles/Word/Files/Images/Pic.Dokument%20Statistik.PNG
14. september 2019 - 12:46 #12
#9 rettelse - det hedder  =rand(8,4)

Bare man ved, hvordan det hænger sammen, så kan man liste det rundt som man har lyst til.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester