Suche von Wörtern in MS Word

17. Januar 2007 17:45

hi @ll,

ich hoffe diesen Beitrag gibts nicht schon, konnte ihn leider nicht finden.
Desahalb frag ich hier mal nach ...

Ich möchte ein Word Document (wenns geht im Hintergrund) öffnen und die Wörter zählen die sich dort befinden.

wörter sollen gezählt werden 1x für Fett gedruckte
1x für normale wörter

da es die funktion nicht gibt, wörter zählen fett bzw. normal, hab ich mir gedacht mit der suchfunktion das problem zu lösen.

nur wie ich das genau in NAV mache ist mir nicht wirklich klar.

Ich hoffe jemand kann mir helfen, bin leider noch ein anfänger :cry:

mfg

Daniel

17. Januar 2007 19:25

[Beitrag aus dem Forum Dynamics NAV 4.xx nach Software- Integration verschoben.]

Gruß, Kai
MSDynamics.de-Team

18. Januar 2007 10:30

Hi,

ich habe versucht, das im Word bzw. VB abzubilden. Leider kann der count Befehl selber nicht so ohne weiteres verwendet werden, da gewisse Sonderzeichen ebenfalls mitgezaehlt werden (z.b. Zeilenumbruch).

Als Alternative kann man die Dialogs-Funktion wdDialogToolsWordCount verwenden, die die Sonderzeichen etc. ignoriert. Beim Loop habe ich aber leider nicht rausgefunden, wie man die Sonderzeichen auslassen kann.
Der Loop ist notwendig, um unterscheiden zu koennen, ob ein Wort bold ist oder nicht.

Vielleicht hat ja noch jemand eine Idee, wie man das loesen kann...
Wenn es in VB moeglich ist, sollte es in Navision eigentlich auch machbar sein.

Code:
Sub countwords()
    Dim i As Integer
    Dim bold_count As Integer
    Dim notbold_count As Integer
    Dim word_count As Integer
   
    bold_count = 0
    notbold_count = 0
       
    ActiveDocument.Select
   
    Set temp = Dialogs(wdDialogToolsWordCount)
    ' Execute the dialog box in order to refresh its data.
    temp.Execute
    word_count = temp.Words
       
    For i = 1 To word_count
        ActiveDocument.Range.Words(i).Select
        'ActiveDocument.Words(i).Select
        If Selection.Font.Bold Then
            bold_count = bold_count + 1
        Else
            notbold_count = notbold_count + 1
        End If
    Next i
               
End Sub


Gruesse
feri

18. Januar 2007 11:15

danke für die antwort, werds gleich mal versuchen ... wobei ich nicht wirklich weis wie ich das Dialog in Navision ansprechen soll.

würde es nicht irgendwie mit Find gehen ?!
--> 'Microsoft Word 11.0 Object Library'.Find

bin offen für jede hilfe

danke, mfg

Daniel

18. Januar 2007 15:45

Hi,

ich habe kurz in die msdn reingeschaut, da ich die ActiveX Word Objekte selber noch nie verwendet habe. Leider kann es schon mal vorkommen, dass man die richtige Seite nicht findet.
Ich nehme an, dass man aehnlich wie bei Excel 2-3 Objekte benoetigt, um von Navision aus auf ein Dokument zugreifen zu koennen.

Ohne Anleitung ist das eher zaeh, hier die richtigen Sachen rauszufinden. Allerdings wuerde ich mich erst auf Navision konzentrieren, wenn die Suche in VB 100%ig funktioniert.

Eine spontane Idee habe ich noch. Vielleicht kannst du beim Oeffnen des Dokumentes saemtliche Sonderzeichen (auch <CR> usw. ) loeschen, damit saemtliche Woerter in einer Zeile stehen. Dann muesste die FOR Schleife eigentlich nicht durcheinander kommen?

Wenn die VB Sache passt, kannst du dich danach ja auf der msdn Seite ueber die ganzen ActiveX Word Objekte informieren.

Gruesse
feri

18. Januar 2007 16:07

danke für die hilfe feri.

ich muss mich aber leider mit navision mehr befassen da es nicht wirklich (oder ich kanns nur nicht) 1:1 übernommen werden kann ins navision.

was mir echt helfen würde ist wenn mir wer sagt welche Automation ich verwenden soll bzw. wie kann ich einfach alle Daten die in einem Word Document drinnen sind in Navision importieren ... um sie dann eventl. in eine tabelle zu speichern.

mfg
Daniel

18. Januar 2007 18:27

Hier die Lösung:

Name DataType Subtype Length
wordApp Automation 'Microsoft Word 11.0 Object Library'.Application
wordDocs Automation 'Microsoft Word 11.0 Object Library'.Documents
wordDoc Automation 'Microsoft Word 11.0 Object Library'.Document
wordWords Automation 'Microsoft Word 11.0 Object Library'.Words
wordRange Automation 'Microsoft Word 11.0 Object Library'.Range
i Integer
bold_count Integer
notbold_count Integer

--------------------------------------------------------

IF NOT CREATE(wordApp,TRUE) THEN
ERROR('Word exestiert nicht');

bold_count := 0;
notbold_count := 0;

wordDocs := wordApp.Documents;
wordDoc := wordDocs.Open(Datei);
wordWords := wordDoc.Words();

FOR i := 1 TO wordWords.Count DO BEGIN
wordRange := wordWords.Item(i);
IF (wordRange.Bold = -1) THEN BEGIN
IF (wordRange.Text <> '.') THEN bold_count += 1;
END ELSE BEGIN
IF (wordRange.Text <> '.') THEN notbold_count += 1;
END;
END;

MESSAGE('Normal: %1\Fett: %2', notbold_count, bold_count);
wordDoc.Close;
wordApp.Quit;
-----------------------------------------

Was halt noch nicht geht ist bei normalen Wörtern nimmt er mir leerzeichen und zeilenumbrüche noch mit ... aber diese sollte man abfangen können mit "wordRange.Text"

19. Januar 2007 12:44

Hi,

danke fuer deinen Navision code. Ich habe das gleich mal bei mir ausprobiert.
Das mit den Zeilenumbruechen ist wirklich aergerlich, ich sehe keinen plausiblen Grund, warum die das in der Funktion mitzaehlen :evil:. Zumindest ein zusaetzlicher Parameter, mit dem man steuern kann, ob man Sonderzeichen mitzaehlen will oder nicht, waere fein gewesen.
Ich habe das jetzt mal mit einer Abfrage auf die Laenge getestet.

Code:
FOR i := 1 TO wordWords.Count DO BEGIN
  wordRange := wordWords.Item(i);
  IF (wordRange.Bold = -1) THEN BEGIN
    IF (STRLEN(wordRange.Text) > 1) THEN
      bold_count += 1;
  END ELSE BEGIN
    IF (STRLEN(wordRange.Text) > 1) THEN
      notbold_count += 1;
  END;
END;

Ein Wort sollte eignetlich immer mind. 2 Buchstaben haben, von daher hat er mein Testdokument richtig ausgelesen. :-D

Gruesse
feri

22. Januar 2007 11:17

hi feri,

ja das is ne schöne idee ... und erleichtert mir meine arbeit ne neue Tabelle hinzuzufügen wo ich alle "Zeichen", "Buchstaben" bzw. "Sonderzeichen" eintrage die nicht gezählt werden sollen :P

danke für die zusammenarbeit, bis zum nächsten mal

CU