Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Word VBA Zeile zum oberen Rand scrollen (https://www.delphipraxis.net/213244-word-vba-zeile-zum-oberen-rand-scrollen.html)

Amateurprofi 23. Jun 2023 15:14

Word VBA Zeile zum oberen Rand scrollen
 
Ich möchte die Zeile in einem Dokument, in der das Eingabe Caret steht, an den oberen Rand des Fensters scrollen.
Mein Ansatz
Code:
   Dim Start As Long
   Start = Selection.Start
   Do While Not (Start ist am oberen Rand)
      Selection.Move Unit:=wdLine, Count:=1
   Loop
Problem:
Wie kann ich ermitteln, ob sich Start am oberen Rand befindet?

Amateurprofi 27. Jun 2023 12:32

AW: Word VBA Zeile zum oberen Rand scrollen
 
Wirklich niemand 'ne Idee?

ergo2000 29. Jun 2023 09:10

AW: Word VBA Zeile zum oberen Rand scrollen
 
Das hier ist vielleicht ein Ansatz.
Im Word-Dokument wird hier nach "ganz oben" oder zum "ersten Wort" gesprungen...

var vBookmark,vWhat OleVariant;

//an Anfang springen:

vBookMark:='\StartOfDoc';
vWhat:=OLEVariant(wdGoToBookmark);

WordApplication1.ActiveDocument.Application.Select ion.GoTo_( vWhat, EmptyParam,EmptyParam, vBookMark );


Gruß
Ralf

Amateurprofi 29. Jun 2023 10:20

AW: Word VBA Zeile zum oberen Rand scrollen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Ralf.
Ist leider nicht das, was ich suche.
Ich möchte nicht zum Anfang des Dokuments springen, das wäre ja mit Ctrl-Pos1 leicht zu machen.
Was ich möchte ist, das die Zeile, in der das Eingabe Caret steht, so gescrollt wird, dass diese Zeile am oberen Rand des Fensters steht.

Hintergrund:
Ich habe z.Z. ein Dokument mit > 700 Seiten, das als Source für den Microsoft Help Workshop dient.
In dem Dokument sind Links, die auf eine bestimmte Seite des Dokuments verweisen.
So ein Link besteht aus einem Text der aus dem Titel einer Seite, gefolgt von der Id der Seite, besteht.
Hierbei ist der Teil des Textes, den den Seitentitel zeigt, als unterstrichen formatiert, der Teil der die Id der Seite zeigt, ist als hidden formatiert.
Wenn das Caret in solch einem Link steht, kann ich mit einem der Macros in der Vorlage (wird mit Alt-G aufgerufen) zu der Seite springen.
Leider erscheint diese dann i.d.R. als unterste Zeile im angezeigten Bereich des Dokuments.
Was ich möchte ist, dass die erste Zeile der "angesprungenen" Seite als oberste Zeile im angezeigten Bereich des Dokuments steht.
Ich habe mal mein Template für Help-Files angehängt.

Meine aktuelle Notlösung ist
Code:
Sub ScrollToTop()
   Selection.Move Unit:=wdLine, Count:=10
   Selection.Move Unit:=wdLine, Count:=-10
End Sub

HolgerX 29. Jun 2023 12:37

AW: Word VBA Zeile zum oberen Rand scrollen
 
Hmmm..

Über normale OLE geht es wie folgt:

Code:
      WordApp.ActiveDocument.ActiveWindow.ScrollIntoView(r, True);

wobei r hier ein range Object ist.

Sprich selectiere z.B. den Anfang deines Bereiches, nehme diese Selection als Range und durch das True bei ScrollIntoView wird dieser Text dann oben angezeigt.

ergo2000 29. Jun 2023 12:45

AW: Word VBA Zeile zum oberen Rand scrollen
 
Genau, ich schließe mich meinem Vorgänger an.
Wenn Du bereits auf der richtigen DOC-Seite bist, dann sollte:

...Selection.Range.Select;

und anschließend:

WordApplication1.ActiveWindow.ScrollIntoView( WordApplication1.Selection.Range, True);

zum Erfolg führen. Der Bereich muss aber zuvor per Makro markiert werden.


Gruß
Ralf

Jumpy 29. Jun 2023 14:51

AW: Word VBA Zeile zum oberen Rand scrollen
 
Als andere Alternative, keine Ahnung ob machbar. Ans Ende des Dokuments springen und erst dann an die gesuchte Stelle. Da man dann von unten kommt, müsste die gefundene Zeile doch am oberen Bildrand sein.

Amateurprofi 29. Jun 2023 16:54

AW: Word VBA Zeile zum oberen Rand scrollen
 
@HolgerX, @Ralf,
Danke funktioniert.
Code:
' Aktuelle Zeile an oberen Rand scrollen
' Das Caret steht am Anfang der ersten Zeile unter der Seitenüberschrift
Sub ScrollToTop()
   Dim N As Long
   N = 0
   'Do While (N < 50) And (Asc(Selection.Characters.Last) <> 12) ' N<50, falls kein vbFormFeed gefunden wird
   Do While (N < 50) And (Selection.Characters.Last <> vbFormFeed) ' N<50, falls kein vbFormFeed gefunden wird
      Selection.MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
      N = N + 1
   Loop
   ActiveWindow.ScrollIntoView Selection.Range, True
   Selection.MoveUp Unit:=wdLine, Count:=1 ' In die Seitenüberschrift
   Selection.MoveDown Unit:=wdLine, Count:=1
End Sub
@Jumpy
Das ist die optimale Lösung. So einfach, muss man erstmal drauf kommen.
Code:
' Springt zum Topic mit der Id S
Sub JumpToTopic(S As String)
   Dim FN As Footnote, EN As Endnote
   ' In Fußnoten suchen
   For Each FN In ActiveDocument.Footnotes
      If FN.Range = S Then
         Selection.EndKey Unit:=wdStory, Extend:=wdMove
         FN.Reference.Select
         Selection.HomeKey Unit:=wdLine, Extend:=wdMove
         Selection.MoveDown 'Auf erste Zeile des Texts
         Exit Sub
      End If
   Next
   ' Wenn nicht in Fußnoten gefunden, dann in Endnoten suchen
   For Each EN In ActiveDocument.Endnotes
      If EN.Range = S Then
         Selection.EndKey Unit:=wdStory, Extend:=wdMove
         EN.Reference.Select
         Selection.HomeKey Unit:=wdLine, Extend:=wdMove
         Selection.MoveDown 'Auf erste Zeile des Texts
         Exit Sub
      End If
   Next
End Sub


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz