none
Word Automation: Zum nächsten Kommentar wechseln

    Frage

  • Ich möchte in einem Word Dokument mit VB.NET von einem Kommentar zum nächsten wechseln. Dabei aber die Funktionalität wie in der Standard Word 2010 Ribbon (Überprüfen - Kommentare - Nächstes Element) haben, dass man der Reihe nach im Dokument die Kommentare erreicht. Auch wenn nachträglich Kommentare hinzugefügt wurden.

    Die Kommenare nach ihrer laufenden Nummer anzuspringen funkrioniert problemlos.

    Ich hoffe jemand hat eine Idee.

    Danke.

    Sonntag, 5. Februar 2012 17:12

Antworten

  • Hallo Christian,

    diesmal habe ich die Sortierung richtig hingekriegt. Bitte auch bei Dir nachchecken:

    Public Class Form1
        Dim w As Microsoft.Office.Interop.Word.Application
        Dim d As Microsoft.Office.Interop.Word.Document
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim c As Microsoft.Office.Interop.Word.Comment
            Dim lngStart As Long
    
            Dim l_unsorted As List(Of Microsoft.Office.Interop.Word.Comment)
            Dim l_start As List(Of Long)
            Dim l_sorted As List(Of Microsoft.Office.Interop.Word.Comment)
    
    
            w = New Microsoft.Office.Interop.Word.Application
            w.Visible = True
            d = w.Documents.Open("C:\Users\a-boroiu\Desktop\Kommentarproblem.docx")
            'eine temporaere, nicht sortierte Liste von Kommentaren erstellen
            'und eine Liste der Startpositionen
            l_unsorted = New List(Of Microsoft.Office.Interop.Word.Comment)
            l_start = New List(Of Long)
            'eine Liste estelle mit allen Kommentaren, egal wie die angeordnet sind
            For Each c In d.Comments
                l_unsorted.Add(c)
                l_start.Add(c.Scope.Start)
            Next
            'die Liste der Startpositionen sortieren
            l_start.Sort()
            'und jetzt die Liste nach Scope.Start sorieren
            l_sorted = New List(Of Microsoft.Office.Interop.Word.Comment)
            For Each lngStart In l_start
                For Each c In l_unsorted
                    If lngStart = c.Scope.Start Then
                        l_sorted.Add(c)
                        Exit For
                    End If
                Next
            Next
    
            'jetzt die Anordnung ueberpruefen
            For Each c In l_sorted
                c.Scope.Select()
                MsgBox(c.Scope.Text)
            Next
            'bingo!
            d.Close()
            w.Quit()
    
        End Sub
    End Class

    Viele Gruesse,

    Bogdan


    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.

    Donnerstag, 16. Februar 2012 09:11
    Moderator

Alle Antworten

  • Hallo Christian,
    es gibt folgende Methode zu nächsten Kommentar zu gehen:
    Sub GoToTheNextComment()
        Dim c As Comment
        Dim r As Range
        
        'gehe zu naechsten kommentierten Range
        Set r = Selection.GoTo(wdGoToComment, wdGoToNext, 1)
        'und jetzt Kommentar fuer Kommentar
        'die SCOPE Position ueberpruefen
        For Each c In ActiveDocument.Comments
            If c.Scope.Start = r.Start Then
                c.Edit
                Exit For
            End If
        Next c
        
    End Sub
    

     
    (das ist jetzt VBA Code, leicht im VB.NET Code umzuwandelnJ)
    Viele Grüße,
    Bogdan

    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.
    Montag, 6. Februar 2012 13:51
    Moderator
  • Hallo Bogdan,

     

    danke für Deine Antwort. Das Beispiel funktioniert. Leider durchläuft es die Kommentare wie bei meine beisherigen Versuchen , aufsteigen nach dem Index.

    Wenn man die Kommentare in der Reihenfolge wie sie im Text vorkommen durchlaufen will dann habe ich das bisher nur über das Standard Word 2010 Ribbon (Überprüfen - Kommentare - Nächstes Element) händisch geschafft.

     

    Ich versuche es mal zu verdeutlichen. Die Kommentare sind bei mir im Text in etwa so angeordnet:

    Kommentar [w5]

    Kommentar [w4]

    Kommentar [w3]

    Kommentar [w2]

    Kommentar [w1]

    Kommentar [w6]

     

    Die Standard-Funktionen gehen nach dem Index, als w1, w2, w3, w4, w5, w6 (Und auch Deine Code-Vorschlag)

    Ich möchte sie aber in der Reihenfolge wie sie im Text vorkommen. Als so als wüerde ich den Text von vorne bis hinten durchlesen.

     

    Vielleicht fällt Dir da noch etwas ein?

     

    Danke

    Christian

    So sieht es im Dokument aus:


    Montag, 6. Februar 2012 14:25
  • Hallo Christian,

    ich wollte das Problem bei mir nachstellen, konnte ich aber nicht. Sobald ich einen Kommentar zwischen ältere Kommentare einfüge, so macht Word die Indexierung wieder und die Anordnung ist wie es seien soll:

    Schritt 1:

    Kommentar 1 [Index = 1]

    Kommentar 2 [Index = 2]

    Kommentar 3 [Index = 3]

    Kommentar 4 [Index = 4]

    Schritt 2: (füge einen Kommentar zwischen 2 und 3 ein)

    Kommentar 1 [Index = 1]

    Kommentar 2 [Index = 2]

    Kommentar 5 [Index = 3]

    Kommentar 3 [Index = 4]

    Kommentar 4 [Index = 5]

    Ich verwende Office 2010 SP1.

    Viele Grüße,

    Bogdan


    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.

    Dienstag, 7. Februar 2012 08:40
    Moderator
  • Hallo Bogdan,

    danke für Dein Feedback. Du hast vollkommen recht. Wenn ich die Kommentare händisch erzeuge, dann hat Word 2010 SP1 bei mir genau dieses Verhalten.

    Ich setze die Kommentare mittel VB-Code und da haut das mit der Reinizierung nicht sauber hin. Da habe ich auch bereits sehr viele Dokumente mit diesem Problem bei Kunden. Deshalb wäre das nicht so toll wenn alle Kommentare neu erstellt werden müssten, damit der Index sauber ist.

    Spannend ist aber, daß wenn ich manuell von einem Komentar zum Nächsten springe mit der Funktion die im Ribbon angeboten wird, dann würde es so funktionieren wie ich es mir vorstelle, auch wenn der Index ganz anderst ausschaut und total durcheinender ist.

    Ich habe auch versucht diesen Weg als Makro auzuzeichen, leider führt dieser Button zu keiner Aufzeichnung. Andere Buttons werden wie gewohnt als VBA-Befehle aufgezeichnet.

    Kann es sein, dass das eine Funktion ist, die es nicht als VBA/VB Code gibt?

    Viele Grüße

    Christian

    Donnerstag, 9. Februar 2012 12:32
  • Hallo Christian,

    ich denke, ich habe es geschafft. Ich habe erst eine Liste erstellt, wo ich alle Kommentare eingefügt habe. Dann habe ich die Liste nach Position des kommentierten Ranges im Dokument sortiert:

    Public Class Form1
        Dim w As Microsoft.Office.Interop.Word.Application
        Dim d As Microsoft.Office.Interop.Word.Document
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim c As Microsoft.Office.Interop.Word.Comment
            Dim l As List(Of Microsoft.Office.Interop.Word.Comment)
    
            w = New Microsoft.Office.Interop.Word.Application
            w.Visible = True
            d = w.Documents.Open("C:\Users\a-boroiu\Desktop\DocWithComments.docx")
            l = New List(Of Microsoft.Office.Interop.Word.Comment)
            'eine Liste estelle mit allen Kommentaren, egal wie die angeordnet sind
            For Each c In d.Comments
                l.Add(c)
            Next
            'und jetzt die Liste nach Scope.Start sorieren
            l.Sort(Function(elementA As Microsoft.Office.Interop.Word.Comment, elementB As Microsoft.Office.Interop.Word.Comment)
                       Return elementA.Scope.Start.CompareTo(elementB.Scope.Start)
                   End Function)
            'jetzt die Anordnung ueberpruefen
            For Each c In d.Comments
                c.Scope.Select()
                MsgBox(c.Scope.Text)
            Next
            'bingo!
            d.Close()
            w.Quit()
    
        End Sub
    End Class

    Hoffe daß auch bei Dir klappen wird.

    Viele Grüße,

    Bogdan


    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.


    Samstag, 11. Februar 2012 19:51
    Moderator
  • Hallo Bogdan,

    danke für Deine Bemühungen. Leider komme ich mit Deinem Sortiervorschlag auch nicht weiter. Die Sortierung bleibt so wie sie ist. Ich habe mal ein Beispieldokument hinterlegt. (http://uebung.katmakon.com/Kommentarproblem.docx)

    Ich habe jetzt mal versucht Klarheit darüber zu bekommen, wieso ich eine falsche Reihenfolge der Kommentare habe.

    Diese kuriose Reihenfolge der Kommentare wird bei mir erstellt, wenn ich die Kommentare mittels VB.NET erstelle, anbei der verwendete Code. Es darf aber im Word-Dokument nichts markiert sein, dann fügt man den ersten Kommentar ein, drückt die Enter-Taste und fügt den nächsten Kommentar ein, usw. Dann passt der Index der Kommentare nicht mehr. Wenn man bestende Textpassagen markiert ist die Reihenfolge richtig.

            Dim r As Microsoft.Office.Interop.Word.Range

            Dimd AsMicrosoft.Office.Interop.Word.Document = Globals.ThisAddIn.Application.ActiveDocument

            r = d.ActiveWindow.Selection.Range

            IfString.IsNullOrEmpty(r.Text) Then

                r.Text = "Mein Text."

            EndIf

            d.Comments.Add(r, "Kommentar_x_x")

            d.ActiveWindow.Selection.Start = r.End

    In der letzten Code-Zeile gehe ich an das Ende des Kommentars, damit die Eingabe der weiteren Kommentare flüssiger ist.

    Hast Du oder jemand anders eine Idee was zu diesem seltsamen Verhalten führt. Das wäre die andere Lösungsmöglichkeit für mein Problem.

    Danke

    Christian

     

     

    Dienstag, 14. Februar 2012 17:01
  • Hallo Christian,

    vielen Dank fuer das Dokument. Damit konnte ich das Problem nachstellen. Irgendwie mussen wir das hinkriegen. Ich melde mich heute mit Neuigkeiten :-)

    Viele Gruesse,

    Bogdan


    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.

    Donnerstag, 16. Februar 2012 07:58
    Moderator
  • Hallo Christian,

    diesmal habe ich die Sortierung richtig hingekriegt. Bitte auch bei Dir nachchecken:

    Public Class Form1
        Dim w As Microsoft.Office.Interop.Word.Application
        Dim d As Microsoft.Office.Interop.Word.Document
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim c As Microsoft.Office.Interop.Word.Comment
            Dim lngStart As Long
    
            Dim l_unsorted As List(Of Microsoft.Office.Interop.Word.Comment)
            Dim l_start As List(Of Long)
            Dim l_sorted As List(Of Microsoft.Office.Interop.Word.Comment)
    
    
            w = New Microsoft.Office.Interop.Word.Application
            w.Visible = True
            d = w.Documents.Open("C:\Users\a-boroiu\Desktop\Kommentarproblem.docx")
            'eine temporaere, nicht sortierte Liste von Kommentaren erstellen
            'und eine Liste der Startpositionen
            l_unsorted = New List(Of Microsoft.Office.Interop.Word.Comment)
            l_start = New List(Of Long)
            'eine Liste estelle mit allen Kommentaren, egal wie die angeordnet sind
            For Each c In d.Comments
                l_unsorted.Add(c)
                l_start.Add(c.Scope.Start)
            Next
            'die Liste der Startpositionen sortieren
            l_start.Sort()
            'und jetzt die Liste nach Scope.Start sorieren
            l_sorted = New List(Of Microsoft.Office.Interop.Word.Comment)
            For Each lngStart In l_start
                For Each c In l_unsorted
                    If lngStart = c.Scope.Start Then
                        l_sorted.Add(c)
                        Exit For
                    End If
                Next
            Next
    
            'jetzt die Anordnung ueberpruefen
            For Each c In l_sorted
                c.Scope.Select()
                MsgBox(c.Scope.Text)
            Next
            'bingo!
            d.Close()
            w.Quit()
    
        End Sub
    End Class

    Viele Gruesse,

    Bogdan


    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.

    Donnerstag, 16. Februar 2012 09:11
    Moderator
  • Hallo Bogdan,

    danke für Deine Unterstützung. Mit dieser Lösung bin ich jetzt weitergekommen, und kann mein Problem damit lösen. Wieso auch immer sie überhaupt notwendig ist.

    Schöne Grüße

    Christian

    Montag, 20. Februar 2012 11:29