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つは実行すると、別ウィンドウで図表番号の一覧が表示され、一覧の中のボタンを押すと相対参照が挿入されます。
これでマクロ自体は完成です。しかし、開発ウィンドウからマクロを起動するのは面倒です。リボンにマクロを起動するボタンを作成し、使いやすくしていきます。
マクロをリボンに登録
こちらの記事を参考に完成したマクロをリボンに登録します。
これで冒頭と同じようなマクロが完成します。
文書への図表番号挿入もこれで一気に効率アップできるでしょう。
コメント