none
Word VBAで,現在表示されているページのページ番号を取得する方法は? RRS feed

  • Pregunta

  • Word VBAで,Selection.Information(wdActiveEndPageNumber) を実行すれば,カーソル位置のページ番号を取得することはできます。

    では,カーソル位置とは関係なく,ウィンドウに現在表示されているページのページ番号を取得する方法はあるのでしょうか?

    ウィンドウ左下のステータスバーには,現在表示されているページのページ番号が表示されていますが,これと同じ値をVBAで取得したいのです。

    miércoles, 14 de junio de 2017 13:03

Respuestas

  • こんにちは。
    「ステータス バー」と「ページ番号」が表示されていることが前提になりますが、UIAutomationを使ってステータスバーから直接ページ番号の値を取得することができます。

    'UIAutomationClient(UIAutomationCore.dll)要参照
    Option Explicit
    
    Public Sub Sample()
    'ステータス バーからページ番号取得
    '※「ステータス バー」と「ページ番号」が表示されていることが前提
      Dim uiAuto As UIAutomationClient.CUIAutomation
      Dim elm As UIAutomationClient.IUIAutomationElement
      Dim ary As IUIAutomationElementArray
      Dim acc As Office.IAccessible
      Dim num As String
      Dim v As Variant
      Dim i As Long
      
      'ステータス バーからIAccessible経由でIUIAutomationElement取得
      Set acc = Application.CommandBars("Status Bar")
      Set uiAuto = New UIAutomationClient.CUIAutomation
      Set elm = uiAuto.ElementFromIAccessible(acc, 0)
      
      'ステータス バー(NetUInetpane)取得
      Set elm = GetElement(uiAuto, elm, UIA_ClassNamePropertyId, "NetUInetpane")
      '子要素からCurrentNameに[ページ番号]が含まれるものを取得
      Set ary = elm.FindAll(TreeScope_Subtree, uiAuto.CreateTrueCondition)
      For i = 0 To ary.Length - 1
        num = ary.GetElement(i).CurrentName
        If InStr(num, "ページ番号") Then Exit For
      Next
      
      '取得したページ番号整形
      MsgBox num, vbInformation + vbSystemModal '確認用
      num = Replace(num, "ページ番号 ", "")
      v = Split(num, "/")
      MsgBox v(LBound(v)), vbInformation + vbSystemModal
    End Sub
    
    Private Function GetElement(ByVal uiAuto As CUIAutomation, _
                                ByVal elmParent As IUIAutomationElement, _
                                ByVal propertyId As Long, _
                                ByVal propertyValue As Variant, _
                                Optional ByVal ctrlType As Long = 0) As IUIAutomationElement
      Dim cndFirst As IUIAutomationCondition
      Dim cndSecond As IUIAutomationCondition
        
      Set cndFirst = uiAuto.CreatePropertyCondition( _
                       propertyId, _
                       propertyValue _
                     )
      If ctrlType <> 0 Then
        Set cndSecond = uiAuto.CreatePropertyCondition( _
                          UIA_ControlTypePropertyId, _
                          ctrlType _
                        )
        Set cndFirst = uiAuto.CreateAndCondition( _
                         cndFirst, _
                         cndSecond _
                       )
      End If
      Set GetElement = elmParent.FindFirst(TreeScope_Subtree, cndFirst)
    End Function
    余り調べていないのですが、もっと楽な取得方法もあるかもしれません。
    jueves, 15 de junio de 2017 1:30

Todas las respuestas

  • こんにちは。
    「ステータス バー」と「ページ番号」が表示されていることが前提になりますが、UIAutomationを使ってステータスバーから直接ページ番号の値を取得することができます。

    'UIAutomationClient(UIAutomationCore.dll)要参照
    Option Explicit
    
    Public Sub Sample()
    'ステータス バーからページ番号取得
    '※「ステータス バー」と「ページ番号」が表示されていることが前提
      Dim uiAuto As UIAutomationClient.CUIAutomation
      Dim elm As UIAutomationClient.IUIAutomationElement
      Dim ary As IUIAutomationElementArray
      Dim acc As Office.IAccessible
      Dim num As String
      Dim v As Variant
      Dim i As Long
      
      'ステータス バーからIAccessible経由でIUIAutomationElement取得
      Set acc = Application.CommandBars("Status Bar")
      Set uiAuto = New UIAutomationClient.CUIAutomation
      Set elm = uiAuto.ElementFromIAccessible(acc, 0)
      
      'ステータス バー(NetUInetpane)取得
      Set elm = GetElement(uiAuto, elm, UIA_ClassNamePropertyId, "NetUInetpane")
      '子要素からCurrentNameに[ページ番号]が含まれるものを取得
      Set ary = elm.FindAll(TreeScope_Subtree, uiAuto.CreateTrueCondition)
      For i = 0 To ary.Length - 1
        num = ary.GetElement(i).CurrentName
        If InStr(num, "ページ番号") Then Exit For
      Next
      
      '取得したページ番号整形
      MsgBox num, vbInformation + vbSystemModal '確認用
      num = Replace(num, "ページ番号 ", "")
      v = Split(num, "/")
      MsgBox v(LBound(v)), vbInformation + vbSystemModal
    End Sub
    
    Private Function GetElement(ByVal uiAuto As CUIAutomation, _
                                ByVal elmParent As IUIAutomationElement, _
                                ByVal propertyId As Long, _
                                ByVal propertyValue As Variant, _
                                Optional ByVal ctrlType As Long = 0) As IUIAutomationElement
      Dim cndFirst As IUIAutomationCondition
      Dim cndSecond As IUIAutomationCondition
        
      Set cndFirst = uiAuto.CreatePropertyCondition( _
                       propertyId, _
                       propertyValue _
                     )
      If ctrlType <> 0 Then
        Set cndSecond = uiAuto.CreatePropertyCondition( _
                          UIA_ControlTypePropertyId, _
                          ctrlType _
                        )
        Set cndFirst = uiAuto.CreateAndCondition( _
                         cndFirst, _
                         cndSecond _
                       )
      End If
      Set GetElement = elmParent.FindFirst(TreeScope_Subtree, cndFirst)
    End Function
    余り調べていないのですが、もっと楽な取得方法もあるかもしれません。
    jueves, 15 de junio de 2017 1:30
  • きぬあささん,早速のご回答ありがとうございます。

    ご提示いただいたコードを実行してみて,確かに当方の期待する結果が得られることが確認できました。ありがとうございます。

    UIAutomationClientなるものは,全く知りませんでしたので,勉強したいと思います。



    jueves, 15 de junio de 2017 8:02