none
ページ番号の取得 RRS feed

  • 質問

  • word2010 vbaです.
    文章のカーソルのある場所のページ番号と,相互参照をしようとしている対象のページ番号が異なるなら,相互参照対象のページ番号を挿入するマクロを作りたいのですが,①カーソルのある場所のページ番号,②相互参照をしようとしている対象のページ番号,をVBAから取得する方法がわかりません.相互参照対象のページ番号を挿入するコードはわかります.
    二つのページ番号を取得する方法をご存知でしたらご教示ください.
    宜しくお願いします.
    2017年2月9日 5:32

回答

  • 前回の質問の続きかな

    'ユーザーフォーム(モードレス表示する)
    Option Explicit
    
    Private rng(2) As Range
    
    Private Sub UserForm_Initialize()
        Call Init(10, Me.TextBox1, Me.CaptureButton1, Me.SelectButton1)
        Call Init(30, Me.TextBox2, Me.CaptureButton2, Me.SelectButton2)
        Me.WorkButton.Left = 40: Me.WorkButton.top = 60: Me.WorkButton.AutoSize = True: Me.WorkButton.Caption = "実行"
    End Sub
    Private Sub Init(ByVal top As Integer, ByVal T As TextBox, ByVal b1 As CommandButton, ByVal b2 As CommandButton)
        T.Left = 10: T.top = top: T.Width = 100: T.Height = 20: T.Enabled = False
        b1.Left = 10 + T.Width: b1.top = top: b1.Width = 30: b1.Height = 20: b1.Caption = "取得"
        b2.Left = 10 + T.Width + b1.Width: b2.top = top: b2.Width = 30: b2.Height = 20: b2.Caption = "選択"
    End Sub
    
    
    Private Sub CaptureButton1_Click()
        '現在の選択範囲を記憶
        Dim doc As Document
        Set doc = ActiveDocument
        Set rng(1) = doc.Range(Application.Selection.Range.Start, Application.Selection.End)
        If (rng(1).Start = rng(1).End) Then
            Me.TextBox1.Text = "**" & rng(1).Start
        Else
            Me.TextBox1.Text = rng(1).Text
        End If
    End Sub
    Private Sub CaptureButton2_Click()
        '現在の選択範囲を記憶
        Dim doc As Document
        Set doc = ActiveDocument
        Set rng(2) = doc.Range(Application.Selection.Range.Start, Application.Selection.End)
        If (rng(2).Start = rng(2).End) Then
            Me.TextBox2.Text = "**" & rng(2).Start
        Else
            Me.TextBox2.Text = rng(2).Text
        End If
    End Sub
    
    Private Sub SelectButton1_Click()
        '記憶していた範囲を再選択
        If Not rng(1) Is Nothing Then
            Call Application.Selection.SetRange(rng(1).Start, rng(1).End)
        End If
    End Sub
    Private Sub SelectButton2_Click()
        '記憶していた範囲を再選択
        If Not rng(2) Is Nothing Then
            Call Application.Selection.SetRange(rng(2).Start, rng(2).End)
        End If
    End Sub
    
    Private Sub WorkButton_Click()
        If Not (rng(1) Is Nothing Or rng(2) Is Nothing) Then
    
            Dim doc As Document
            Set doc = rng(1).Document
            
            Dim b As Bookmark
            Dim i As Integer
            For i = 1 To 1000
                Dim name As String
                name = "DUMMY_" & i
                If (Not doc.Bookmarks.Exists(name)) Then
                    '参照先に仮のブックマークを作る
                    Set b = doc.Bookmarks.Add(name, rng(1))
                    Exit For
                End If
            Next
            
    
            
            '参照元に以下のフィールドを作る
            '{ IF { PAGEREF DUMMY_nn } <> { PAGE } { PAGEREF DUMMY_nn }
            '参照先のページと現在ページをフィールドを使って取得し
            'そのページを比較して不一致なら参照先のページを表示する
            Dim f_IF As Field
            Dim f_Ref1 As Field
            Dim f_Ref2 As Field
            Dim f_Page As Field
            
            Dim r_IF As Range
            Dim r_Ref1 As Range
            Dim r_Ref2 As Range
            Dim r_Page As Range
            
            Set r_IF = doc.Range(rng(2).Start, rng(2).Start) '参照元のフィールド挿入位置
            Set f_IF = doc.Fields.Add(r_IF)
            f_IF.Code.Text = "if  <>   " 'IFフィールドの仮作成
            
            'IFフィールド内に入れ子のフィールドを作成
            Set r_Ref2 = doc.Range(f_IF.Code.Start + 9, f_IF.Code.Start + 9)
            Set f_Ref2 = f_IF.Code.Fields.Add(r_Ref2)
            f_Ref2.Code.Text = "PAGEREF " + name
            
            Set r_Page = doc.Range(f_IF.Code.Start + 7, f_IF.Code.Start + 7)
            Set f_Page = f_IF.Code.Fields.Add(r_Page)
            f_Page.Code.Text = "PAGE"
             
            Set r_Ref1 = doc.Range(f_IF.Code.Start + 3, f_IF.Code.Start + 3)
            Set f_Ref1 = f_IF.Code.Fields.Add(r_Ref1)
            f_Ref1.Code.Text = "PAGEREF " + name
            
           
            f_Ref1.Update
            f_Ref2.Update
            f_Page.Update
            f_IF.Update
            f_IF.ShowCodes = True
            
        Else
            MsgBox "選択範囲がありません"
        End If
    End Sub
    フィールドの更新すればページ番号を自動計算して処理してくれます

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年2月9日 10:27

すべての返信

  • こちらのページの情報で実現出来ないでしょうか?
    http://www.relief.jp/itnote/archives/018015.php

    「word vba ページ番号 取得」で検索したらすぐに出てきましたので、
    すでに確認されてらっしゃるかもしれませんが…。


    2017年2月9日 7:41
  • ありがとうございます。「相互参照をしようとしている対象のページ番号」はいかがでしょうか?
    2017年2月9日 8:36
  • 前回の質問の続きかな

    'ユーザーフォーム(モードレス表示する)
    Option Explicit
    
    Private rng(2) As Range
    
    Private Sub UserForm_Initialize()
        Call Init(10, Me.TextBox1, Me.CaptureButton1, Me.SelectButton1)
        Call Init(30, Me.TextBox2, Me.CaptureButton2, Me.SelectButton2)
        Me.WorkButton.Left = 40: Me.WorkButton.top = 60: Me.WorkButton.AutoSize = True: Me.WorkButton.Caption = "実行"
    End Sub
    Private Sub Init(ByVal top As Integer, ByVal T As TextBox, ByVal b1 As CommandButton, ByVal b2 As CommandButton)
        T.Left = 10: T.top = top: T.Width = 100: T.Height = 20: T.Enabled = False
        b1.Left = 10 + T.Width: b1.top = top: b1.Width = 30: b1.Height = 20: b1.Caption = "取得"
        b2.Left = 10 + T.Width + b1.Width: b2.top = top: b2.Width = 30: b2.Height = 20: b2.Caption = "選択"
    End Sub
    
    
    Private Sub CaptureButton1_Click()
        '現在の選択範囲を記憶
        Dim doc As Document
        Set doc = ActiveDocument
        Set rng(1) = doc.Range(Application.Selection.Range.Start, Application.Selection.End)
        If (rng(1).Start = rng(1).End) Then
            Me.TextBox1.Text = "**" & rng(1).Start
        Else
            Me.TextBox1.Text = rng(1).Text
        End If
    End Sub
    Private Sub CaptureButton2_Click()
        '現在の選択範囲を記憶
        Dim doc As Document
        Set doc = ActiveDocument
        Set rng(2) = doc.Range(Application.Selection.Range.Start, Application.Selection.End)
        If (rng(2).Start = rng(2).End) Then
            Me.TextBox2.Text = "**" & rng(2).Start
        Else
            Me.TextBox2.Text = rng(2).Text
        End If
    End Sub
    
    Private Sub SelectButton1_Click()
        '記憶していた範囲を再選択
        If Not rng(1) Is Nothing Then
            Call Application.Selection.SetRange(rng(1).Start, rng(1).End)
        End If
    End Sub
    Private Sub SelectButton2_Click()
        '記憶していた範囲を再選択
        If Not rng(2) Is Nothing Then
            Call Application.Selection.SetRange(rng(2).Start, rng(2).End)
        End If
    End Sub
    
    Private Sub WorkButton_Click()
        If Not (rng(1) Is Nothing Or rng(2) Is Nothing) Then
    
            Dim doc As Document
            Set doc = rng(1).Document
            
            Dim b As Bookmark
            Dim i As Integer
            For i = 1 To 1000
                Dim name As String
                name = "DUMMY_" & i
                If (Not doc.Bookmarks.Exists(name)) Then
                    '参照先に仮のブックマークを作る
                    Set b = doc.Bookmarks.Add(name, rng(1))
                    Exit For
                End If
            Next
            
    
            
            '参照元に以下のフィールドを作る
            '{ IF { PAGEREF DUMMY_nn } <> { PAGE } { PAGEREF DUMMY_nn }
            '参照先のページと現在ページをフィールドを使って取得し
            'そのページを比較して不一致なら参照先のページを表示する
            Dim f_IF As Field
            Dim f_Ref1 As Field
            Dim f_Ref2 As Field
            Dim f_Page As Field
            
            Dim r_IF As Range
            Dim r_Ref1 As Range
            Dim r_Ref2 As Range
            Dim r_Page As Range
            
            Set r_IF = doc.Range(rng(2).Start, rng(2).Start) '参照元のフィールド挿入位置
            Set f_IF = doc.Fields.Add(r_IF)
            f_IF.Code.Text = "if  <>   " 'IFフィールドの仮作成
            
            'IFフィールド内に入れ子のフィールドを作成
            Set r_Ref2 = doc.Range(f_IF.Code.Start + 9, f_IF.Code.Start + 9)
            Set f_Ref2 = f_IF.Code.Fields.Add(r_Ref2)
            f_Ref2.Code.Text = "PAGEREF " + name
            
            Set r_Page = doc.Range(f_IF.Code.Start + 7, f_IF.Code.Start + 7)
            Set f_Page = f_IF.Code.Fields.Add(r_Page)
            f_Page.Code.Text = "PAGE"
             
            Set r_Ref1 = doc.Range(f_IF.Code.Start + 3, f_IF.Code.Start + 3)
            Set f_Ref1 = f_IF.Code.Fields.Add(r_Ref1)
            f_Ref1.Code.Text = "PAGEREF " + name
            
           
            f_Ref1.Update
            f_Ref2.Update
            f_Page.Update
            f_IF.Update
            f_IF.ShowCodes = True
            
        Else
            MsgBox "選択範囲がありません"
        End If
    End Sub
    フィールドの更新すればページ番号を自動計算して処理してくれます

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年2月9日 10:27
  • 下記のようなコードで相互参照が配置されたページと、相互参照の参照先のページがわかるようです。

    Sub test()
        Dim objDoc As Document
        Dim objFld As Field
        Dim i As Long
        Set objDoc = ActiveDocument
        For Each objFld In objDoc.Fields
            If objFld.Type = wdFieldRef Or objFld.Type = wdFieldPageRef Then
                Dim srcRange As Range ' 相互参照の配置された位置
                Dim refRange As Range ' 相互参照の参照先の位置
                Set srcRange = objFld.Code
                strRef = Split(objFld.Code.Text, " ")
                For i = 0 To UBound(strRef)
                    If Left(strRef(i), 4) = "_Ref" Then
                        Set refRange = ActiveDocument.Bookmarks(strRef(i)).Range
                        MsgBox "相互参照の配置されたページ: " & srcRange.Information(wdActiveEndAdjustedPageNumber) & "ページ" & vbCrLf & _
                         "相互参照の参照先のページ: " & refRange.Information(wdActiveEndAdjustedPageNumber) & "ページ" & vbCrLf
                        Exit For
                    End If
                Next i
            End If
        Next objFld
    End Sub
    参考ページ: https://www.experts-exchange.com/questions/27980752/MS-Word-Cross-References-and-VBA.html
    2017年2月9日 10:28
  • 皆様,ありがとうございます.
    ご紹介いただいたプログラムは私にはすこし難しいです.
    頁情報を利用する時点で利用できる情報を使って簡単にページ番号を取得できる可能性があるのかどうか知りたいので,少し説明させてください.

    頁情報を利用する状況ですが,ActiveDocument.GetCrossReferenceItems()で取得した参照項目の一覧を格納した配列(MyList)をユーザーフォーム上のリストボックス(MyListBox)に設定し選択した状態です.

    ですので参照項目コレクション内の番号や選択項目自体は取得可能です.これらの情報を使って選択項目のページ番号を簡単に取得する方法は無いでしょうか?イメージしているのは選択した参照項目に対応するオブジェクト,そのオブジェクトのプロパティ若しくはメソッドでページ番号を取得するイメージです.

    オブジェクト.Information(wdActiveEndAdjustedPageNumber)

    のようなイメージです.

    宜しくお願いします.

    2017年2月9日 10:58