Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Word 2007)
Paneの操作
投稿日時: 17/03/31 16:13:04
投稿者: bornkiller

 いつもお世話になります。
  Documentの一部をRangeを使ってSelectするとカーソルがその位置にきます。その部分を画面(VBAでPaneだと思います)の一番上に表示させるにはどうしたらいいでしょうか。 新規文書を開くとカーソルが一番上にきますが、そういうふうにしたいのです。

回答
投稿日時: 17/04/03 16:03:10
投稿者: んなっと

 ScrollTopView Rangeオブジェクト
でできるかもしれません。
 
test1は、あらかじめ本文内のどこかに設定されたブックマーク"ああ"にジャンプ。
test2は本文の"あいう"を検索して最初に見つかった部分にジャンプ。
 
Sub test1()
  ScrollTopView ActiveDocument.Bookmarks("ああ").Range
End Sub
Sub test2()
  Dim Rng As Range
  Set Rng = ActiveDocument.Range(0, 0)
  With Rng.Find
    .Text = "あいう"
    If .Execute Then
      ScrollTopView Rng
    End If
  End With
End Sub
Sub ScrollTopView(r As Range)
  Dim L1 As Long, T1 As Long, W1 As Long, H1 As Long
  Dim L2 As Long, T2 As Long, W2 As Long, H2 As Long
  Dim cnt As Long
  Application.ScreenUpdating = False
  r.Collapse wdCollapseStart
  ActiveWindow.ScrollIntoView r, True
  ActiveWindow.GetPoint L1, T1, W1, H1, r
  Selection.MoveUp Unit:=wdWindow
  ActiveWindow.GetPoint L2, T2, W2, H2, Selection.Range
  cnt = 0
  Do Until T1 - T2 < 1
    ActiveWindow.SmallScroll down:=1
    Selection.MoveUp Unit:=wdWindow
    ActiveWindow.GetPoint L1, T1, W1, H1, r
    ActiveWindow.GetPoint L2, T2, W2, H2, Selection.Range
    cnt = cnt + 1
    If cnt > 50 Then Exit Do
  Loop
  r.Select
  Application.ScreenUpdating = True
End Sub

投稿日時: 17/04/03 16:33:15
投稿者: bornkiller

 んなっとさん、RESありがとうございます。やってみましたが、結果は
 
ActiveWindow.ScrollIntoView Selection.Range, True と同じで、Topにきません。
 
 こちらの操作を前提にした話ですが、
    ActiveWindow.ScrollIntoView Selection.Range, True
    ActiveWindow.ActivePane.LargeScroll down:=1
    ActiveWindow.ScrollIntoView Selection.Range, True
 
 同じ構文を2回使うのが一番希望に近い結果が出ます。
 

回答
投稿日時: 17/04/03 16:53:39
投稿者: んなっと

そうですか。では、それでやってください。
 
無駄があったので、少し変更。結果は変わりませんが。
 
Sub ScrollTopView(r As Range)
  Dim L1 As Long, T1 As Long, W1 As Long, H1 As Long
  Dim L2 As Long, T2 As Long, W2 As Long, H2 As Long
  Dim cnt As Long
  Application.ScreenUpdating = False
  r.Collapse wdCollapseStart
  ActiveWindow.ScrollIntoView r, True
  Do
    ActiveWindow.GetPoint L1, T1, W1, H1, r
    Selection.MoveUp Unit:=wdWindow
    ActiveWindow.GetPoint L2, T2, W2, H2, Selection.Range
    If T1 - T2 < 1 Then Exit Do
    ActiveWindow.SmallScroll down:=1
    cnt = cnt + 1
  Loop Until cnt > 50
  r.Select
  Application.ScreenUpdating = True
End Sub

回答
投稿日時: 17/04/03 17:08:45
投稿者: んなっと

ああ、このスレッドの方ですね。
 
未知の編集記号
http://www.moug.net/faq/viewtopic.php?t=74859
 
回答しなければよかった...

投稿日時: 17/04/03 17:13:09
投稿者: bornkiller

んなっとさん、RESありがとうございます。
 
最初RESがなかったので、こりゃ自己解決しかないかと思っていました。アイデアとしてはカーソル位置を調べてWordのWindowの中での位置を割り出す、PersentScrollを使って画面を動かすなどということを考えているのですが、なにしろ実力がないので簡単にいきません。

投稿日時: 17/04/12 11:20:28
投稿者: bornkiller

 その後あれこれとやってみました。
 PersentScrollというのは細かい設定ができないので使えない。
    Usableheightで編集領域の上端は分かるが、下端は分からない。
 
 質問の状況はSection区切の後に定型文を入れ、入力がしやすいように冒頭部分をWindowの上にもってくるということでした。
 んなっとさんのマクロはこの状況では動かないようです。
 結局よく分からないままですが、根拠のないマクロをつくってみました。間違っているようなら教えてください。金曜日まで開けておきます。
 
Sub test6()
  Dim num1 As Long, num2 As Long, num3 As Long, num4 As Long, num5 As Long
  Dim txt1 As String, myRange1 As Range
  On Error GoTo myErr
  Set myRange1 = Selection.Range
  myRange1.Collapse Direction:=wdCollapseStart
  ActiveWindow.GetPoint num1, num2, num3, num4, myRange1 'left,top,width,height
  num5 = PixelsToPoints(num2) - (ActiveWindow.Height - ActiveWindow.UsableHeight) - (ActiveWindow.UsableHeight + PixelsToPoints(num4) * 2)
  If num5 >= 0 Then
    txt1 = "Rangeの位置は編集領域の下端から" & num5 & "ポイントのところにあって見えません。" & vbCr
  ElseIf PixelsToPoints(num2) - (ActiveWindow.Height - ActiveWindow.UsableHeight) > 0 Then
    txt1 = "Rangeの位置は編集領域の中にあって見えます。" & vbCr
  Else
    txt1 = "Rangeの位置は編集領域の上端から" & PixelsToPoints(num2) - (ActiveWindow.Height - ActiveWindow.UsableHeight) & _
                  "ポイントの位置にあって見えません。" & vbCr
  End If
  MsgBox txt1
  Exit Sub
myErr:
  MsgBox Err.Description
  Stop
  Resume Next
 
End Sub

回答
投稿日時: 17/04/12 16:14:12
投稿者: パオ〜〜ン

横から失礼します。
的はずれだったらごめんなさい。
 
r=selection.row
ActiveWindow.ScrollRow = r
 
こんなのではいけないのかな?

投稿日時: 17/04/13 13:45:07
投稿者: bornkiller

 パオーンさん、RESありがとうございます。
 
ActiveWindow.ScrollRow = Selection.Rowとやったらエラーになりました。
エクセルにこのメソッドがあるようですが、Wordにもあるんですか。2007なんですが。

投稿日時: 17/04/14 13:44:22
投稿者: bornkiller

 閉じます