Word|図表番号の相対参照が1秒で挿入できるようになるマクロ

Wordで報告書を書いていると、「図-1」,「図-2」,「表-1」,「表-2」などの連番の図表番号を書く機会が多いです。

これは通常、「図表番号の挿入」と「相対参照の挿入」というものがwordの機能があるので、それを使って書くのが一般的です。(こちらの記事で解説しています。)

この記事では、この図表番号の挿入を時短で挿入するマクロを作成します。

  • 図表番号挿入と相対参照の挿入をマクロでワンボタン可
  • マクロの知識不要、掲載コードのコピペでOK
  • 一度設定すれば、再設定不要でどのWordファイルでも利用可

完成品

まずは完成品、

リボンにオリジナルマクロというボタンを作り、そこから、図表番号と相対参照の挿入を行なえるようにしています。

このマクロを実装するためには、「標準モジュール」「フォームモジュール」「クラスモジュール」の3種類のモジュールを作成し、実装する必要があります。

この記事では、モジュール内のコードをすべて公開していますので、「モジュールを手動で作成」→「コードのコピーペースト」とするだけでご利用できます。

プログラミングの知識はなくとも実装できます。

標準モジュールの作成

標準モジュールの挿入

まず、「開発」タブから、「Visual Basic」を押してVBEを開きます。開発タブがない方はこちらの記事を参考にしてください。

「挿入」→「標準モジュール」と押して標準モジュールを挿入します。

画像のように「Normal」→「標準モジュール」→「Module1」となればOKです。

ほかの位置に標準モジュールが作成されてしまった場合はModule1」を選択した状態で右クリックして、「Module1の開放」でModule1を削除します。「解放前にエクスポートしますか?」と聞かれますが、いいえにします。

ちなみにVBEにおいて、この「○○の開放」は「○○の削除」と同義です。

「解放前にエクスポートしますか?」は「削除前にバックアップしますか?」と同じような意味です。

標準モジュールへコードの記述

次に、下記コードをコピーして、標準モジュールにペーストします。

Option Explicit
Sub hyou_sounyu()
    CaptionLabels.Add Name:="表-"
    Selection.InsertCaption Label:="表-"
End Sub
Sub zu_sounyu()
    CaptionLabels.Add Name:="図-"
    Selection.InsertCaption Label:="図-"
End Sub
Sub sya_sounyu()
    CaptionLabels.Add Name:="写-"
    Selection.InsertCaption Label:="写-"
End Sub
Sub Zu_soutaisansyo_Sounyu()
    Zu_Soutaisansyo_Form.Show 
End Sub
Sub Hyou_soutaisansyo_Sounyu()
    Hyou_Soutaisansyo_Form.Show
End Sub
Sub Sya_Soutaisansyo_Sounyu()
    Sya_Soutaisansyo_Form.Show
End Sub

動作の確認

この時点で図表番号の挿入は動作します。

×ボタンでVBEを閉じ、「Visual Basic」の隣にある「マクロ」のボタンを押すとマクロの一覧が表示されます。

  • hyou_sounyu
  • zu_sounyu
  • sya_sounyu

この3つは実行するとそれぞれ、「図-1」「表-1」「写-1」がwordに入力されます。

フォームモジュールの作成

ユーザーフォームの挿入

「挿入」→「ユーザーフォーム」と押して、ユーザーフォームを挿入します。

画像のように「Normal」→「フォーム」→「UserForm1」となればOKです。

ほかの位置に標準モジュールが作成されてしまった場合は、前述のように右クリックで「UserForm1の開放」で消して、作り直しましょう。

これを繰り返し、「UserForm1」 ~ 「UserForm3」まで3つ作成します。「図-」「表-」「写-」でそれぞれフォームが必要なので3つ作成します。 

ユーザーフォームの名称変更

UserForm1は標準モジュールと違い、モジュールの名称を変える必要があります。

左下の「プロパティ-UserForm」の中にある「(オブジェクト名)」→「UserForm*」となっているところを書き換えます。

  • Zu_Soutaisansyo_Form
  • Hyou_Soutaisansyo_Form
  • Sya_Soutaisansyo_Form

オブジェクト名を変更すると、画像のようにツリー構造の部分も名称が変わります。

※もしプロパティのウィンドウが表示されていない場合は「表示」→「プロパティウィンドウ」で表示できます。

ユーザーフォームにコードを記述

ユーザーフォームにそれぞれコードを記述していきます。

フォームを選択し、右クリックで「コードの表示」を選択します。

Private Sub UserForm_Click()
End Sub

初期状態では、上記のようなコードが入力されていますが、これは消しください。

新たに、下記のコードを入力します。

Option Explicit
Dim n As Integer
Private CommandButton(0 To 1000) As New soutaisansyo_class  '参照元が1000を超えるとエラー さすがにそこまでは使わないだろう。
Dim MyBookmarks() As String
Dim MyBookmark As Variant
Private Sub UserForm_Initialize()  'このユーザーフォームが開かれた時に発生するイベント
    Dim Btn As MSForms.CommandButton  'コマンドボタンのオブジェクトを格納
        
  
    MyBookmarks = ActiveDocument.GetCrossReferenceItems(ReferenceType:="図-") '文書内の「図-」をすべて取得し、配列として格納
        
    
    Zu_Soutaisansyo_Form.Width = 180 + 160 * ((UBound(MyBookmarks) - 1) \ 8)  'フォームの大きさを指定
    
    n = 0
    
   
    
    For Each MyBookmark In MyBookmarks
        Set Btn = Zu_Soutaisansyo_Form.Controls.Add("Forms.CommandButton.1", "CommandButton" & (n + 1), True)
        With Btn      'ボタンの大きさや位置を指定
            .Left = 10 + 160 * (n \ 8)
            .Top = 10 + 25 * (n Mod 8)
            .Width = 150
            .Height = 20
            .Caption = MyBookmark
        End With
        n = n + 1
    Next
    
    
    For n = 1 To UBound(MyBookmarks)
        CommandButton(n).Zu_Class Controls("CommandButton" & n), n
    Next
End Sub
Option Explicit
Dim n As Integer
Private CommandButton(0 To 1000) As New soutaisansyo_class  '参照元が1000を超えるとエラー さすがにそこまでは使わないだろう。
Dim MyBookmarks() As String
Dim MyBookmark As Variant
Private Sub UserForm_Initialize()  'このユーザーフォームが開かれた時に発生するイベント
    Dim Btn As MSForms.CommandButton  'コマンドボタンのオブジェクトを格納
        
    MyBookmarks = ActiveDocument.GetCrossReferenceItems(ReferenceType:="表-") '文書内の「表-」をすべて取得し、配列として格納
        
    
    Hyou_Soutaisansyo_Form.Width = 180 + 160 * ((UBound(MyBookmarks) - 1) \ 8)  'フォームの大きさを指定
    
    n = 0
    
   
    
    For Each MyBookmark In MyBookmarks
        Set Btn = Hyou_Soutaisansyo_Form.Controls.Add("Forms.CommandButton.1", "CommandButton" & (n + 1), True)
        With Btn      'ボタンの大きさや位置を指定
            .Left = 10 + 160 * (n \ 8)
            .Top = 10 + 25 * (n Mod 8)
            .Width = 150
            .Height = 20
            .Caption = MyBookmark
        End With
        n = n + 1
    Next
    
    
    For n = 1 To UBound(MyBookmarks)
        CommandButton(n).Hyou_Class Controls("CommandButton" & n), n
    Next
End Sub
Option Explicit
Dim n As Integer
Private CommandButton(0 To 1000) As New soutaisansyo_class  '参照元が1000を超えるとエラー さすがにそこまでは使わないだろう。
Dim MyBookmarks() As String
Dim MyBookmark As Variant
Private Sub UserForm_Initialize()  'このユーザーフォームが開かれた時に発生するイベント
    Dim Btn As MSForms.CommandButton  'コマンドボタンのオブジェクトを格納
        
   
    MyBookmarks = ActiveDocument.GetCrossReferenceItems(ReferenceType:="写-") '文書内の「写-」をすべて取得し、配列として格納
        
    
    Sya_Soutaisansyo_Form.Width = 180 + 160 * ((UBound(MyBookmarks) - 1) \ 8)  'フォームの大きさを指定
    
    n = 0
    
   
    
    For Each MyBookmark In MyBookmarks
        Set Btn = Sya_Soutaisansyo_Form.Controls.Add("Forms.CommandButton.1", "CommandButton" & (n + 1), True)
        With Btn      'ボタンの大きさや位置を指定
            .Left = 10 + 160 * (n \ 8)
            .Top = 10 + 25 * (n Mod 8)
            .Width = 150
            .Height = 20
            .Caption = MyBookmark
        End With
        n = n + 1
    Next
    
    
    For n = 1 To UBound(MyBookmarks)
        CommandButton(n).Sya_Class Controls("CommandButton" & n), n
    Next
End Sub

これでフォームが作成できました。

この時点ではまだ、相対参照のマクロは動作しません。次のclassモジュールの作成に進みます。

classモジュールの作成

クラスモジュールの挿入

「挿入」→「クラスモジュール」と押して、クラスモジュールを挿入します。

画像のように「Normal」→「クラスモジュール」→「Class1」となればOK。

ほかの位置にクラスモジュールが作成されてしまった場合は、前述のように右クリックで「Class1の開放」で消して、作り直しましょう。

クラスモジュールの名称変更

クラスモジュールもフォームクラスと同じく名称を変更する必要があります。「Class1」を選択して、プロパティから名称を「soutaisansyo_class」へ変更します。

  • soutaisansyo_class

クラスモジュールへコードの記述

クラスモジュールには下記のコードをコピーしてペーストしてください。

Private WithEvents Zu_Btn As MSForms.CommandButton
Private WithEvents Hyou_Btn As MSForms.CommandButton
Private WithEvents Sya_Btn As MSForms.CommandButton
'ボタンの数字を格納する変数を宣言
Private Index As Integer
Public Sub Zu_Class(ByVal c As MSForms.CommandButton, ByVal I As Variant)
    '引数のコマンドボタンを変数に格納
    Set Zu_Btn = c
    'コマンドボタンの数字を変数に格納
    Index = I
End Sub
Public Sub Hyou_Class(ByVal c As MSForms.CommandButton, ByVal I As Variant)
    '引数のコマンドボタンを変数に格納
    Set Hyou_Btn = c
    'コマンドボタンの数字を変数に格納
    Index = I
End Sub
Public Sub Sya_Class(ByVal c As MSForms.CommandButton, ByVal I As Variant)
    '引数のコマンドボタンを変数に格納
    Set Sya_Btn = c
    'コマンドボタンの数字を変数に格納
    Index = I
End Sub
Public Sub Zu_Btn_Click() '相対参照フォーム上のボタンが押されたときに起動するプロシージャ
    Selection.InsertCrossReference ReferenceType:="図-", ReferenceKind:=wdOnlyLabelAndNumber, ReferenceItem:=Index, InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
    Unload Zu_Soutaisansyo_Form
End Sub
Public Sub Hyou_Btn_Click() '相対参照フォーム上のボタンが押されたときに起動するプロシージャ
    Selection.InsertCrossReference ReferenceType:="表-", ReferenceKind:=wdOnlyLabelAndNumber, ReferenceItem:=Index, InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
    Unload Hyou_Soutaisansyo_Form
End Sub
Public Sub Sya_Btn_Click() '相対参照フォーム上のボタンが押されたときに起動するプロシージャ
    Selection.InsertCrossReference ReferenceType:="写-", ReferenceKind:=wdOnlyLabelAndNumber, ReferenceItem:=Index, InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
    Unload Sya_Soutaisansyo_Form
End Sub

動作の確認

ここまでの作業が完了すると、マクロが動作するようになります。

×ボタンでVBEを閉じ、「Visual Basic」の隣にある「マクロ」のボタンを押すとマクロの一覧が表示されます。

  • hyou_sounyu
  • zu_sounyu
  • sya_sounyu
  • Zu_soutaisansyo_Sounyu
  • Hyou_soutaisansyo_Sounyu
  • Sya_Soutaisansyo_Sounyu

上3つは実行するとそれぞれ、現在のカーソル位置に「図-1」「表-1」「写-1」がwordに入力されます。

下3つは実行すると、別ウィンドウで図表番号の一覧が表示され、一覧の中のボタンを押すと相対参照が挿入されます。

これでマクロ自体は完成です。しかし、開発ウィンドウからマクロを起動するのは面倒です。リボンにマクロを起動するボタンを作成し、使いやすくしていきます。

マクロをリボンに登録

こちらの記事を参考に完成したマクロをリボンに登録します。

これで冒頭と同じようなマクロが完成します。

文書への図表番号挿入もこれで一気に効率アップできるでしょう。

コメント

タイトルとURLをコピーしました