ExcelVBAで「毎月の面倒な作業」を自動化する入門

「毎月同じ作業をExcelでやっている」なら、VBAで自動化できるかもしれません。情シスや社内SE、IT担当者はもちろん、プログラミング未経験の方でもコードをコピーして動かすところまで到達できる入門記事です。

VBAとマクロ、何が違う?

「マクロ」と「VBA」はほぼ同じ意味で使われますが、厳密には違います。

  • マクロ:Excelの操作を自動化する仕組みの総称
  • VBA(Visual Basic for Applications):マクロを作るためのプログラミング言語

Excelの「マクロの記録」機能でもマクロを作れますが、それで生成されるコードがVBAです。VBAを直接書けるようになると、マクロの記録では作れない複雑な処理も自動化できます。

この記事ではVBAを直接書く方法を紹介します。

準備:VBAエディタを開く

VBAのコードを書く場所(VBAエディタ)を開きます。

Excelのリボンに「開発」タブがある場合 「開発」→「Visual Basic」をクリック

「開発」タブがない場合(最初はここから)

  1. 「ファイル」→「オプション」を開く
  2. 「リボンのユーザー設定」を選ぶ
  3. 右側の一覧から「開発」にチェックを入れる
  4. 「OK」で閉じると、リボンに「開発」タブが表示される

または、キーボードの Alt + F11 でVBAエディタを直接開けます(これが一番早いです)。

VBAエディタの画面構成

VBAエディタを開くと、左側に「プロジェクト」ウィンドウ、右側に大きな白い入力エリアが表示されます。

コードを書くには、メニューの「挿入」→「標準モジュール」を選びます。「標準モジュール」を使うことをおすすめします。シートに紐づかない汎用的な処理を書けるので、使い回しやすくなります。

はじめての自動化:毎月のフォーマットを一発で整える

毎月こんな作業をしていませんか?

  • A1セルに「月次レポート」と入力して太字にする
  • 1行目を背景色で塗りつぶす
  • 列幅を調整する
  • 日付を入力する

これを毎月手作業でやっている場合、VBAで一瞬で終わらせることができます。

以下のコードを標準モジュールに貼り付けてください。

Sub 月次レポート初期設定()

    ' シートを変数に入れる
    Dim ws As Worksheet
    Set ws = ActiveSheet

    ' A1に「月次レポート」と入力
    ws.Range("A1").Value = "月次レポート"

    ' A1を太字にして文字サイズを14に
    ws.Range("A1").Font.Bold = True
    ws.Range("A1").Font.Size = 14

    ' 1行目の背景色をグレーに(RGB指定)
    ws.Rows(1).Interior.Color = RGB(200, 200, 200)

    ' B1に今日の日付を入力
    ws.Range("B1").Value = Date
    ws.Range("B1").NumberFormat = "yyyy年m月d日"

    ' A列の幅を20、B列の幅を15に設定
    ws.Columns("A").ColumnWidth = 20
    ws.Columns("B").ColumnWidth = 15

    ' 完了メッセージを表示
    MsgBox "初期設定が完了しました!"

End Sub

マクロを実行する

コードを貼り付けたら、まず動かしてみましょう。

VBAエディタから実行する場合 コードの中にカーソルを置いて、ツールバーの「▶」ボタン(または F5 キー)を押します。

Excelシートからボタンで実行する場合(便利)

  1. 「開発」タブ→「挿入」→「ボタン(フォームコントロール)」を選ぶ
  2. シート上でドラッグしてボタンを配置する
  3. 「マクロの登録」ダイアログが出るので、「月次レポート初期設定」を選んで「OK」
  4. ボタンのラベル文字は右クリックで編集できる

以後はボタンをクリックするだけでマクロが実行されます。まずはボタンを押して、Excelのシートが自動で変化するのを体験してみてください。

コードの解説

動いたところで、コードが何をしているか確認しましょう。

Sub 月次レポート初期設定()

Subから始まりEnd Subで終わるのが「プロシージャ」と呼ばれる処理のかたまりです。Subの後に処理の名前をつけます。日本語でもOKです。

Dim ws As Worksheet
Set ws = ActiveSheet

Dimは変数を宣言する命令です。「wsという名前でワークシートを扱う変数を用意します」という意味です。ActiveSheetは今開いているシートを指します。

ws.Range("A1").Value = "月次レポート"

Range("A1")でA1セルを指定し、.Valueにテキストを入れています。=の右側が入れたい値です。

ws.Range("A1").Font.Bold = True

Trueは「はい」、Falseは「いいえ」を意味します。Font.Bold = Trueで太字にできます。

ws.Range("B1").Value = Date

DateはVBAの組み込み関数で、今日の日付を返します。

よくあるエラーと対処

「マクロが無効になっています」と出る場合 Excelのセキュリティ設定でマクロが無効になっています。「開発」→「マクロのセキュリティ」→「警告を表示してすべてのマクロを無効にする」を選ぶと、ファイルを開くたびに確認ダイアログが出るようになります。

「コンパイルエラー」と出る場合 コードに文法ミスがあります。全角スペースが混入していないか、SubEnd Subが対応しているかを確認してください。

ファイルを保存するとマクロが消える場合 通常の .xlsx 形式ではマクロを保存できません。「名前を付けて保存」で拡張子を .xlsm(マクロ有効ブック)にして保存してください。

次のステップ:繰り返し処理で真価を発揮する

VBAの本当の強みは「繰り返し処理」です。たとえば「100行のデータを1行ずつ確認して条件に合う行だけ別シートに転記する」のような作業は、手作業だと1時間かかっても、VBAなら数秒で終わります。

' 繰り返し処理の基本形(ForループとIf文)
Sub サンプル_繰り返し()

    Dim i As Long
    Dim ws As Worksheet
    Set ws = ActiveSheet

    ' 2行目から最終行まで繰り返す
    For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

        ' A列の値が「完了」だったらB列を青くする
        If ws.Cells(i, 1).Value = "完了" Then
            ws.Cells(i, 2).Interior.Color = RGB(173, 216, 230)
        End If

    Next i

    MsgBox "処理完了!"

End Sub

このコードを動かすには、A列に「完了」と入力されたデータが必要です。試してみてください。

まとめ

VBAは難しそうに見えて、基本の構造は「処理のかたまり(Sub〜End Sub)」「変数」「セルの操作」「繰り返し」の組み合わせです。まずはこの記事のコードをそのままコピーして動かし、「どこを変えたらどう変わるか」を試していくと理解が早まります。

毎月・毎週の定型作業をひとつVBAで自動化できると、業務効率の改善を体感できます。