1. はじめに
この記事では、マクロ(VBA)は多少触っているレベルの方を対象にして、フォームを使ったツールの作り方と配布方法までの手順を書いておきます。
以下、WORD VBAを使って、次のような簡素な文書変換ツールの作り方を順を追いながら紹介していきます。
順を追って作業していただければ(読んでいただければ)、おおよその流れがわかるかと思います。
1-1. 作成するツールの概要(使い方)
ここで作成するのはどういうツールかを簡単に説明しておきます。
①アイコンからフォームを表示
フォームはツールバーのアイコンをクリックして立ち上げます(赤枠部分)。
②数字部分の自動マーキング
数字部分のマーキング
ボタンを押すことで、変換の対象となる数字部分が自動的にマーキングされます。
③変換をしない数字についてマーキングを解除する
変換したくない数字は、マーキングを解除することで変換を回避できます。
マーキングは、WORDのメニューからでも解除できますし、ツールの選択部分のマーキングをクリア
ボタンを使うことでも解除できます。
④表記種別を選択して変換を実行
マーキング部分の数字を一括変換するには、マーキング部分の数字変換を実行
ボタンを押すことで、変換を実行できます。
数字変換の種類は、コンボボックスから算用数字、漢数字など4つのパターンを選択することができます。
<変換種別一覧>
種別 | 表記例 |
---|---|
算用数字 | 538,000,000 |
漢数字1 | 五億三千八百万 |
漢数字2 | 五億三八〇〇万 |
数字・漢字混合 | 5億3800万 |
1-2. フォームとモジュールの新規作成
下準備として、使用するフォーム画面とモジュールの新規作成を行います。
まず、新規WORDファイル(拡張子は.docm
としてください)を作って、VBAの画面を開きます。
ここではSampleTool.docm
というファイル名にしました。
そして、VBAの画面のメニュー「挿入」から、「ユーザーフォーム」を2つ、「標準モジュール」を1つ作成します。
作成が完了すると赤枠部分のようにUserFormが2つ、Moduleが1つ表示されていると思います。
なお、青枠で囲んだ部分は、コード表示(左側)とフォーム表示(右側)の切り替えボタンとなります。
フォーム名、モジュール名はこのままでも構わないのですが、上図の緑枠部分を変更することでモジュール名を変更することができます。
ここでは、次のように名称を変更しておきます。
変更前 | 変更後 | 区分 |
---|---|---|
UserForm1 | ConvForm | フォーム(クラスモジュール) |
UserForm2 | ProgressForm | フォーム(クラスモジュール) |
Module1 | ConvNumModule | 標準モジュール |
2つのフォーム(ConvForm、ProgressForm)には、フォーム操作に関係あるコードのみ記載します。
メインとなるコードは、標準モジュール(ConvNumModule)の方に書いていきます。
では、早速、標準モジュールに次のコードを記載します。
'フォームを開く
Sub OpenForm()
ConvForm.Show vbModeless
End Sub
以上のコードで、フォームを開くことができます。
単純に、フォーム名.Show
(ConvForm.Show)だけでも、フォームを開くことができます。
しかし、そのままでは「モーダル表示」となり、フォームを開いている間は他の操作ができなくなってしまいますので、末尾にvbModeless
と記載して、フォーム表示中も文書の編集ができる「モードレス表示」で開くようにします。
詳しくは、公式ドキュメントのShowメソッドを参照してください。
それでは、コードを記載した部分(下図の赤枠部分)のどこかにカーソルを置いて、青丸部分の実行ボタンを押してみてください。
次のようにフォームが表示されれば成功です。
なお、普通に「開発」メニューの「マクロ」から次の画面を開いて「OpenForm」を実行しても結果は同じです。
2. メインフォームの作成(クラスモジュール)
ここでは、ユーザーが操作を行うための次のようなフォームを作成していきます。
2-1. フォーム画面の編集
それでは、フォームの画面を作っていきます。
図の青枠の「ConvForm」をダブルクリックするとフォームの編集画面が表示されます。
そして、プロパティのCaptionにある「UserForm1」を「数字変換ツール」と書き換えてください。すると、フォームのバーのところに「数字変換ツール」と表示されます。タイトルなので別の名前でも構いません。
作成にあたって、画面下の方にある「イミディエイトウィンドウ」と「ツールボックス」(緑枠で囲んだ2つ)を使いますので、これが表示されていない場合は、メニューの「表示」から、この2つのウィンドウを表示させておいてください(ツールボックスはフォームを選択している時にのみ表示されますのでご注意ください。)。
2-1-1. ボタンの作成
次に、ツールボックスの赤枠部分にある「コマンドボタン」をクリックして、フォームの左上あたりをクリックしてください。
そうするとボタンが作成されます(図の青枠部分)。
続いて、プロパティウィンドウのオブジェクト名を「HighlightNumBtn」に、Captionを「数字部分の自動マーキング」と変更してください(赤枠部分)。
そして、青枠部分のボタンの幅を適当に広げて、文字全体が表示されるようにしてください。
なお、ボタンの大きさは、プロパティウィンドウの項目別タブから数値で指定することもできます(青枠部分)。
言うまでもないかもしれませんが、各数値の意味は次のとおりです。
項目 | 内容 |
---|---|
Height | ボタンの高さ |
Left | ボタンの水平位置 |
Top | ボタンの垂直位置 |
Width | ボタンの横幅 |
同様に、ボタンを更に2つ作成します。
作成するボタンの各項目は、次のように設定してください(HeightとWidthは目安ですのでご参考までに)。
オブジェクト名 | Caption | Height | Width |
---|---|---|---|
CrearHighlightBtn | マーキング全てをクリア | 18 | 180 |
CrearHighlightOnSelectionBtn | 選択部分のマーキングをクリア | 18 | 180 |
2-1-2. フレームの作成
見た目を整えるために、フレームを使用してみます。
これは、特に作らなくても動作には一切影響しませんので、不要な方は飛ばしてください。
最初に、フォームを縦長に大きくしておきます。
適当で良いのですが、私の手元では、Height=342、Width=240としています。
そして、ツールボックスの「フレーム」(赤枠部分)を選択して、作成済みの3つのコマンドボタンの下あたりをクリックしてフレームを作成します。
そして、作成済みの3つのボタンを、作成したフレームの上に、ドラッグ&ドロップ(または切り取って貼り付け)で乗せていきます。
これで、フレームとコマンドボタンが一体化されるので、フレームを動かせばコマンドボタンも一緒に動くようになります。
フレームの位置、大きさを次のように調整して、プロパティウィンドウのCaptionを「数字マーキング」としてください。
参考までに、私の手元では次のように、フレームの高さは108、幅は204となっています。
2-1-3. ラベルの作成
次にラベルの作成ですが、これも、見た目を整えるためのもので、プログラムの動作には関係しません。
ツールボックスの「ラベル」(赤枠部分)を選択して、フォームの上の方(青枠部分)をクリックしてラベルを作成します。
プロパティウィンドウは、緑枠のところ、Captionを「数字部分をマーキングした上で変換を実行してください」と記載して、TextAlignは「2 - fmTextAlignCenter」を選択します。
ラベルの位置・大きさは適当で構いませんが、私の手元では次のようになっています。
2-1-4. 追加のコントロールを作成
続いて、今までと同様の方法で、赤枠部分のように、フレーム、ラベル、コマンドボタンを作成します。
作成順に決まりはありませんが、先にフレームを作成して、その上に、ラベル、コマンドボタンを置いていく方が作りやすいと思います。
各コントロールの設定は、次のとおりです。
<フレーム>
オブジェクト名 | Caption | Height | Left | Top | Width |
---|---|---|---|---|---|
(変更不要) | 漢数字または算用数字変換 | 126 | 12 | 168 | 204 |
<ラベル>
オブジェクト名 | Caption | TextAlign | Height | Left | Top | Width |
---|---|---|---|---|---|---|
(変更不要) | 数字変換の種類を選択してください | 1-fmTextAlignLeft | 12 | 12 | 12 | 180 |
SelectLabel | 表記例: | 1-fmTextAlignLeft | 12 | 12 | 36 | 180 |
※TextAlignは初期設定のままとなります(左寄せ)。
※2つ目のラベルはプログラムで操作しますので、オブジェクト名をSelectLabel
としておく必要があります。
<コマンドボタン>
オブジェクト名 | Caption | Height | Left | Top | Width |
---|---|---|---|---|---|
ConvKan2NumBtn | マーキング部分の数字変換を実行 | 24 | 12 | 84 | 180 |
2-1-5. コンボボックスの作成
さて、次はコンボボックスの作成です。
ツールボックスの「コンボボックス」(赤枠部分)を選択して、フォーム中の青枠部分のようにコンボボックスを作成します。
プロパティウィンドウは、緑枠の「オブジェクト名」を「SelectCmb」と記載します。
位置や大きさは適当で構いませんが、私の手元では次のようになってます。
2-1-6. フォームの表示とタブ順の調整
では、フォームが出来上がっているか確認してみます。
冒頭でConvNumModule(標準モジュール)に作成したフォームを開くためのプロシージャSub OpenForm
を実行してフォームを開きます。
まだ、コードを記述していないので、ボタンを押しても反応はありませんし、コンボボックスの右側の矢印ボタンを押しても何も表示されません。
Tab
キーを押すと、4つのボタンと1つのコンボボックスにつき、コントロールを作成した順にフォーカスが移っていくと思います。
これを上から順に移行させるためには、各コントロールのプロパティにある項目TabIndex
(下図赤枠部分)の数値を変更してTabキーの順序を変更します。
自分で数値を打ち込みながら、上手く順番に並ぶように調整してみてください。
タブ順は、プログラムの実行には関係しませんので、こだわりがなければ順序を修正しなくとも大丈夫です。
2-2. フォームのソースコード作成
2-2-1.【参考】メインフォームのソースコード(完成形)
とりあえず、コピペしたいという方もいると思いますので、先に完成後のメインフォームのソースコードを貼っておきます。
次の項から、1つずつ取り上げて説明していきます。
Option Explicit
Private Sub UserForm_Initialize()
SelectCmb.AddItem "算用数字"
SelectCmb.AddItem "漢数字1(十百千を含む)"
SelectCmb.AddItem "漢数字2(十百千を含まない)"
SelectCmb.AddItem "数字・漢字混合"
SelectCmb.ListIndex = 0
End Sub
Private Sub HighlightNumBtn_Click()
Call HighlightNum
End Sub
Private Sub CrearHighlightBtn_Click()
Call CrearHighlight
End Sub
Private Sub CrearHighlightOnSelectionBtn_Click()
Call CrearHighlightOnSelection
End Sub
Private Sub SelectCmb_Change()
Select Case SelectCmb.ListIndex
Case 0
SelectLabel.Caption = "表記例:538,000,000"
Case 1
SelectLabel.Caption = "表記例:五億三千八百万"
Case 2
SelectLabel.Caption = "表記例:五億三八〇〇万"
Case 3
SelectLabel.Caption = "表記例:5億3800万"
Case Else
SelectLabel.Caption = ""
End Select
End Sub
Private Sub ConvKan2NumBtn_Click()
Call ConvNum(SelectCmb.ListIndex)
End Sub
2-2-2. コマンドボタンのソースコード
作成したコマンドボタンをクリックすることで、処理が走るように(イベントが発火するように)設定していきます。
VBA画面のフォーム中の一番上のボタン(赤枠部分)をダブルクリックしてください。
そうすると、次のように自動でコードが作成されます。
プロシージャの名称部分の前半HighlightNumBtn
はコントローラー名(コマンドボタンのオブジェクト名)であり、後半のClick
は処理内容を表しています。
ボタンがクリックされると、このPrivate Sub HighlightNumBtn_Click
というプロシージャに記載されている処理が実行されることになります。
なお、これ以外のプロシージャ(Private Sub UserForm_Click
など)が勝手に作成されている場合もあると思います。
そのような不要なプロシージャは消してしまって問題ありません。
具体的な処理内容は、後でコードを作成しますので、ここでは、次のようなテストコードを書いておきます。
Private Sub HighlightNumBtn_Click()
Debug.Print "ボタンがクリックされました"
End Sub
Debug.Print [値]
と記述することで、イミディエイトウィンドウに[値]
を表示することができます。
それでは、もう一度、ConvNumModule(標準モジュール)からSub OpenForm
を実行してフォームを開いて、最初のボタン「数字部分の自動マーキング」を押してみてください。
イミディエイトウィンドウに「ボタンがクリックされました」と表示されていれば成功です。
2-2-3. コンボボックスのソースコード
2-2-3-1. リストの初期化
現在のコンボボックスは、枠だけ設定している状態で、中身のリストは設定されていません。
コンボボックスの初期値として、4つの選択肢を設定するコードを書くと次のようになります。
(Withステートメントを使えばもう少しコードがすっきりしますが、分かりやすさ重視のため、ここでは使用しません。)
'コンボボックスに初期値を設定する
Private Sub UserForm_Initialize()
SelectCmb.AddItem "算用数字"
SelectCmb.AddItem "漢数字1(十百千を含む)"
SelectCmb.AddItem "漢数字2(十百千を含まない)"
SelectCmb.AddItem "数字・漢字混合"
SelectCmb.ListIndex = 0
End Sub
プロシージャ名のUserForm_Initialize
は、このフォーム(ここではConvForm)の、初期化(initialize)を行うという意味になります。
このプロシージャの処理は、フォームが表示されるまでの間に実行されます(詳しくは「Initializeイベント」を参照)。
そして、コンボボックスのリストの中身は、[コンボボックス名].AddItem [リスト項目]
という構文で追加していくことができます。
コンボボックスの名称(オブジェクト名)をSelectCmb
としていましたので、SelectCmb.AddItem "算用数字"
という振り合いで書けば、"算用数字"
というリストが追加されることになります。
また、リストの項目を追加する度に、0, 1, 2, 3 ... の順で、自動的にインデックスが振られていきます。
上のコードの場合、"数字・漢字混合"
というリスト項目には、インデックス番号として3
が振られることになります。
インデックス番号は[コンボボックス名].ListIndex
という構文で取得できます。
最後の行のSelectCmb.ListIndex = 0
は、フォームを開いた際には、インデックス0
のリスト項目("算用数字"
)を表示するように指定しているものです。
フォームを立ち上げると、次のようにリストボックスの選択ができるようになっていることが分かると思います。
なお、Private Sub UserForm_Initialize()
というコードは、ベタ打ちしても構いませんが、次の方法で簡単に作成することができます。
下の図の赤枠部分の右側のボタンをクリックすると、関係するコントローラーやオブジェクトの一覧が表示されますので、UserFormを選択します。
次に、下図の赤枠部分の右側のボタンをクリックすると、作成することができるイベントの一覧が表示されますので、Initialize
を選択します。
すると、下図の赤枠部分に、上記コードと同じPrivate Sub UserForm_Initialize()
プロシージャが作成されますので、この中に必要な処理を書けば良いということになります。
なお、緑枠の部分のコードも勝手に生成されてしまうので、これは削除してください。
これを使えば、clickイベントでもchangeイベント(次項で使用します)でも、コードの自動生成が可能です。
2-2-3-2. リスト選択に連動する処理
コンボボックスのすぐ上に、表記例:
というラベルがあります。
このラベルを、コンボボックスの選択した内容によって変化させるようにします。
コードは、次のようになります。
'コンボボックスの選択により表示するラベルを変更する
Private Sub SelectCmb_Change()
Select Case SelectCmb.ListIndex
Case 0
SelectLabel.Caption = "表記例:538,000,000"
Case 1
SelectLabel.Caption = "表記例:五億三千八百万"
Case 2
SelectLabel.Caption = "表記例:五億三八〇〇万"
Case 3
SelectLabel.Caption = "表記例:5億3800万"
Case Else
SelectLabel.Caption = ""
End Select
End Sub
プロシージャ名SelectCmb_Change
の前半は、コンボボックスの名称(オブジェクト名)です。後半のchange
はイベント名です。
これは、コンボボックスの選択が変わる度に実行されるプロシージャとなります(詳しくは「Changeイベント」を参照してください)。
コードはベタ打ちしても構いませんが、VBA画面に表示されているフォームのコンボボックスをダブルクリックすると、空のプロシージャが自動で生成されますので試してみてください。
Select Case文でケース分けする値には、コンボボックスのインデックス(先ほど説明したSelectCmb.ListIndex
)を使用しています。
インデックス番号ごとにラベル(ラベル名:SelectLabel
)に表示する文言を指定するだけの単純なコードです。
なお、ラベルの文言は、[ラベル名].Caption
という形で呼び出して、値の取得・変更をすることができます。
フォームを立ち上げてコンボボックスを操作すると、選択が変わる度に表記例:
のラベル表示が変化することが分かると思います。
以上、フォーム(クラスモジュール)のソースコードの基本的なところを記載していきました。
現時点では、次のようなソースコードになっていると思います。
フォームのソースコード作成については、一旦ここまでにします。
残りは、標準モジュールで必要なプロシージャを作成後に、追加していきます。
3. プログレスバーの作成(クラスモジュール)
ここでは、もう一つのフォームProgressForm
を使ってプログレスバーを作成していきます。
3-1. プログレスバーを使用する前準備
まず、プロパティのCaption
(赤枠部分)を「処理中」と変更してください(別の言葉でも構いません)。
次に、ツールボックスにプログレスバーのアイコンを表示させます(デフォルトではプログレスバーのアイコンはありません)。
ツールボックスの青枠部分を右クリックするとメニューが表示されますので、「その他のコントロール」を選択してください。
次のような「コントロールの追加」のウィンドウが表示されますので、「利用可能なコントロール」の中から、「Microsoft ProgressBar Control, version ...」を探してチェックを入れてOKボタンを押します。
するとツールボックスの右下にプログレスバーのアイコンが表示されます。
3-2. プログレスバーの作成
ツールボックスの赤枠部分にある「プログレスバー」をクリックして、青枠部分のような形でプログレスバーを作成します。
緑枠部分のプログレスバーのオブジェクト名は、デフォルトの「ProgressBar1」から「Bar1」に変更しておきます。
あわせて、フォームの高さも小さく調整しておきます(私の手元ではHeight=80です)。
以上で、ProgressForm
の編集は終わりです。ソースコードは、標準モジュール(ConvNumModule
)の方に書きますので、このフォーム(クラスモジュール)ではソースコードの記述は不要です。
4. 標準モジュールのソースコード作成
標準モジュールのコード内容の説明は、多少割愛しつつ、ツール作成に関係あるところを中心に記しておきます。
4-1. 【参考】標準モジュールのソースコード(完成形)
これも、先に最終形のソースコードを貼っておきます。コードは約200行です。
後から、1つずつ概要を説明していきます。
Option Explicit
Const numChr = "〇一二三四五六七八九十百千万億兆01234567890123456789,"
'フォームを開く
Sub OpenForm()
ConvForm.Show vbModeless
End Sub
'数字部分のマーキング処理をするプロシージャ
Sub HighlightNum()
'確認メッセージを表示
Dim ans As Long
ans = MsgBox("文書中の数字部分を一括してマーキングします" & vbCrLf & "このまま処理を続行しますか?", vbYesNo + vbQuestion, "確認メッセージ")
If ans = vbNo Then Exit Sub
ProgressForm.Show vbModeless 'プログレスバーを表示
With ActiveDocument
Dim i As Long: i = 0 '指定しなくとも初期値は0となる
Do While i < .Content.End
If InStr(numChr, .Range(i, i + 1).text) > 0 Then
.Range(i, i + 1).HighlightColorIndex = wdYellow
End If
i = i + 1
ProgressForm.Bar1.Value = (i / .Content.End) * 100 'プログレスバーの数値変更
Loop
End With
Call ClearHighlightOnField '計算フィールドのマーキングを解除する
Unload ProgressForm 'プログレスバーを非表示
End Sub
'計算フィールドのマーキングを解除するプロシージャ
Sub ClearHighlightOnField()
Dim fld As Field
Dim rng As Range: Set rng = Selection.Range '選択範囲(Range)の初期状態を記録
For Each fld In ActiveDocument.Fields
fld.Select 'Rangeプロパティを持たないため範囲選択(Select)を行う
Selection.Range.HighlightColorIndex = wdNoHighlight 'SelectionオブジェクトのRengeプロパティから領域を取得する
Next
rng.Select: Set rng = Nothing '選択範囲(Range)を初期状態に戻す
End Sub
'全マーキングを解除するプロシージャ
Sub CrearHighlight()
'確認メッセージを表示
Dim ans As Long
ans = MsgBox("文書中の全てのマーキングをクリアしてよいですか?", vbYesNo + vbQuestion, "確認メッセージ")
If ans = vbNo Then Exit Sub
ActiveDocument.Content.HighlightColorIndex = wdNoHighlight '文書全体のマーキングをクリア
End Sub
'選択部分のマーキングを解除するプロシージャ
Sub CrearHighlightOnSelection()
Selection.Range.HighlightColorIndex = wdNoHighlight
End Sub
'文書中のマーキングされた数字を変換するプロシージャ
Sub ConvNum(Optional typ As Long = 0)
'確認メッセージを表示
Dim ans As Long
ans = MsgBox("マーキングされている数字の変換を実行します" & vbCrLf & "このまま処理を続行しますか?", vbYesNo + vbQuestion, "確認メッセージ")
If ans = vbNo Then Exit Sub
Dim i As Long
Dim s As Long '数字部分のスタート位置を記録する変数
Dim rng As Range
Dim numFlg As Boolean: numFlg = False '数字の場合にTrueとするフラグ
ProgressForm.Show vbModeless 'プログレスバーを表示
With ActiveDocument 'ActiveDocumentの記述を省略するステートメント
Do While i < .Content.End
If InStr(numChr, .Range(i, i + 1).text) > 0 Then '文字が数字であるか否かの判定
If numFlg = False Then
s = i '数字が出現したスタート位置を記録
numFlg = True '数字部分に入ったためTrueに変更
End If
Else
If numFlg = True Then 'numFlgがTrueであれば直前までが数字であったということ
Set rng = .Range(s, i) '数字部分のRangeを変数rngに設定
If rng.HighlightColorIndex <> wdNoHighlight Then
If typ = 0 Then
rng.text = Format(ConvKan2Num(Replace(rng.text, ",", "")), "###,###") 'ConvKan2Num関数を使って漢数字を算用数字に変換
Else
rng.text = ConvNum2Kan(ConvKan2Num(Replace(rng.text, ",", "")), typ) 'ConvNum2Kan関数を使って算用数字を漢数字に変換
End If
If .TrackRevisions Then '変更履歴機能がオンかオフか
i = i + Len(rng.text) '変換後の数字の末尾にiを再設定(文字数が変わるため)
Else
i = s + Len(rng.text) '変換後の数字の末尾にiを再設定(文字数が変わるため)
End If
End If
numFlg = False
End If
End If
i = i + 1
ProgressForm.Bar1.Value = (i / .Content.End) * 100 'プログレスバーの数値変更
Loop
End With
Unload ProgressForm 'プログレスバーを非表示
Set rng = Nothing 'オブジェクトの解放
End Sub
'漢数字(二三五四一)を数値(23541)に変換する関数
Function ReplKan2Num(text As String) As Double
Dim chinNums As Variant: chinNums = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
Dim arabNums As Variant: arabNums = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
Dim i As Long
For i = 0 To UBound(chinNums)
text = Replace(text, chinNums(i), arabNums(i))
Next i
ReplKan2Num = Val(StrConv(text, vbNarrow)) 'vbNarrowは入力文字列が"23541"という全角数字の場合に対応させるため
End Function
'数値(23541)を漢数字(二三五四一)に単純変換する関数
Function ReplNum2Kan(num As Double) As String
ReplNum2Kan = num
Dim chinNums As Variant: chinNums = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
Dim arabNums As Variant: arabNums = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
Dim i As Long
For i = 0 To UBound(chinNums)
ReplNum2Kan = Replace(ReplNum2Kan, arabNums(i), chinNums(i))
Next i
End Function
'15桁までの漢数字を数値変換する関数
Function ConvKan2Num(text As String, Optional digit As Long = 4) As Double
Dim i As Long, pos As Long, posStart As Long: posStart = 1
Dim partialValue As Double
Dim largeNums As Variant: largeNums = IIf(digit = 4, Array("", "万", "億", "兆"), Array("", "十", "百", "千")) '大数の指定
For i = UBound(largeNums) To 0 Step -1
If i = 0 Then
pos = IIf(posStart = Len(text) + 1, 0, Len(text) + 1)
Else
pos = InStr(text, largeNums(i))
End If
If pos <> 0 Then '目的の大数が無い場合は加算しない
If pos = posStart Then '目的の大数が数字を持たない場合(ex. "二千百四十"における百の位)
partialValue = 1
Else
If digit = 4 Then
partialValue = ConvKan2Num(Mid(text, posStart, pos - posStart), 1) '再帰処理
Else
partialValue = ReplKan2Num(Mid(text, posStart, pos - posStart))
End If
End If
ConvKan2Num = ConvKan2Num + partialValue * 10 ^ (digit * (i))
posStart = pos + 1
End If
Next i
End Function
'4桁までの数値(2056)を漢数字(二千五十六)に変換
Function ConvNum2Kan4(ByVal num As Long) As String
Dim i As Long
Dim largeNums As Variant: largeNums = Array("", "十", "百", "千")
Dim chinNums As Variant: chinNums = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
Dim quo As Long 'quotient(商)
If num < 0 Then num = -num 'エラー回避(マイナス数字はプラスにしておく)
num = num Mod 10000 'エラー回避(5桁以上の場合は下4桁のみ対象とする)
For i = UBound(largeNums) To 0 Step -1
quo = num \ 10 ^ i
num = num Mod 10 ^ i
If quo = 0 Then
ConvNum2Kan4 = ConvNum2Kan4 & ""
ElseIf i <> 0 And quo = 1 Then
ConvNum2Kan4 = ConvNum2Kan4 & largeNums(i)
Else
ConvNum2Kan4 = ConvNum2Kan4 & chinNums(quo) & largeNums(i)
End If
Next i
If ConvNum2Kan4 = "" Then ConvNum2Kan4 = "〇"
End Function
'15桁までの数値を漢数字などに変換
Function ConvNum2Kan(num As Double, Optional typ As Long = 1) As String
Dim numStr As String: numStr = num
Dim largeNums As Variant: largeNums = Array("", "万", "億", "兆")
Dim i As Long, tmpNum As Long
ConvNum2Kan = "" '初期値(無くとも良いが明示する)
For i = 0 To UBound(largeNums)
tmpNum = Val(Right(numStr, 4))
If tmpNum > 0 Then
Select Case typ
Case 2 '四五万八九〇〇
ConvNum2Kan = ReplNum2Kan(CDbl(tmpNum)) & largeNums(i) & ConvNum2Kan
Case 3 '45万8900
ConvNum2Kan = tmpNum & largeNums(i) & ConvNum2Kan
Case Else '四十五万八千九百
ConvNum2Kan = ConvNum2Kan4(tmpNum) & largeNums(i) & ConvNum2Kan
End Select
End If
If Len(numStr) > 4 Then
numStr = Left(numStr, Len(numStr) - 4)
Else
Exit For
End If
Next i
If ConvNum2Kan = "" Then ConvNum2Kan = "〇"
End Function
以上が全てのコードとなります。
4-2. マーキング処理
それでは、マーキング処理から見ていきます。
マーキング処理を行ってるのは、次の4つのプロシージャとなります。
プロシージャ名 | 処理の内容 | 他のプロシージャとの関係 |
---|---|---|
HighlightNum | 数字部分のマーキング処理 | ClearHighlightOnFieldを使用 |
ClearHighlightOnField | 計算フィールドのマーキング解除 | HighlightNumの中で使用される |
CrearHighlight | 文書中の全てのマーキング解除 | |
CrearHighlightOnSelection | 選択部分のマーキング解除 |
※「他のプロシージャとの関係」の項は、つまり、HighlightNumプロシージャはその処理の中で、ClearHighlightOnFieldプロシージャを呼び出すということを意味しています。
4-2-1. 数字部分のマーキング処理(HighlightNum
プロシージャ)
4-2-1-1. 数字部分のマーキング
HighlightNum
プロシージャは、細かい設定を入れていて見にくいですが、単に数字部分をマーキングするだけであれば、次のようにシンプルに記述することができます。
Const numChr = "〇一二三四五六七八九十百千万億兆01234567890123456789" '漢数字のみの判定であれば後半の算用数字は不要
Sub HighlightTest()
Dim i As Long: i = 0 '指定しなくとも初期値は0となる
Do While i < ActiveDocument.Content.End
If InStr(numChr, ActiveDocument.Range(i, i + 1).Text) > 0 Then
ActiveDocument.Range(i, i + 1).HighlightColorIndex = wdYellow
End If
i = i + 1
Loop
End Sub
冒頭の定数Const numChr
は、どの文字を数字として拾うかについて定義しています。
文書の先頭から1文字ずつループさせて(Do While i < ActiveDocument.Content.End
のところ)、InStr関数
で数字か否かを判定して数字であればマーキングをしています。
詳細は「WORD文書の範囲を指定して操作する 」という記事に書いていますので、そちらをご参照ください。
4-2-1-2. 確認メッセージ
HighlightNum
プロシージャの冒頭の3行は、確認メッセージです。
'確認メッセージを表示
Dim ans As Long
ans = MsgBox("文書中の数字部分を一括してマーキングします" & vbCrLf & "このまま処理を続行しますか?", vbYesNo + vbQuestion, "確認メッセージ")
If ans = vbNo Then Exit Sub
メッセージボックスを表示して処理を続行するかを確認しているだけです。
これは無くともプログラムは正常に実行されるので、省略しても構いません。
4-2-1-3. プログレスバーの表示
HighlightNum
プロシージャのうち、プログレスバーを制御している部分を抜き出すと、おおよそ次のようになります(若干加工しています)。
ProgressForm.Show vbModeless'プログレスバーを表示
Dim i As Long: i = 0
Do While i < ActiveDocument.Content.End
i = i + 1
ProgressForm.Bar1.Value = (i / ActiveDocument.Content.End) * 100 'プログレスバーの数値変更
Loop
Unload ProgressForm 'プログレスバーを非表示
標準モジュールからフォーム(クラスモジュール)の操作をする場合は、最初にフォーム名(クラス名)を記述してから、その後に続けて、使用したいメソッド、プロパティ、オブジェクトを記述します。
具体的にみると、1行目は、ProgressForm
というクラス(フォーム)について、Showメソッド
を用いてフォームを表示するという処理を行っています。これにより、プログレスバーが表示されます。
また、最後の行は、Unloadステートメントを使用して、フォームを閉じる処理をしています(処理上はフォームが削除されています)。
5行目のProgressForm.Bar1.Value
は、ProgressForm
クラスのBar1
オブジェクト(つまりプログレスバーの部分)を呼び出して、.Value
でその値を表しています。
これに、[現在の文字位置]/[全体の文字数]*100
、つまり「処理進捗のパーセント」を代入しているということになります。
なお、デフォルトでは、プログレスバーの最小値は0
、最大値は100
となっていますが、この値を変更することも可能です。
色々なサイトで解説されていますので、興味があれば調べてみてください。
4-2-2. 計算フィールドのマーキング解除(ClearHighlightOnField
プロシージャ)
単純に数字かどうかを判定してマーキングを実行すると、WORD文章に「ふりがな」がある場合に、その文字を数字と読み取ってしまいます。
例えば、次のような文書の場合、ふりがなが付いている「懲役」のところは計算フィールド
というものになっています。
上記文書の「懲役」の文字を選択して右クリックをすると「フィールドコードの表示/非表示」というメニューが出ますのでそれを選択すると、次のように表示されます。
つまり、ルビをふるために、EQ \* jc2 \* "Font:MS ゴシック" \* hps10 \o\ad(\s\up 9(ちょうえき),懲役)
というコードが埋め込まれており、そのコードの中に数字を持ってしまっているため、数字であると判定されてしまうことになります。
このマーキングを解除するために、次のClearHighlightOnField
プロシージャを用意してます。
'計算フィールドのマーキング解除
Sub ClearHighlightOnField()
Dim fld As Field
Dim rng As Range: Set rng = Selection.Range '選択範囲(Range)の初期状態を記録
For Each fld In ActiveDocument.Fields
fld.Select 'Rangeプロパティを持たないため範囲選択(Select)を行う
Selection.Range.HighlightColorIndex = wdNoHighlight 'SelectionオブジェクトのRengeプロパティから領域を取得する
Next
rng.Select: Set rng = Nothing '選択範囲(Range)を初期状態に戻す
End Sub
コードの細かい説明はしませんが、ActiveDocument.Fields
の一文で文章中の全ての計算フィールドを取得して、For Eachステートメントにより、それらのハイライト全てを解除する処理をしています。
このプロシージャを、HighlightNum
プロシージャの最後の方で呼び出して、ふりがな部分(計算フィールド部分)のマーキングを全て解除しているということになります。
4-2-3. 文章中全てのマーキング解除(CrearHighlight
プロシージャ)
文章中のマーキングを全て解除するプロシージャです。
'全マーキング解除
Sub CrearHighlight()
'確認メッセージを表示
Dim ans As Long
ans = MsgBox("文書中の全てのマーキングをクリアしてよいですか?", vbYesNo + vbQuestion, "確認メッセージ")
If ans = vbNo Then Exit Sub
ActiveDocument.Content.HighlightColorIndex = wdNoHighlight '文書全体のマーキングをクリア
End Sub
最初の3行は確認メッセージですので、実際に解除を行っているのは最後の1行のみとなります。
ActiveDocument.Content.HighlightColorIndex = wdNoHighlight
この意味は、現在アクティブな文書(ActiveDocumentオブジェクト)の全文(Contentプロパティ)のマーキング処理(HighlightColorIndexプロパティ)を無し(wdNoHighlight)とする、ということになります。
4-2-4. 選択部分のマーキング解除(CrearHighlightOnSelection
プロシージャ)
カーソルで選択している範囲のみ、マーキングを解除するプロシージャです。
'選択部分マーキング解除
Sub CrearHighlightOnSelection()
Selection.Range.HighlightColorIndex = wdNoHighlight
End Sub
コードの意味は、現在の選択範囲(Selectionオブジェクト)の領域(Rangeプロパティ)のマーキング処理(HighlightColorIndexプロパティ)を無し(wdNoHighlight)とする、ということになります。
4-3. 数字変換処理
次に、数字変換処理を見ていきます。
数字変換処理を行ってるのは、次の6つのプロシージャとなります。
プロシージャ名 | 処理の内容 | 他のプロシージャとの関係 |
---|---|---|
ConvNum | マーキングされた数字の変換処理 | 以下の5つの関数(ReplKan2Num~ConvNum2Kan)全てを使用 |
ReplKan2Num | 漢数字(二三五四一)を数値(23541)に変換 | (単独で処理可能) |
ReplNum2Kan | 数値(23541)を漢数字(二三五四一)に単純変換 | (単独で処理可能) |
ConvKan2Num | 15桁までの漢数字を数値変換 | ReplKan2Numを使用 |
ConvNum2Kan4 | 4桁までの数値(2056)を漢数字(二千五十六)に変換 | (単独で処理可能) |
ConvNum2Kan | 15桁までの数値を漢数字などに変換 | ReplNum2Kan、ConvNum2Kan4を使用 |
4-3-1. マーキングされた数字の変換処理(ConvNum
プロシージャ)
ConvNum
プロシージャの完成形については「4-1. 【参考】標準モジュールのソースコード(完成形)」に記載してあるとおりです。
ここでは、プロシージャの中から個別に機能を抜粋して、コードの内容をみていきます。
4-3-1-1. 数字の変換処理
ConvNum
プロシージャのうち、数字に変換する部分のみを抜粋して記述すると次のようになります。
複雑にならないように、漢数字のみに変換するコードにしています。
Sub ConvNumTest()
Dim i As Long
Dim s As Long '数字部分のスタート位置を記録する変数
Dim rng As Range
Dim numFlg As Boolean: numFlg = False '数字の場合にTrueとするフラグ
Do While i < ActiveDocument.Content.End
If InStr(numChr, ActiveDocument.Range(i, i + 1).text) > 0 Then '文字が数字であるか否かの判定
If numFlg = False Then
s = i '数字が出現したスタート位置を記録
numFlg = True '数字部分に入ったためTrueに変更
End If
Else
If numFlg = True Then 'numFlgがTrueであれば直前までが数字であったということ
Set rng = ActiveDocument.Range(s, i) '数字部分のRangeを変数rngに設定
rng.text = ConvKan2Num(rng.text) 'ConvKan2Num関数を使って漢数字を算用数字に変換
i = s + Len(rng.text) '変換後の数字の末尾にiを再設定(文字数が変わるため)
numFlg = False
End If
End If
i = i + 1
Loop
End Sub
このプロシージャを実行するには、算用数字を漢数字に変換するConvKan2Num
関数及びReplNum2Kan
関数が必要となります。
マーキング処理をする場合は1文字ずつ処理することで足りましたが、数字を漢数字に変換する場合は、数字部分を1つの範囲(Range)として取り出して変換する必要があります。
例えば、手数料は10500円
という文字列があった場合は、10500
の5文字を取り出して一万五百
というように変換することになります。
ここでは、数字部分の開始位置を変数s
に入れて、終了位置を変数i
として、Rangeメソッドを使用してこの範囲の数字部分の領域を取得した上で、算用数字への変換処理を行っています。
このコードを基本として、必要な処理を追加していきます。
追加するのは「マーキング部分のみを変換すること」及び「変換候補として算用数字、漢数字の両方を指定できること」の2つです。
これを実現するためには、上記コードの13行目から18行目まで(If numFlg = True Then
からEnd If
まで)の部分を次のように変更することになります。
If numFlg = True Then 'numFlgがTrueであれば直前までが数字であったということ
Set rng = .Range(s, i) '数字部分のRangeを変数rngに設定
If rng.HighlightColorIndex <> wdNoHighlight Then
If typ = 0 Then
rng.text = Format(ConvKan2Num(Replace(rng.text, ",", "")), "###,###") 'ConvKan2Num関数を使って漢数字を算用数字に変換
Else
rng.text = ConvNum2Kan(ConvKan2Num(Replace(rng.text, ",", "")), typ) 'ConvNum2Kan関数を使って算用数字を漢数字に変換
End If
If .TrackRevisions Then '変更履歴機能がオンかオフか
i = i + Len(rng.text) '変換後の数字の末尾にiを再設定(文字数が変わるため)
Else
i = s + Len(rng.text) '変換後の数字の末尾にiを再設定(文字数が変わるため)
End If
End If
numFlg = False
End If
マーキング部分のみ変換するように制御しているのは、3行目にある次のIf文です。
If rng.HighlightColorIndex <> wdNoHighlight Then
変換候補を漢数字と算用数字で選択できるようにしているのは、4行目から8行目まで(If typ = 0 Then
からEnd If
まで)のところです。
なお、「変更履歴機能」をオンにしていると、削除された文字もデータ上に残ってしまうため、変数i
の進め方を変える必要があります。
これを制御しているのが、9行目から13行目まで(If .TrackRevisions Then
からEnd If
まで)のところです。
変更履歴のオンオフは、このIf文の条件となっているDocument.TrackRevisionsプロパティで取得・操作をすることが可能です。
4-3-1-2. 確認メッセージ
ConvNum
プロシージャの冒頭の3行は、ただの確認メッセージです。
'確認メッセージを表示
Dim ans As Long
ans = MsgBox("マーキングされている数字の変換を実行します" & vbCrLf & "このまま処理を続行しますか?", vbYesNo + vbQuestion, "確認メッセージ")
If ans = vbNo Then Exit Sub
これが無くともプログラムは正常に実行されるので、省略しても構いません。
4-3-1-3. プログレスバーの表示
ConvNum
プロシージャのうち、プログレスバーを制御している部分を抜き出すと、おおよそ次のようになります。
ProgressForm.Show vbModeless'プログレスバーを表示
Dim i As Long: i = 0
Do While i < ActiveDocument.Content.End
i = i + 1
ProgressForm.Bar1.Value = (i / ActiveDocument.Content.End) * 100 'プログレスバーの数値変更
Loop
Unload ProgressForm 'プログレスバーを非表示
この内容は、先に「4-2-1-3」で説明したとおりです。
4-3-2. 漢数字(二三五四一)を数値(23541)に変換(ReplKan2Num
プロシージャ)
これは単純にReplace関数を使って、一~九
を1~9
に変換しているだけです。
もっとシンプルで適切な書き方があるかもしれませんが、私の知識で書くとこのようになります。
Function ReplKan2Num(text As String) As Double
Dim chinNums As Variant: chinNums = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
Dim arabNums As Variant: arabNums = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
Dim i As Long
For i = 0 To UBound(chinNums)
text = Replace(text, chinNums(i), arabNums(i))
Next i
ReplKan2Num = Val(StrConv(text, vbNarrow)) 'vbNarrowは入力文字列が"23541"という全角数字の場合に対応させるため
End Function
4-3-3. 数値(23541)を漢数字(二三五四一)に単純変換(ReplNum2Kan
プロシージャ)
これも上記と同様に、単純にReplace関数を使って、1~9
を一~九
に変換しているだけです。
Function ReplNum2Kan(num As Double) As String
ReplNum2Kan = num
Dim chinNums As Variant: chinNums = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
Dim arabNums As Variant: arabNums = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
Dim i As Long
For i = 0 To UBound(chinNums)
ReplNum2Kan = Replace(ReplNum2Kan, arabNums(i), chinNums(i))
Next i
End Function
4-3-4. 15桁までの漢数字を数値変換(ConvKan2Num
プロシージャ)
漢数字を数字変換するコードは、WEB上で様々に掲載されていると思います。
どういうアルゴリズムを使うかで、書き方は人によりけりです。
下記のコードで使用しているアルゴリズムは、過去の記事「JavaScriptで文字列中の漢数字を算用数字に変換する」において説明していますので、気になる方はご参照ください。
Function ConvKan2Num(text As String, Optional digit As Long = 4) As Double
Dim i As Long, pos As Long, posStart As Long: posStart = 1
Dim partialValue As Double
Dim largeNums As Variant: largeNums = IIf(digit = 4, Array("", "万", "億", "兆"), Array("", "十", "百", "千")) '大数の指定
For i = UBound(largeNums) To 0 Step -1
If i = 0 Then
pos = IIf(posStart = Len(text) + 1, 0, Len(text) + 1)
Else
pos = InStr(text, largeNums(i))
End If
If pos <> 0 Then '目的の大数が無い場合は加算しない
If pos = posStart Then '目的の大数が数字を持たない場合(ex. "二千百四十"における百の位)
partialValue = 1
Else
If digit = 4 Then
partialValue = ConvKan2Num(Mid(text, posStart, pos - posStart), 1) '再帰処理
Else
partialValue = ReplKan2Num(Mid(text, posStart, pos - posStart))
End If
End If
ConvKan2Num = ConvKan2Num + partialValue * 10 ^ (digit * (i))
posStart = pos + 1
End If
Next i
End Function
4-3-5. 4桁までの数値(2056)を漢数字(二千五十六)に変換(ConvNum2Kan4
プロシージャ)
以下は4桁までの数字を漢数字に変換するコードです。
Function ConvNum2Kan4(ByVal num As Long) As String
Dim i As Long
Dim largeNums As Variant: largeNums = Array("", "十", "百", "千")
Dim chinNums As Variant: chinNums = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
Dim quo As Long 'quotient(商)
If num < 0 Then num = -num 'エラー回避(マイナス数字はプラスにしておく)
num = num Mod 10000 'エラー回避(5桁以上の場合は下4桁のみ対象とする)
For i = UBound(largeNums) To 0 Step -1
quo = num \ 10 ^ i
num = num Mod 10 ^ i
If quo = 0 Then
ConvNum2Kan4 = ConvNum2Kan4 & ""
ElseIf i <> 0 And quo = 1 Then
ConvNum2Kan4 = ConvNum2Kan4 & largeNums(i)
Else
ConvNum2Kan4 = ConvNum2Kan4 & chinNums(quo) & largeNums(i)
End If
Next i
If ConvNum2Kan4 = "" Then ConvNum2Kan4 = "〇"
End Function
それぞれの位の数字を取得する方法は、古典的なアルゴリズムを使用しています。
例えば、5346
という数字を1000
で割ると、商が5
で余りが346
となります。
そうすると、千の位が5
ということが分かります。続いて余りの346
を100
で割れば、百の位が3
ということが分かります。
このようにして情報を取得した上で、漢数字表記に置き換える処理をしています。
本当はこのアルゴリズムで、15桁分の数字全てを処理してしまいたいところですが、VBAで整数のデータ型はLong
が最大であり、その範囲は「-2,147,483,648~2,147,483,647」となっています。
なので、この方法では9桁の変換までしかできないことになります。
4-3-6. 15桁までの数値を漢数字などに変換(ConvNum2Kan
プロシージャ)
これは15桁の数字を漢数字などに変換するコードです。
'15桁までの数値を漢数字などに変換
Function ConvNum2Kan(num As Double, Optional typ As Long = 1) As String
Dim numStr As String: numStr = num
Dim largeNums As Variant: largeNums = Array("", "万", "億", "兆")
Dim i As Long, tmpNum As Long
ConvNum2Kan = "" '初期値(無くとも良いが明示する)
For i = 0 To UBound(largeNums)
tmpNum = Val(Right(numStr, 4))
If tmpNum > 0 Then
Select Case typ
Case 2 '四五万八九〇〇
ConvNum2Kan = ReplNum2Kan(CDbl(tmpNum)) & largeNums(i) & ConvNum2Kan
Case 3 '45万8900
ConvNum2Kan = tmpNum & largeNums(i) & ConvNum2Kan
Case Else '四十五万八千九百
ConvNum2Kan = ConvNum2Kan4(tmpNum) & largeNums(i) & ConvNum2Kan
End Select
End If
If Len(numStr) > 4 Then
numStr = Left(numStr, Len(numStr) - 4)
Else
Exit For
End If
Next i
If ConvNum2Kan = "" Then ConvNum2Kan = "〇"
End Function
VBAでは15桁の整数を格納できるデータ型がないので(たぶん)、一旦Double
型からString
型に変換して、4桁ずつ切り取って処理をしています。
なお、45万8900
というような数字と漢数字が混合した表記にもできるように、引数typ
の数値に応じて表記が変更されるようにしています(コード中のコメント文を参照してください)。
なお、このtyp
に当てられる数字は、「2-2-3. コンボボックスのソースコード」で作成したリストのインデックスと対応するように調整しています。
具体的には、次のような区分となっています。
Index | リスト項目 | 表記例 |
---|---|---|
0 | 算用数字 | 538,000,000 |
1 | 漢数字1(十百千を含む) | 五億三千八百万 |
2 | 漢数字2(十百千を含まない) | 五億三八〇〇万 |
3 | 数字・漢字混合 | 5億3800万 |
標準モジュールの内容は、以上のとおりです。
記載するコードの完成形は「4-1. 【参考】標準モジュールのソースコード(完成形)」のようになります。
5. フォームと標準モジュールの関連付け
さて、最後に、標準モジュールで作成したプログラムをフォームボタンで操作できるようにします。
まず、実行内容を確認するために、何でも良いのでWORD文書に文字列を入れておきます。
私は、漢数字が適度に使用されている「消費税法64条」の条文をコピペしています(e-Gov 消費税法)。
加えて、ふりがなが入っていた場合の挙動を確認するために、「懲役」のところにルビを入れています。
それでは、「2-2. フォームのソースコード作成」が終わった時点のコードに処理を追加していきます。
上図の赤枠のところを、次のコードに書き直します。
Private Sub HighlightNumBtn_Click()
Call HighlightNum
End Sub
Call HighlightNum
の一文で、標準モジュール(ConvNumModule
)のHighlightNum
プロシージャを呼び出して実行しています。
フォームを開いて「数字部分の自動マーキング」ボタンをクリックして、次のようになっていれば成功です。
それでは、他のボタンも関連付けを行っていきます。
メインフォームのボタンと標準モジュールのプロシージャの関係付けを一覧にすると次のとおりです。
ボタン | オブジェクト名 | 関連付けるプロシージャ | 備考 |
---|---|---|---|
数字部分の自動マーキング | HighlightNumBtn | HighlightNum | ※これは既に作成済み |
マーキング全てをクリア | CrearHighlightBtn | CrearHighlight | |
選択部分のマーキングをクリア | CrearHighlightOnSelectionBtn | CrearHighlightOnSelection | |
マーキング部分の数字変換を実行 | ConvKan2NumBtn | ConvNum | 引数としてコンボボックスのインデックス番号を渡す |
こう見ると、最後のオブジェクト名は「ConvKan2NumBtn」ではなく「ConvNumBtn」とすべきでしたね(ここはこのままにしておきます)。
表のとおりに、次のような3つのプロシージャ(clickイベント)を追加します。
Private Sub CrearHighlightBtn_Click()
Call CrearHighlight
End Sub
Private Sub CrearHighlightOnSelectionBtn_Click()
Call CrearHighlightOnSelection
End Sub
Private Sub ConvKan2NumBtn_Click()
Call ConvNum(SelectCmb.ListIndex)
End Sub
VBAはプロシージャの順番が変わっても処理に影響しないので、コードを見る人が分かりやすい順番で並べておきます。
これで、一応ツールなるものが完成しました。
6. ツールの配布方法
ツールは完成しましたが、次のような問題が残ります。
・毎回、マクロから「OpenForm」を使ってフォームを開かないとならないのか?
・全てのWORD文書でこのツールを使うにはどうしたら良いか?
・他の人に使ってもらうにはどう配布したら良いか?
ここではアドインによる方法について書いておきます。
色々なサイトで解説されている手法なので、ここに書くまでもないのですが、以下、ごく簡単に基本部分だけ紹介しておきます。
参考サイト:Wordアドインの使い方 など
6-1. ツールバーにフォームを登録する
WORDには「クイックアクセスツールバー」なるものがあります。
よく使う処理を、赤枠のところにアイコンで並べて使うものです。
ここに、フォームを開くボタンを設置します。
WORD文書のメニューの「ファイル」から「オプション」を開き「クイックアクセスツールバー」を選択します。
そして、「コマンドの選択」のドロップダウンメニューから「マクロ」を選択し、「クイックアクセスツールバーのユーザー設定」から「[ファイル名]に適用」を選択します。
私は、ファイル名を「SampleTool.docm」としているので、画面のように表示されています。
今回ツールバーに登録したいのは「OpenForm」というマクロなので、下図のように選択して「追加」ボタンを押します。
すると、右側の欄に「OpenForm」のマクロが追加されますので、OKボタンを押して終了します。
次のように、マクロのアイコンが登録されていると思います。
今後は、このボタンを押すことで、いつでもフォームが開けます。
6-2. 全てのWORD文書でマクロを有効にする
全ての文書でマクロを使えるようにするには、まず、拡張子を.dotm
にした「マクロ有効テンプレート」を作成します。
作成したWORDファイルを「名前を付けて保存」から、マクロ有効テンプレートとして保存します。
なお、ファイルの保存先は、デスクトップなど自分が分かりやすい場所に保存してください(私の手元では、自動的にC:\Users\username\Documents\Office のカスタム テンプレート
というフォルダが保存先に選択されていまいます。)。
次に、テンプレートを置く場所の確認です。
WORD文書のメニューの「ファイル」から「オプション」を開き「詳細設定」を選択します。
この下の方にある「全般」の項目に、「ファイルの場所」というボタンがあるので、これをクリックします。
次のような画面が表示されますので、「スタートアップ」のところをダブルクリックで開きます。
すると、次のようにSTARTUPフォルダの場所が確認できます。
フォルダの場所は決して変更しないようにして、この赤枠部分のディレクトリだけをコピーして、別途フォルダを開きます。
このSTARTUPフォルダに先ほど作った「マクロ有効テンプレート」(拡張子.dotm
)を保存して終わりです。
以上の作業により、どのWORD文書を開いても、「クイックアクセスツールバー」からフォームを開いてツールを使用することができるようになります。
6-3. 他の人に使ってもらう方法
他の人に使ってもらうには、「6-2. 全てのWORD文書でマクロを有効にする」で作成した「マクロ有効テンプレート」(拡張子.dotm
)を配布して、そのマクロ有効テンプレートをその方の「STARTUPフォルダ」に保存してもらうことでツールを使用できるようになります。
7. おわりに
これからVBAを始める方に、何らかのお役に立てば幸いです。