Archiv des LibreOffice- und OpenOffice.org-Wiki

[ÜberSicht] [TitelIndex] [WortIndex] [SeiteFinden

Die Anzahl der Wörter in einem markierten Textabschnitt kann man mit einem Makro zählen. In OpenOffice.org ab Version 2 ist diese Funktion bereits unter Extras → Wortanzahl eingebaut.

1. StarOffice Version 6/7 bzw. OpenOffice.org Version 1

' word count macro, adopted from http://www.darwinwars.com/lunatic/bugs/oo_macros.html#swc
' displays a message box with number of characters and words in the current selection, and in the document
'
' original header:
'   horrid word count macro by Andrew Brown
'   adapted from Werner Roth
'   who wrote a macro in the old starbasic to do this
'   all I did was to wrap his logic in the new API
'  this counts the words in a selected patch of text
Sub WordCount

  ' get the document, and the currently selected text
  xDocument = thiscomponent
  xSelection = xDocument.getCurrentSelection()
  nSelCount = xSelection.getCount()
  
  ' access document statistics
  nAllChars = xDocument.CharacterCount
  nAllWords = xDocument.WordCount

  ' initialize counts
  nSelChars = 0
  nSelWords = 0

  ' iterate over multiple selection
  for nSel = 0 to nSelCount - 1
    sText = xSelection.getByIndex(nSel).getString()

    ' count word in sText by scanning the selected text character for character
    nCount = Len(sText)
    bLastWasSeperator = true 'first letter starts a word
    for i=1 to nCount
      Select Case Mid(sText,i,1)

      'Add your own seperators here
      'chr(9) is a tab
      Case " ", "(", ")", chr(9)
        bLastWasSeperator = true
        nSelChars = nSelChars + 1

      'chr(10) and chr(13) are for Line- and Paragraph-ends
      Case chr(10), chr(13)
        bLastWasSeperator = true

      'Character found, so this is no separator
      Case Else
        'Increase the number of words just if the last character was a seperator
        '(i.e., if we're at the start of a word)
        if bLastWasSeperator then
          nSelWords = nSelWords + 1
        Endif
        nSelChars = nSelChars + 1

        bLastWasSeperator = false

      End Select
    next i
  next nSel

  msgbox "Document" + chr(13) + "  chars: " + nAllChars + chr(13) + "  words: " + nAllWords + chr(13) + chr(13) + "Selection" + chr(13) + "  chars: " + nSelChars + chr(13) + "  words: " + nSelWords
End Sub

Für eine deutsche Ausgabe muß wohl die letzte Zeile ersetzt werden durch:

msgbox "Dokument" + chr(13) + "  Zeichen: " + nAllChars + chr(13) + "  Wörter:    " + nAllWords + chr(13) + chr(13) + "Markiert" + chr(13) + "  Zeichen: " + nSelChars + chr(13) + " Wörter:    " + nSelWords, 64, "Wörter und Zeichen zählen"

Hier eine erweiterte Fassung, die zusätzlich die Anzahl der "echten" Zeichen ausgibt, also ohne sämtliche Leerzeichen etc. Zudem wird das geschützte Leerzeichen als Word-Trenner erfaßt.

Sub WordCountGerman2
  xDocument = thiscomponent
  xSelection = xDocument.getCurrentSelection()
  nSelCount = xSelection.getCount()

  nAllChars = xDocument.CharacterCount
  nAllWords = xDocument.WordCount

  nSelChars = 0
  nSelWords = 0
  nSelRealChars = 0

  for nSel = 0 to nSelCount - 1
    sText = xSelection.getByIndex(nSel).getString()

    nCount = Len(sText)
    bLastWasseparator = true 'first letter starts a word
    for i=1 to nCount
      Select Case Mid(sText,i,1)

      Case "(", ")", "[", "]", "{", "}"
        bLastWasseparator = true
        nSelChars = nSelChars + 1
                nSelRealChars = nSelRealChars + 1

      Case " ", chr(160), chr(9)  ' 160 ist das geschützte Leerzeichen, 9 der Tab
        bLastWasseparator = true
        nSelChars = nSelChars + 1


      Case chr(10), chr(13)
        bLastWasseparator = true

      Case Else
        if bLastWasseparator then
          nSelWords = nSelWords + 1
        Endif
        nSelChars = nSelChars + 1
        nSelRealChars = nSelRealChars + 1


        bLastWasseparator = false

      End Select
    next i
  next nSel
  msgbox "Dokument" + chr(13) + "  Zeichen:  " + nAllChars + chr(13) + "   Wörter:   " + nAllWords + chr(13) + chr(13) + "Markiert" + chr(13) + "  Zeichen:  " + nSelChars + "  /  ohne Leerstellen:  " + nSelRealChars + chr(13) + "   Wörter:   " + nSelWords, 64, "Wörter und Zeichen zählen"
End Sub

2. StarOffice bis Version 5.2

Sub ZaehleWorte
   'Werner Roth <tiberius@uni-paderborn.de>
   'Dieses Makro zählt wie viele Worte aktuell selektiert sind.
   'Dazu wird der selektierte Text durchlaufen und alle Trennzeichen gezählt
   'Texte in Rahmen müssen einzeln selektiert werden. Ansonsten werden sie nicht mitgezählt.
   const MsgBoxErrorTitle = "Fehler Werners WordCount"
   dim NumFound as long
   dim SelectedText as string
   dim LastWasSeperator as boolean
   
   'Erst einmal eine Menge Fehlerbehandlung:
   'Das Ding ist nur für StarWriter gedacht
   if ActiveModule.Name <> "StarWriter" then
      MsgBox("Werners WordCount ist nur innerhalb eines Textdokumenten anwendbar.",_
             16,MsgBoxErrorTitle)
      EXIT SUB
   Endif

   If (ActiveWindow.Selection.ClassName <> "Text") and _
      (ActiveWindow.Selection.ClassName <> "TextInTable") then
      MsgBox("Es muss zumindest Text oder eine Tabelle selektiert sein.",_
             16,MsgBoxErrorTitle)
      EXIT SUB
   Endif
      
   'Speichere den selektierten Text in einem String
   SelectedText = ActiveWindow.ValueAndBreaks
   
   'Strings schaffen nun mal nur 64.000 Zeichen
   if SelectedText = "" then
      MsgBox("Entweder nichts selektiert oder mehr als 64.000 Zeichen selektiert.",_
             16,MsgBoxErrorTitle)
      EXIT SUB
   Endif
   
   Application.EnterWait() 'Sanduhr zeigen

   'Anzahl der gefundenen Worte
   NumFound = 0
   'Zwei und mehr aufeinanderfolgende Trennzeichen werden als eins gezählt
   LastWasSeperator = false
   'Laufe den selektierten Text Buchstabe für Buchstabe durch
   for i=1 to len(SelectedText)
   
      Select Case Mid(SelectedText,i,1)
      'Hier kann man noch Trennzeichen ergänzen
      'chr(9) ist ein Tabulator  chr(10) und chr(13) sind für Zeilen- und Absatzenden
      Case " ", ",", ";", ".", "-", chr(9), chr(10), chr(13)
         'Die Wortanzahl nur dann hochzählen, wenn der Buchstabe zuvor kein Trennzeichen war
         if not LastWasSeperator then
            NumFound = NumFound + 1
            LastWasSeperator = true
         Endif
      'Buchsteben gefunden, also kein Trennzeichen
      Case Else
         LastWasSeperator = false
      End Select
   next i
   Application.LeaveWait() 'Sanduhr wieder wech
   MsgBox( "Die Anzahl selektierter Worte ist: "    & NumFound,_
           0+64, "Werners WordCount")
End Sub

{OK} Wie man das Makro über eine Schaltfläche ausführen kann, erfährt man in MakrosMitEinemKlick.


KategorieMakro


LizenzBedingungen | AnbieterKennzeichnung | DatenschutzErklärung | Stand: 2013-04-28