Avatar billede nph12 Nybegynder
14. februar 2007 - 12:59 Der er 37 kommentarer og
1 løsning

VBA: Tæl ord indenfor defineret område

Hej
Hvordan laver jeg noget kode, så jeg kan få talt hvor mange ord der er indenfor et defineret område (forside, indholdsfortegnelse, sidehoved og bilag skal ikke tælles med)?
Avatar billede rvm Nybegynder
14. februar 2007 - 13:10 #1
marker alt det der skal tælles (det kunne gøres ved at indsætte et bogmærke) og kør nedenstående kode:

ActiveDocument.Bookmarks("Tæl").Select
svar = Selection.Words.Count
Avatar billede nph12 Nybegynder
14. februar 2007 - 13:40 #2
Jeg vil helst undgå at skulle marker noget, så hvis man kan definere et området vil det være super.

Resultatet skal sættes ind i dokumentet.
Avatar billede rvm Nybegynder
14. februar 2007 - 13:58 #3
Du kan ikke definere et område uden at gøre noget.
Avatar billede nph12 Nybegynder
14. februar 2007 - 15:36 #4
Ikke noget med f.eks. side 3 til side 40?
Avatar billede rvm Nybegynder
14. februar 2007 - 18:18 #5
Så kan du jo bare markere fra side 3 til 40 ;-)
Avatar billede nph12 Nybegynder
14. februar 2007 - 18:24 #6
Man kan ikke gøre det på andre måder end at markere området?
Avatar billede rvm Nybegynder
14. februar 2007 - 19:38 #7
Hvad er der galt med at markere området. Du koder jo alligevel, så brugeren ser ikke at du markerer området (og fjerne markeringen lige bag efter)
Avatar billede rvm Nybegynder
14. februar 2007 - 20:11 #8
Hvis du kan dele dit dokument op i sektioner, så kan du bruge denne kode til at tælle ordene:

Sub TællerOrdSektioner()

'Gennemløber alle sektioner
For Each sec In ActiveDocument.Sections

    'Sætter MyRange = den aktuelle sektion
    Set MyRange = sec.Range
   
    'Gennemløber alle ordene i sektionen
    For Each wor In MyRange.Words
        wor.Select
        ord = Selection
        'Fjerner  enter som den også tæller med
        If (Asc(ord) <> 13) And (Asc(ord) <> 12) Then
            'Bruges til at tjekke asci værdien, hvis du finder flere tegn du ikke vil have talt
            svar = Asc(ord)
            'Tæller antallet af ord i sektionen
            tæl = tæl + 1
        End If
    Next
    MsgBox "Der er " & tæl & " ord i sektion " & sec.Index
    tæl = 0
Next


End Sub
Avatar billede nph12 Nybegynder
15. februar 2007 - 08:49 #9
Sektioner kunne være en mulighed. Jeg gør ud fra, at jeg skal dele mit dokument op i fire dele:

1) Forside + indholdsfortegnelse
2) Selve opgaven
3) Dokumentation for sideantal + litteraturliste (skal ikke tælles med!)
4) Bilag

Kan jeg så ikke bruge sektion, når jeg er færdig med et afsnit og vil starte næste afsnit i starten af næste side (plejer at bruge sektion skift, næste side)?

En anden ting er, at sidehoved og sidefod ikke skal tælles med, hvis man kan lave den undtagelse.
Avatar billede rvm Nybegynder
15. februar 2007 - 08:55 #10
Hvis du ved hvor mange sektioner der er før du vil begynde at tælle og hvor mange der er efte du vil begynde at tælle, så kan du nøjes med at loope dem.

Denne kode går ikke ind i sidehoved og sidefod.
Avatar billede nph12 Nybegynder
15. februar 2007 - 13:22 #11
Jeg kan godt holde styr på, hvor mange sektioner der bliver anvendt i dokumentet.

Kan vi bruge karakter (inkl. mellemrum) i stedet for ord?

Kan vi også tælle figurer og tabeller i dokumentet? Når vi kan antallet af karakter samt figurer og tabeller (hver figur og tabel tæller som 700 karakter) divideres det med 2275. Resultatet er normalsider.

Antal af bilag skal også tælles. Dette skal kun ske ved, at der tælles antal sider.

Hvordan bliver resultaterne indskrevet i dokumentet under afsnitet "Dokumentation for sideantal". Det skal ud som følgende:

Antal karakter (inkl. mellemrum):
Antal fugurer:
Antal tabeller:

-------------------
Antal normalsider:
Antal bilag:

Det vil være en meget stor hjælp, hvis du kan lave koden til dette, da jeg ikke selv kan. På forhånd mange tak.
Avatar billede nph12 Nybegynder
16. februar 2007 - 15:32 #12
Er det være muligt, at lave det sidste?
Avatar billede nph12 Nybegynder
16. februar 2007 - 21:05 #13
Så er der 120 point på spil:-)
Avatar billede rvm Nybegynder
16. februar 2007 - 23:43 #14
Det er ikke p.g.a. point jeg ikke har svaret dig :-) Jeg har bare haft meget travlt på arbejdet...  jeg kikker på det ;-)
Avatar billede nph12 Nybegynder
17. februar 2007 - 16:35 #15
Helt i orden:-) Du skriver bare, når du har fået kigget på det.

God weekend
Avatar billede rvm Nybegynder
18. februar 2007 - 20:30 #16
Hvordan du vil identificere bilagene ved jeg ikke, men resten skulle være her:

Sub Tæller_I_Sektioner()

Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim sec As Section
Dim Myrange As Range
Dim normalsider As Double

'Gennemløber alle sektioner
For Each sec In ActiveDocument.Sections

    'Sætter MyRange = den aktuelle sektion
    Set Myrange = sec.Range
    karakterer = Myrange.Characters.Count
    tabeller = Myrange.Tables.Count
    figurer = Myrange.ShapeRange.Count
Next

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
   
ActiveDocument.Bookmarks("Statistik").Select
Selection.TypeText "Antal karakter(inkl.mellemrum): " & karakterer & vbNewLine
Selection.TypeText "Antal fugurer: " & figurer & vbNewLine
Selection.TypeText "Antal tabeller: " & tabeller & vbNewLine & vbNewLine
Selection.TypeText "-------------------" & vbNewLine
Selection.TypeText "Antal normalsider: " & normalsider & vbNewLine
Selection.TypeText "Antal bilag: "

End Sub
Avatar billede nph12 Nybegynder
19. februar 2007 - 12:41 #17
Jeg får ikke lov til at køre koden. Jeg får følgende fejlmeddelelse:

Run-time errror '5941'
The reguested number of the collection does not exist
Avatar billede rvm Nybegynder
19. februar 2007 - 20:10 #18
Prøv denne, hvor der også er indarbejdet lidt fejlhåndtering -)


Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim sec As Section
Dim Myrange As Range
Dim normalsider As Double

'Gennemløber alle sektioner
For Each sec In ActiveDocument.Sections

    'Sætter MyRange = den aktuelle sektion
    Set Myrange = sec.Range
    karakterer = karakterer + Myrange.Characters.Count
    tabeller = tabeller + Myrange.Tables.Count
   
    On Error Resume Next
    figurer = Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    Else
        figurer = figurer + figurer
    End If
    On Error GoTo 0
Next

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
   
If ActiveDocument.Bookmarks.Exists("Statistik") = True Then
    ActiveDocument.Bookmarks("Statistik").Select
    Selection.TypeText "Antal karakter(inkl.mellemrum): " & karakterer & vbNewLine
    Selection.TypeText "Antal fugurer: " & figurer & vbNewLine
    Selection.TypeText "Antal tabeller: " & tabeller & vbNewLine & vbNewLine
    Selection.TypeText "-------------------" & vbNewLine
    Selection.TypeText "Antal normalsider: " & normalsider & vbNewLine
    Selection.TypeText "Antal bilag: "
End If
Avatar billede rvm Nybegynder
19. februar 2007 - 20:15 #19
Der havde indsneget sig en lille fejl. Ret koden til således:

    On Error Resume Next
    figurer = figurer + Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    End If
    On Error GoTo 0
Avatar billede nph12 Nybegynder
19. februar 2007 - 21:46 #20
Hmmm, kan du ikke lige skrive hele koden som jeg skal sætte ind, da jeg ikke kan få det til at køre (det er sikkert mig, som gør noget forkert).

Hvordan skal jeg sætte koden ind (bare lige for at være helt sikker)?
Avatar billede rvm Nybegynder
20. februar 2007 - 08:18 #21
Sub Tæller_I_Sektioner()

Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim sec As Section
Dim Myrange As Range
Dim normalsider As Double

'Gennemløber alle sektioner
For Each sec In ActiveDocument.Sections

    'Sætter MyRange = den aktuelle sektion
    Set Myrange = sec.Range
    karakterer = karakterer + Myrange.Characters.Count
    tabeller = tabeller + Myrange.Tables.Count
   
    On Error Resume Next
    figurer = figurer + Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    End If
    On Error GoTo 0
Next

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
   
If ActiveDocument.Bookmarks.Exists("Statistik") = True Then
    ActiveDocument.Bookmarks("Statistik").Select
    Selection.TypeText "Antal karakter(inkl.mellemrum): " & karakterer & vbNewLine
    Selection.TypeText "Antal fugurer: " & figurer & vbNewLine
    Selection.TypeText "Antal tabeller: " & tabeller & vbNewLine & vbNewLine
    Selection.TypeText "-------------------" & vbNewLine
    Selection.TypeText "Antal normalsider: " & normalsider & vbNewLine
    Selection.TypeText "Antal bilag: "
End If

End sub
Avatar billede nph12 Nybegynder
20. februar 2007 - 08:50 #22
OK. Nu får jeg ingen fejmmeddelelse, men statistiken bliver ikke indskrevet i dokumentet. Hvad gør jeg forkert?
Avatar billede rvm Nybegynder
20. februar 2007 - 09:34 #23
Har du indsat et bogmærke, der hedder "Statistik" i dokumentet?
Avatar billede nph12 Nybegynder
20. februar 2007 - 11:35 #24
OK. Nu får jeg skrevet noget i dokumentet.

Hvordan skal jeg bruge/sætte bogmærket? Antallet af normalsider skal bare angives med en decimal.
Avatar billede rvm Nybegynder
20. februar 2007 - 12:14 #25
Jeg forstår ikke rigtigt hvad du memer med at bruge/sætte bogmærket.

Angående decimal:
Sub Tæller_I_Sektioner()

Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim sec As Section
Dim Myrange As Range
Dim normalsider As Double

'Gennemløber alle sektioner
For Each sec In ActiveDocument.Sections

    'Sætter MyRange = den aktuelle sektion
    Set Myrange = sec.Range
    karakterer = karakterer + Myrange.Characters.Count
    tabeller = tabeller + Myrange.Tables.Count
   
    On Error Resume Next
    figurer = figurer + Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    End If
    On Error GoTo 0
Next

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
normalsider = Format(normalsider, "##,##0.0")

If ActiveDocument.Bookmarks.Exists("Statistik") = True Then
    ActiveDocument.Bookmarks("Statistik").Select
    Selection.TypeText "Antal karakter(inkl.mellemrum): " & karakterer & vbNewLine
    Selection.TypeText "Antal fugurer: " & figurer & vbNewLine
    Selection.TypeText "Antal tabeller: " & tabeller & vbNewLine & vbNewLine
    Selection.TypeText "-------------------" & vbNewLine
    Selection.TypeText "Antal normalsider: " & normalsider & vbNewLine
    Selection.TypeText "Antal bilag: "
End If

End Sub
Avatar billede nph12 Nybegynder
20. februar 2007 - 15:47 #26
Sagde du ikke, at jeg skulle sætte et bogmærke? Skal jeg bare skrive Statistik i feltet eller hvad?
Avatar billede rvm Nybegynder
20. februar 2007 - 19:58 #27
Du skal indsætte et bogmærke, der hedder "Statistik" i dokumentet, der hvor teksten skal stå: Vælg Indsæt/Bogmærke og skriv "Statistik som bogmærkenavn.
Avatar billede nph12 Nybegynder
20. februar 2007 - 22:32 #28
OK.

Tæller koden ikke alle karakter i dokumentet nu? Hvad bliver talt? Der er sider som ikke skal tælles med som f.eks. forside og indholdsfortegnelse (samt bilag).

Kunne man ikke definere et område ved at indsætte en skjul kode som f.eks. ###, og gøre denne tekst hvid så den kun læses af koden?
Avatar billede rvm Nybegynder
21. februar 2007 - 08:15 #29
Jo - koden tæller alle sider nu. Du skrev tidligere at du godt kan holde styr på antallet af sektioner i dokumentet. Du inddelte det f.ek. i 4 sektioner. Så kan du lave koden om til:

Sub Tæller_I_Sektioner()

Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim sec As Section
Dim Myrange As Range
Dim normalsider As Double

'Gennemløber alle sektioner undtagen første og sidste
For n = 2 To ActiveDocument.Sections.Count - 1

    'Sætter MyRange = den aktuelle sektion
    Set Myrange = ActiveDocument.Sections(n).Range
    karakterer = karakterer + Myrange.Characters.Count
    tabeller = tabeller + Myrange.Tables.Count
   
    On Error Resume Next
    figurer = figurer + Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    End If
    On Error GoTo 0
Next

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
normalsider = Format(normalsider, "##,##0.0")

If ActiveDocument.Bookmarks.Exists("Statistik") = True Then
    ActiveDocument.Bookmarks("Statistik").Select
    Selection.TypeText "Antal karakter(inkl.mellemrum): " & karakterer & vbNewLine
    Selection.TypeText "Antal fugurer: " & figurer & vbNewLine
    Selection.TypeText "Antal tabeller: " & tabeller & vbNewLine & vbNewLine
    Selection.TypeText "-------------------" & vbNewLine
    Selection.TypeText "Antal normalsider: " & normalsider & vbNewLine
    Selection.TypeText "Antal bilag: "
End If

End Sub

Eller du kan som jeg foreslog helt fra starten definere et område ved at markere det og indsætte et bogmærke - og så kun tælle indenfor bogmærket:

Sub Tæller_I_Bogmærke()

Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim sec As Section
Dim Myrange As Range
Dim normalsider As Double

If ActiveDocument.Bookmarks.Exists("Tæl") = True Then
    ActiveDocument.Bookmarks("Tæl").Select
    Set Myrange = Selection.Range
    karakterer = karakterer + Myrange.Characters.Count
    tabeller = tabeller + Myrange.Tables.Count
   
    On Error Resume Next
    figurer = figurer + Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    End If
    On Error GoTo 0
Next

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
normalsider = Format(normalsider, "##,##0.0")

If ActiveDocument.Bookmarks.Exists("Statistik") = True Then
    ActiveDocument.Bookmarks("Statistik").Select
    Selection.TypeText "Antal karakter(inkl.mellemrum): " & karakterer & vbNewLine
    Selection.TypeText "Antal fugurer: " & figurer & vbNewLine
    Selection.TypeText "Antal tabeller: " & tabeller & vbNewLine & vbNewLine
    Selection.TypeText "-------------------" & vbNewLine
    Selection.TypeText "Antal normalsider: " & normalsider & vbNewLine
    Selection.TypeText "Antal bilag: "
End If

End Sub
Avatar billede nph12 Nybegynder
21. februar 2007 - 10:01 #30
I Sub Tæller_I_Bogmærke() får jeg en fejlmeddelelse: Compile error: Next Without For

I Sub Tæller_I_Sektioner()skriver den bare 0 i alle felter. Jeg har delt dokumentet op i fire dele vha. sektioner. Jeg forstår ikke helt:

For n = 2 To ActiveDocument.Sections.Count - 1

Du skriver, at koden Gennemløber alle sektioner undtagen første og sidste. Kunne man ikke skrive hvilke sektioner som skal tælles ved at angive sektionerne som f.eks. 2,3,4 (hvis man har delt dokumentet op i flere dele end fire)?
Avatar billede rvm Nybegynder
21. februar 2007 - 14:36 #31
"next" skal erstattes af "end if"
Avatar billede rvm Nybegynder
21. februar 2007 - 14:49 #32
I nedenstående kode kan du selv vælge hvilke sektioner du vil have talt:

Sub Tæller_I_Sektioner()

Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim Myrange As Range
Dim normalsider As Double
Dim MyArray() As String
Dim svar As String

svar = InputBox("Indtast sektioner, der skal tælles", "Sektionstæller", "2,3")

MyArray = Split(svar, ",")

'Gennemløber alle sektioner i samlingen
For I = 0 To UBound(MyArray)
    Set Myrange = ActiveDocument.Sections(MyArray(I)).Range
   
    karakterer = karakterer + Myrange.Characters.Count
    tabeller = tabeller + Myrange.Tables.Count
   
    On Error Resume Next
    figurer = figurer + Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    End If
    On Error GoTo 0
   
Next I

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
normalsider = Format(normalsider, "##,##0.0")

If ActiveDocument.Bookmarks.Exists("Statistik") = True Then
    ActiveDocument.Bookmarks("Statistik").Select
    Selection.TypeText "Antal karakter(inkl.mellemrum): " & karakterer & vbNewLine
    Selection.TypeText "Antal fugurer: " & figurer & vbNewLine
    Selection.TypeText "Antal tabeller: " & tabeller & vbNewLine & vbNewLine
    Selection.TypeText "-------------------" & vbNewLine
    Selection.TypeText "Antal normalsider: " & normalsider & vbNewLine
    Selection.TypeText "Antal bilag: "
End If

End Sub
Avatar billede nph12 Nybegynder
21. februar 2007 - 16:35 #33
Den er næsten ved at være der, men mangler følgende rettelser:

Kunne man lave et lille sikkerhedstjek, hvor man finder antallet af sektioner og skriver resultatet ud i forbindelsen med indtastningsfeltet?

Som det er nu, skal man angive de sektioner som skal tælles med sådan 2,3,4, men kunne man ikke skrive 2-4 (men kunne også komme ud for, at det skulle være 2-25)?

Kan vi ikke tælle bilagene?

Er det muligt, at formatere resultatet så tallene står på række under hinanden?

Hvis vi kan få de sidste ting på plads vil det være super:-)
Avatar billede nph12 Nybegynder
24. februar 2007 - 13:54 #34
Er det muligt, at lave de nævnte ting?
Avatar billede rvm Nybegynder
24. februar 2007 - 21:19 #35
jep - har bare travlt lige nu - en barnedåb i morgen :-)
Avatar billede nph12 Nybegynder
01. marts 2007 - 12:14 #36
Har du fået kigget lidt på det?
Avatar billede rvm Nybegynder
01. marts 2007 - 14:08 #37
Prøv denne:

Sub Tæller_I_Sektioner()

Dim karakterer As Long
Dim tabeller As Long
Dim figurer As Long
Dim Myrange As Range
Dim normalsider As Double
Dim MyArray() As String
Dim svar As String
Dim sec As Section
Dim Indtast As String

For Each sec In ActiveDocument.Sections
    If Indtast = "" Then
        Indtast = sec.Index
    Else
        Indtast = Indtast & ", " & sec.Index
    End If
Next

svar = InputBox("Fjerne de sektioner, der ikke skal tælles", "Sektionstæller", Indtast)

MyArray = Split(svar, ",")

'Gennemløber alle sektioner i samlingen
For I = 0 To UBound(MyArray)
    Set Myrange = ActiveDocument.Sections(MyArray(I)).Range
   
    karakterer = karakterer + Myrange.Characters.Count
    tabeller = tabeller + Myrange.Tables.Count
   
    On Error Resume Next
    figurer = figurer + Myrange.ShapeRange.Count
    If Err Then
        figurer = figurer + 0
    End If
    On Error GoTo 0
   
Next I

normalsider = (karakterer + (tabeller * 700) + (figurer * 700)) / 2275
normalsider = Format(normalsider, "##,##0.0")

If ActiveDocument.Bookmarks.Exists("Statistik") = True Then
    ActiveDocument.Bookmarks("Statistik").Select
    Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(8) _
        , Alignment:=wdAlignTabRight, Leader:=wdTabLeaderSpaces
       
    Selection.TypeText "Antal karakter(inkl.mellemrum): " & vbTab & karakterer
    Selection.TypeParagraph
    Selection.TypeText "Antal figurer: " & vbTab & figurer
    Selection.TypeParagraph
    Selection.TypeText "Antal tabeller: " & vbTab & tabeller
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeText "-------------------"
    Selection.TypeParagraph
    Selection.TypeText "Antal normalsider: " & vbTab & normalsider
    Selection.TypeParagraph
    Selection.TypeText "Antal bilag: "
End If

End Sub

Angående bilag, så ved jeg ikke hvordan den kunne løses :-(
Avatar billede nph12 Nybegynder
02. marts 2007 - 12:37 #38
OK. Mange tak for hjælpen.

God weekend
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
Kategori
Tag et kursus i Word og øg effektiviteten

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