帳票ファイルを汚さずに
VBAマクロを使う
(個人用マクロブック)

Excelで定型的な帳票を扱うとき、マクロを使えば作業が格段に楽になります。ただ、マクロを含むファイルは拡張子が.xlsmになり、開くたびにセキュリティ警告が表示されるのが面倒です。

そこで使えるのが個人用マクロブックです。マクロを帳票ファイルではなく個人用マクロブックに入れておけば、帳票ファイル自体は通常の.xlsxのまま保存できます。Excel起動中は常にマクロが利用できる状態になり、複数のファイルで同じマクロを使い回せるのも利点です。

関連記事

1. 個人用マクロブックとは

「個人用マクロブック(PERSONAL.XLSB)」は、Excelが起動時に自動で読み込む特別なファイルです。通常は非表示で動作しており、ユーザーが意識することはありません。

このファイルにマクロを保存すると、どのExcelファイルを開いていてもそのマクロを実行できます。プログラミングで言えば、グローバルなライブラリのようなもの。

個人用マクロブックは初期状態では存在しません。マクロの記録機能を使って保存先を指定すると、自動的に作成されます。

1.1. 開発タブを表示する

まず、Excelで開発タブが表示されているか確認します。
リボンに開発タブが見当たらない場合は、以下の手順で表示させます。

ファイルタブからオプションを開きます。左側のメニューからリボンのユーザー設定を選び、右側の一覧で開発にチェックを入れてOKを押します。
開発タブには、Visual Basicエディタを開くボタンやマクロの記録ボタンがあります。

1.2. 個人用マクロブックを作成する

個人用マクロブックがまだ存在しない場合、マクロの記録機能を使って作成します。

開発タブの「マクロの記録」をクリックします。
表示されるダイアログで、マクロの保存先を個人用マクロブックに変更してOKを押します。
マクロ名はそのままで構いません。

すぐに記録終了ボタンを押します。
実際のマクロは後で入れ替えるので、ここでは適当なセルをクリックするだけで十分です。

これで個人用マクロブックが作成されました。
ファイル自体は非表示なので、見た目には何も変わりません。

1.3. Visual Basicエディタ(VBE)を開く

開発タブの「Visual Basic」ボタンをクリックすると、VBE(Visual Basic Editor)が開きます。
ここでVBAコードを編集します。

左側にはプロジェクトエクスプローラーが表示されています。
VBAProjectという項目がいくつか並んでいますが、その中にVBAProject(PERSONAL.XLSB)があるはずです。
これが個人用マクロブックです。

VBAProject(PERSONAL.XLSB)の左にある三角をクリックして展開します。標準モジュールというフォルダが見えるので、これを右クリックして挿入から標準モジュールを選びます。

標準モジュールは、VBAコードを入れる器だと思ってください。クラスモジュールやフォームモジュールなど他の種類もありますが、通常のマクロは標準モジュールに書きます。

2. コードを貼り付ける

たとえば、右側のコードウィンドウに、以下のコードを貼り付けます。

Option Explicit

Sub 並び替え()
'
' 並び替え Macro
'

'
    Sheets("仕訳帳").Select
    ActiveSheet.Unprotect
    Range("B8").Select
    ActiveWorkbook.Worksheets("仕訳帳").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("仕訳帳").Sort.SortFields.Add2 Key:=Range("B8:B2107") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("仕訳帳").Sort
        .SetRange Range("B8:R2107")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Sheets("仕訳帳").Select
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowDeletingRows:=True, AllowSorting:=True
End Sub
Code language: PHP (php)

貼り付けたら、ファイルメニューから上書き保存を選びます。これで個人用マクロブックへの登録は完了です。VBEを閉じてExcelに戻ります。

2.1. マクロを実行する

登録したマクロを実行するには、開発タブの「マクロ」ボタンをクリックします。
マクロ名の一覧に「PERSONAL.XLSB!並び替え」が表示されているはずです。

これを選んで実行ボタンを押すと、マクロが動作します。
ただし、このマクロは「仕訳帳」という名前のシートを対象にしているので、そのシートが存在しない場合はエラーになります。

頻繁に使うマクロなら、クイックアクセスツールバーにボタンを追加しておくと便利です。
オプションの「クイックアクセスツールバーのカスタマイズ」から、コマンドの選択で「マクロ」を選び、追加したいマクロを右側に移動させます。

3. コードの意味を読み解く

このマクロは、次のような流れで動作します。

  1. 仕訳帳シートを選択する
  2. シートの保護を一時的に解除する
  3. B8セルを選択する(この操作は必須ではない)
  4. 以前の並び替え条件をクリアする
  5. B列の値を基準に、昇順で並び替える条件を設定する
  6. B8からR2107の範囲を、設定した条件で並び替える
  7. シートの保護をかけ直す

今回のコードは仕訳帳という名前と、B8からR2107という範囲に依存しています。
帳票の構造が変わったら、コードも修正しなければなりません。

ここからは、貼り付けたVBAコードが何をしているのか、順を追って見ていきます。

3.1. Option Explicitの役割

Option Explicit

コードの先頭にあるこの一行は、「変数を使う前に必ず宣言しなさい」という指示です。これがないと、変数名を打ち間違えても気づかずにバグの原因になります。

3.2. Subプロシージャの宣言

Sub 並び替え()

これがマクロの本体です。
Subはプロシージャの開始を表し、「並び替え」がこのマクロの名前になります。括弧の中には引数を書けますが、今回は空です。

End Subまでが一つのマクロの範囲です。

3.3. シートの選択と保護解除

Sheets("仕訳帳").Select
ActiveSheet.Unprotect
Code language: CSS (css)

最初の行で、仕訳帳という名前のシートを選択しています。
次の行でそのシートの保護を解除しています。

Excelシートには保護機能があり、保護されたシートは編集やデータの並び替えができません。ActiveSheetは現在選択されているシート、つまりさっき選んだ仕訳帳シートを指します。

保護を解除しないと、後の並び替え操作がエラーになります。

3.4. セルの選択

Range("B8").Select
Code language: JavaScript (javascript)

B8セルを選択しています。
この操作自体は並び替えに必須ではありませんが、マクロの記録機能で作ったコードにはこういった操作が残りがちです。

Rangeはセルやセル範囲を指定するオブジェクトです。
Range(“A1”)なら単一セル、Range(“A1:C10”)なら範囲を表します。

3.5. 並び替え条件のクリア

ActiveWorkbook.Worksheets("仕訳帳").Sort.SortFields.Clear
Code language: CSS (css)

並び替えの条件を一度クリアしています。ActiveWorkbookは現在開いているブック、Worksheets(“仕訳帳”)は仕訳帳シートを指します。

Sort.SortFieldsには、過去に設定された並び替え条件が残っている可能性があります。
Clearメソッドでこれを空にしてから、新しい条件を設定する流れです。

3.6. 並び替え条件の追加

ActiveWorkbook.Worksheets("仕訳帳").Sort.SortFields.Add2 Key:=Range("B8:B2107") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Code language: JavaScript (javascript)

並び替えの条件を追加しています。少し長いので分解して見ます。

  • Key:=Range("B8:B2107")は、並び替えの基準となる列を指定しています。B列の8行目から2107行目までが対象です。
  • SortOn:=xlSortOnValuesは、セルの値で並び替えることを表します。他にセルの色やアイコンで並び替える設定もあります。
  • Order:=xlAscendingは昇順を意味します。xlDescendingなら降順です。
  • DataOption:=xlSortNormalは通常の並び替えを指定しています。

行末のアンダースコア(_)は、VBAで行を継続するための記号です。
これがあると、次の行が同じ命令の続きだと解釈されます。

3.7. 並び替えの実行設定

With ActiveWorkbook.Worksheets("仕訳帳").Sort
    .SetRange Range("B8:R2107")
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
Code language: PHP (php)

With文を使うと、同じオブジェクトに対する操作をまとめて書けます。
ここでは仕訳帳シートのSortオブジェクトに対して、複数の設定を行っています。

  • .SetRange Range("B8:R2107")は、並び替える範囲全体を指定しています。B列からR列まで、8行目から2107行目までです。
  • .Header = xlNoは、この範囲に見出し行が含まれていないことを表します。xlYesなら最初の行を見出しとして扱います。
  • .MatchCase = Falseは、大文字と小文字を区別しないという設定です。
  • .Orientation = xlTopToBottomは、行方向に並び替えることを指定しています。xlLeftToRightなら列方向です。
  • .SortMethod = xlPinYinは、漢字の並び替え方法です。xlPinYinは読み方(音読み)で並べる方法で、日本語環境では一般的です。
  • .Applyで、ここまでに設定した条件で実際に並び替えを実行します。

3.8. シートの保護を再設定

Sheets("仕訳帳").Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
    , AllowDeletingRows:=True, AllowSorting:=True
Code language: PHP (php)

最後に、シートの保護を再びかけています。
最初に保護を解除したので、作業が終わったら元に戻すわけです。

Protectメソッドには複数の引数があります。

  • DrawingObjects:=Trueは、図形オブジェクトを保護します。
  • Contents:=Trueは、セルの内容を保護します。
  • Scenarios:=Trueは、シナリオ機能を保護します。
  • AllowDeletingRows:=Trueは、行の削除を許可します。
  • AllowSorting:=Trueは、並び替えを許可します。

保護をかけた状態でも、特定の操作だけは許可する設定です。
並び替えを許可しているのは、次回このマクロを実行するときに必要だからです。

4. 個人用マクロブックの利点と注意点

個人用マクロブックを使う利点は、帳票ファイルをマクロ有効ファイルにしなくて済むことです。
.xlsx形式のまま扱えるので、セキュリティ警告が出ず、他の人にファイルを渡すときも気を遣いません。

また、複数の帳票で同じマクロを使える点も便利です。
月次決算用、年次決算用など、似た構造の帳票が複数あるなら、マクロを一箇所にまとめられます。

ただし、個人用マクロブックは自分のパソコン固有のファイルです。
他のパソコンや他の人の環境には存在しません。
マクロを使った作業を他人に引き継ぐときは、コードをエクスポートして渡すか、帳票ファイル自体にマクロを含める必要があります。

4.1. 【補足】記録したマクロの改善余地

このコードはマクロの記録機能をベースに作りました。そのため、不要な操作が含まれています。

例えば、Sheets("仕訳帳").SelectRange("B8").Selectは、実際には並び替えに必要ありません。SelectやActiveSheetを使わずに、直接オブジェクトを指定する書き方のほうが、より明確で効率的です。

Sub 並び替え_改善版()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("仕訳帳")
    
    ws.Unprotect
    
    With ws.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=ws.Range("B8:B2107"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange ws.Range("B8:R2107")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    ws.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
        AllowDeletingRows:=True, AllowSorting:=True
End Sub
Code language: PHP (php)

この改善版では、変数wsに仕訳帳シートを格納しています。これにより、同じシートを何度も指定する手間が省け、コードの見通しが良くなります。

また、データの最終行を自動で取得する処理を追加すれば、データ量が変わっても対応できます。ただし、そこまで作り込むかは、帳票の使い方次第だと思います。

4.2. 実際の運用で考えること

個人用マクロブックにマクロを入れると、Excelを起動するたびに自動で読み込まれます。普段は便利ですが、マクロの数が増えすぎると起動が遅くなる可能性があります。

マクロの記録機能は便利ですが、生成されるコードには冗長な部分が多いです。記録したコードをそのまま使うのではなく、必要な部分だけを残して整理すると、メンテナンスしやすくなります。

個人用マクロブックは、自分専用のツールボックスのようなものです。よく使う処理を少しずつ蓄積していけば、日々の作業がかなり楽になります。