Benutzer mit den meisten Antworten
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.
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.
- Als Antwort markiert Christian Pumberger Montag, 20. Februar 2012 11:30
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. -
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:
- Bearbeitet Christian Pumberger Montag, 6. Februar 2012 15:09
-
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.
-
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
-
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.
- Bearbeitet Bogdan Petru Roiu Samstag, 11. Februar 2012 19:52
-
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
-
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.
-
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.
- Als Antwort markiert Christian Pumberger Montag, 20. Februar 2012 11:30