最初のVBAプロシージャの作成
メニューを表示するにはスワイプしてください
マクロの記録は語彙を学ぶ手段であり、ゼロからマクロを書くことはプログラマー的な思考の始まり。
Subプロシージャの構造
値を返す(Function)ではなく、何らかの処理を実行する再利用可能なVBAコードのブロックは、Subとして記述:
Sub ProcedureName()
' instructions go here
End Sub
Subの内部でカーソルがある状態でF5を押す(または緑色の実行矢印をクリック)と、プロシージャが実行される。コメント(アポストロフィ(')で始まる行)はVBAで完全に無視されるため、なぜそのコードが必要なのかを説明するために積極的に使うと良い。何をしているかはコードを見れば明らかなことが多い。
すぐに役立つフォーマット習慣
- 各モジュールの最上部に
Option Explicitを記述 — すべての変数宣言を強制し、タイプミスによるバグを未然に防止; - ループや
Ifブロック内のコードはタブでインデント — VBEは強制しないが、インデントがないと可読性が著しく低下; - 説明的な名前を使用(例:
HighEarnerCount、xではなく) — 数週間後の自分が助かる。
実例:高収入者のハイライト
手作業で、テーブル内の各従業員を調べ、給与が$55,000を超える人をハイライトするプロシージャを作成。これは、各行ごとに判断(If文)を繰り返す必要があるため、マクロ記録機能では実現できない。
Option Explicit
Sub HighlightTopEarners()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 6).Value > 55000 Then
ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — high earners are highlighted."
End Sub
Dim ws As Worksheet / Dim i As Long— 2つの変数を宣言:wsはEmployeesシートへの参照、iは行番号カウント用;- Set
ws = ThisWorkbook.Worksheets("Employees")— オブジェクトモデルの基本:アクティブなシートに依存せず、シート名を明示的に指定; ws.Cells(ws.Rows.Count, 1).End(xlUp).Row— 列Aの最終使用行を取得する標準的な記述方法。従業員数が何人でも対応;For i = 2 To lastRow ... Next i— データ行ごとに繰り返すループ。2行目から開始し、ヘッダー行をスキップ;- If
ws.Cells(i, 6).Value > 55000 Then— 判断処理:給与列(6列目)が55000を超える行のみ書式設定; MsgBox— マクロの完了を知らせるシンプルなポップアップ。
このプロシージャを modIntro に入力し、カーソルをその中に置いて F5 を押してください。自分で数値を確認してください — サンプルテーブルで Emma Davis と Olivia Brown の2名が$55,000を超えている従業員です。
タスク
HighlightTopEarnersをmodIntroに正確に入力し、実行してください。2行が緑色になることを確認します。- このプロシージャを複製して
HighlightITDepartmentとし、条件を変更して給与ではなく部門(3列目)が "IT" の行をハイライトするようにします。 - 各プロシージャの上に、その内容を1文で説明するコメントを追加します — 読者向けのコメントを書く練習です。
- ワークブックを再度保存します(拡張子は
.xlsmのままなので、通常通りCtrl+Sで問題ありません)。
HighlightTopEarnersプロシージャ全体(SubからEnd Subまで)を選択し、コピーしてmodIntro内でその直下に貼り付けます。- 2つ目のコピーの
Sub行をSub HighlightITDepartment()にリネームします — モジュール内の各プロシージャには固有の名前が必要です。そうでないと、VBAはどちらを実行するか判断できません。 - 変更する条件は
If行です。現在は数値を判定しています:
If ws.Cells(i, 6).Value > 55000 Then
これをテキスト判定 — 3列目(Department)が "IT" であるかどうか — に変更します。Chapter 2 で学んだ通り、テキスト比較には値を引用符で囲み、= ではなく > を使います。
4. ループ内の他の部分(Interior.Color の行やループ構造)はそのままで構いません — 変更するのは判定条件だけです。
コメントの追加
- コメント行はアポストロフィ(
')で始まり、Sub行の直上に単独で記述します — プロシージャ内ではありません。 - マクロを初めて見る同僚に説明するつもりで書きます。自分用のメモではありません。比較例:
- あまり有用でない例:
' loops through rows(方法の説明。コードを見れば分かる) - より有用な例:
' Highlights employees earning over $55,000(何を達成するかの説明。コードだけでは分かりにくい)
- あまり有用でない例:
- 2つ目のプロシージャにも同様に、何をハイライトし、なぜなのか(IT部門スタッフなど、業務目的の観点で)を1文で記述します。ループの仕組みではなく、ビジネス上の目的を説明してください。
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 6).Value > 55000 Then
ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — high earners are highlighted."
End Sub
' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
Dim ws As Worksheet
Dim i As Long
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Employees")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If ws.Cells(i, 3).Value = "IT" Then
ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
End If
Next i
MsgBox "Done — IT department is highlighted."
End Sub
両方を modIntro に入力し、まず HighlightTopEarners を実行して正確に2行(Emma Davis:$62,000、Sophia Miller:$59,000)が緑色になることを確認してください(他の3名は$55,000以下です)。次に HighlightITDepartment を実行し、Sophia Miller の行がハイライトされることを確認します。両方が動作したら Ctrl+S で保存してください。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください