【VBA】Private Sub使い方を解説!初心者でもすぐ使える実践テクニック

 

Private Subって何?Public Subとどう違うの?

 

こんな疑問を感じたことはありませんか?

 

結論から先にご紹介すると、

 

Private Subは、

特定の処理をまとめて実行するためのプロシージャ

です。

 

Private Subを使いこなせるようになれば、VBAコードをより安全で管理しやすくなります。

 

この記事では、VBA初心者の方でも5分で理解できるよう、Private Subの基本概念から実務で使える応用テクニックまでを分かりやすく解説。

 

「どんなときにPrivate Subを使うのか」「他のモジュールからアクセスできない理由」「エラーが起きにくいコードの書き方」など、効率化VBAを導入するためのノウハウも惜しみなく紹介します。

 

Private Subを上手に使ってエクセル業務の効率をアップさせましょう。

 

広告

VBA Private Subとは?基本概念を理解しよう

VBA Private Subは、

プログラム内で特定の処理をまとめて実行するためのプロシージャの一種

です。

 

最大の特徴は、同じモジュール内でのみ使用できる限定的な機能を持つことです。

 

この特徴を上手に利用すれば、

プログラムの安全性と管理のしやすくなり、より効率的で保守しやすいVBAコードに仕上げる

ことができます。

 

Private Subの定義と役割

Private Subを言い換えると、「プライベート(私的)」な処理を実行するプロシージャです。

 

つまり、

作成したモジュール内でのみ動作し、他のモジュールからは直接呼び出せなくする

ということ。

 

これは家の中でしか使えない道具のようなもので、外部からの予期しないアクセスを防ぐ重要な役割を果たします。

 

データの整理や計算処理など、内部的な作業に最適です。

 

Private Subを使った基本的なサンプルコードがこちら

Private Sub MyPrivateProcess()
MsgBox "これはプライベートな処理です"
End Sub

 

上記のコードは、

コードを記述したモジュール内でのみメッセージボックスを表示する

という内容です。

 

Public SubとPrivate Subの違い

Public SubとPrivate Subの最大の違いは、アクセス可能な範囲(スコープ)にあります。

 

Public Subはプロジェクト全体からアクセス可能な「公開された」プロシージャ

Private Subは同じモジュール内からのみアクセス可能な「限定的な」プロシージャ

という違いです。

 

Public Subは玄関のドアのように誰でも使えて、Private Subは自分の部屋の引き出しのように本人だけが使える

といったイメージ。

 

Public SubとPrivate Subを適切に使い分けることで、コードの安全性が向上します。

 

Public Sub PublicProcess()
MsgBox "どこからでも呼び出せます"
End Sub
Private Sub PrivateProcess()
MsgBox "このモジュール内でのみ使用可能"
End Sub

 

上記2つのコードの実行結果は同じですが、

他のモジュールから呼び出せるか、呼び出せないか、

という明確な違いがあります。

 

使い分けは、

コードの一番最初に「Private」を記述するか「Public」を記述するか

たったこれだけ。

 

使用目的に合った方を記述してください。

 

モジュール内での実行範囲について

Private Subは

作成されたモジュール内でのみ実行可能という制限

があります。

 

標準モジュール、クラスモジュール、フォームモジュールのどこに作成しても同じルールが適用

されるということです。

 

同じモジュール内の他のプロシージャから呼び出すことはできますが、別のモジュールからは一切アクセスできません。

 

この制限により、コードの影響範囲が限定され、デバッグやメンテナンスが格段に楽になります。

この特性を活かして内部処理専用のプロシージャとして活用しましょう。

 

【VBA】Private Subの基本的な書き方と構文

Private Subの構文は非常にシンプルで、

Privateキーワードから始まり、Sub文で処理を定義し、End Subで終了する

です。

 

基本的な構造を理解すれば、誰でも簡単にPrivateキーワードを使うことができます。

 

Private Sub宣言の基本構文

Private Sub宣言の基本構文は「Private Sub プロシージャ名()」から始まります。

 

プロシージャ名は処理内容が分かりやすい名前にしましょう。

構文の最後は「End Sub」で終了させます。

 

Private Subの基本構文を示したサンプルコードがこちら

Private Sub CalculateTotal()
Dim result As Integer
result = 100 + 200
MsgBox "合計は " & result & " です"
End Sub

 

上記のコードは、

変数resultに合計値を格納し、メッセージボックスで表示する

という内容です。

 

実行結果がこちら

 

この処理は作成されたモジュール内でのみ使用可能となります。

 

引数の設定方法

Private Subに引数を設定する場合は、プロシージャ名の後の括弧内に記述します。

引数を使うことで、外部から値を受け取って処理できるため、汎用性の高いプロシージャの設定が可能です。

 

設定方法は、

引数には変数名とデータ型を指定し、複数の引数がある場合はカンマで区切りる

です。

 

引数を活用することで、同じ処理を異なる値で実行できる便利な仕組みが作れます。

 

Private Subと引数を使ったサンプルコードがこちら

Private Sub ShowName(name As String)
MsgBox "こんにちは、" & name & "さん!"
End Sub

Private Sub AddTwoNumbers(firstNumber As Integer, secondNumber As Integer)
Dim total As Integer
total = firstNumber + secondNumber
MsgBox firstNumber & " + " & secondNumber & " = " & total
End Sub

Private Sub TestArguments()
' 引数を使ってPrivate Subを呼び出す例
Call ShowName("田中")
Call AddTwoNumbers(5, 3)
End Sub

 

上記のコードは、

TestArgumentsを実行すると、同じモジュール内のShowNameとAddTwoNumbersから引数を取得し結果を表示する

という内容です。

 

実行結果がこちら

 

関連記事「変数の受渡し方法」では、プロシージャを越えた値渡し、参照渡しについて解説されています。

[blogcard url="https://mamemametochan.com/excel-126/"]

 

引数を渡すイメージが付きにくい方は参考にしてみてください。

 

End Subまでの処理の流れ

Private Sub内の処理は上から下へ順番に実行され、End Subに到達すると処理が終了します。

途中でExit Subを使用すれば、End Subに到達する前に処理を終了することも可能です。

 

処理の流れを理解することで、論理的で効率的なコードが書けるようになります。

 

Private Subと条件分岐を組み合わせたサンプルコードがこちら

Private Sub CheckNumber(num As Integer)
If num > 0 Then
MsgBox "正の数です"
Exit Sub
End If
MsgBox "0以下の数です"
End Sub

 

上記のコードは、

同じモジュール内の別のプロシージャから変数「num」を受け取って、正の数と負の数を区別しメッセージボックスで表示する

という内容です。

 

関連記事「For文と関数IFの使い方」では、繰り返し処理と条件分岐の組み合わせる方法が紹介されています。

[blogcard url="https://mamemametochan.com/excel-5/"]

実際のエクセル業務での使用頻度が高いテクニックなので使い方をマスターしましょう。

 

【実践テクニック】Private Subの呼び出し方法

Private Subの適切な呼び出し方法を理解することで、

処理の流れを制御し、効率的なプログラム構造を作る

ことができます。

 

同一モジュール内での呼び出しルールと、他モジュールからアクセスできない理由を理解し、より安全で保守しやすいコードを作成しましょう。

 

同一モジュール内での呼び出し方

同一モジュール内では、Private Subを他のプロシージャから簡単に呼び出すことができます。

 

呼び出し方法は、プロシージャ名を直接記述するだけです。

引数がある場合は、プロシージャ名の後に括弧を付けて引数を渡します。

 

この仕組みにより、処理を細かく分割して、それぞれの処理を組み合わせる効率的なプログラミングが可能になります。

 

Private Sub MainProcess()
Call DataProcess
Call CalculateResult(100, 200)
End Sub

Private Sub DataProcess()
MsgBox "データを処理しています"
End Sub

Private Sub CalculateResult(num1 As Integer, num2 As Integer)
MsgBox "結果: " & (num1 + num2)
End Sub

 

上記のコードは、

MainProcessでDataProccessとCalculateResultを呼び出す

という内容です。

 

実行したときの流れがこちら

 

VBAコード上で「F8」キーを押下すると1行ずつ実行することが可能です。

 

コードを1行ずつ実行することで、

「処理の流れを理解できる」「効率的にデバックできる」

という効果があります。

 

関連記事「デバックの方法」では、VBAの実行方法やイミディエイト欄の活用法が紹介されています。

[blogcard url="https://mamemametochan.com/excel-19/"]

 

Callステートメントの使い方

Callステートメントを使用することで、Private Subの呼び出しをより明確に表現できます。

Callの記述は省略可能ですが、明記することでコードの可読性が向上し、他の開発者にとって理解しやすいプログラムになります。

 

特に複雑な処理や複数のプロシージャを呼び出す場合にはCallまでちゃんと明記しましょう。

 

引数がある場合は、Call文では括弧を使用する必要があります。

 

Private SubとCall文を組み合わせたサンプルコードがこちら

Private Sub ExecuteProcess()
Call ShowMessage()
Call AddNumbers(10, 20)
Call DisplayTime()
End Sub

Private Sub ShowMessage()
MsgBox "処理を開始します"
End Sub

Private Sub AddNumbers(num1 As Integer, num2 As Integer)
Dim result As Integer
result = num1 + num2
MsgBox num1 & " + " & num2 & " = " & result
End Sub

Private Sub DisplayTime()
MsgBox "現在時刻: " & Now()
End Sub

上記のコードは、

ExecuteProcessを実行すると、同モジュール内にあるAddNumbersとDisplayTimeを呼び出して順番に実行する

という内容です。

 

プログラムを分けることで「コードの管理がしやすい」「エラーが発生したときデバックがしやすい」というメリットがあります。

 

他モジュールからアクセスできない理由

Private Subが他モジュールからアクセスできないのは、VBAのスコープルールによるものです。

 

Privateキーワードは「このモジュール内でのみ使用可能」という制限を設けており、これによりプログラムの安全性と独立性が保たれます。

この制限があることで、意図しない外部からの呼び出しを防ぐことができるのでコードの安全性向上につながります。

 

他モジュールから呼び出したい場合は、

Public Subを使用するか、同一モジュール内のPublic Subを経由してPrivate Subを呼び出す

という内容でコードを作成してください。

 

他モジュールから呼び出せない事象を再現したサンプルコードがこちら

’ Module1
Public Sub CallPrivateFromOutside()
Call InternalProcess ' これは可能
End Sub

Private Sub InternalProcess()
MsgBox "内部処理実行中"
End Sub
' Module2
Public Sub TestCall()
' Call InternalProcess ' これはエラーになる
Call Module1.CallPrivateFromOutside ' 正しい呼び出し方
End Sub

上記のコードでは、

モジュール1にあるInternalProcessを呼び出す際、モジュール1にあるCallPrivateFromOutsideから呼び出すことは可能。ジュール2にあるTestCallから呼び出すことはできない

という比較をすることができます。

 

エラーが発生する様子がこちら

 

【VBA】Private Sub実践サンプルコード集

実際の業務で使えるPrivate Subのサンプルコードを紹介します。

これらのコードはエクセル業務でよく使われる処理パターンを基に作成しているので、そのまま使用するかカスタマイズして活用してみてください。

 

初心者から上級者まで段階的に学べる構成になっているため、自分のレベルに合わせて参考にしてください。

 

初心者向け基本的なサンプル

初心者の方でも理解しやすい基本的なPrivate Subのサンプルです。

シンプルな処理から始めて、徐々に複雑な処理に挑戦していきましょう。

 

エクセル業務でよく活用されるPrivate Subのサンプルコードがこちら

Private Sub BasicCalculation()
Dim value1 As Double
Dim value2 As Double
Dim result As Double

value1 = Range("A1").Value
value2 = Range("B1").Value
result = value1 + value2

Range("C1").Value = result
MsgBox "計算が完了しました。結果: " & result
End Sub

Private Sub ClearCells()
Range("A1:C1").ClearContents
MsgBox "セルをクリアしました"
End Sub

 

上記のコードは、

BasicCalculationでセルの値を取得して計算し、結果をC1セルに表示する。ClearCellsで値が入力されているセルをクリアする

という内容です。

 

実行結果がこちら

 

まずはこのコードを実際に動かしてみて、Private Subの動作を体感してみてください。

 

業務で使える実用的なコード例

実際の業務でよく使われる実用的なPrivate Subのサンプルです。

データの集計、条件による分岐処理、ファイル操作など、日常業務で必要になる処理を網羅しています。

 

データ処理やレポート作成などの定型業務に活用されるサンプルコードがこちら

Private Sub ProcessSalesData()
Dim lastRow As Long
Dim i As Long
Dim totalSales As Double

lastRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastRow
If Cells(i, 2).Value > 10000 Then
Cells(i, 4).Value = "優秀"
totalSales = totalSales + Cells(i, 2).Value
Else
Cells(i, 4).Value = "標準"
End If
Next i

Range("F1").Value = "合計売上: " & totalSales
End Sub

Private Sub FormatReport()
Range("A1:F1").Font.Bold = True
Range("A1:F1").Interior.Color = RGB(200, 200, 200)
Columns("A:F").AutoFit
End Sub

 

上記のコードは

A列の最終行を取得し、2行目から最終行までを繰り返す。数値が10000の場合、「優秀」と表示し集計する

という内容です。

 

実行結果がこちら

 

関連記事「最終行を取得する方法」では、カウント関数を使って変動する一覧表の最終行を取得する方法が紹介されています。

[blogcard url="https://mamemametochan.com/excel-3/"]

 

エラーハンドリングを含む応用例

プロレベルのPrivate Subサンプルとして、エラーハンドリングを含む応用的なコードを紹介します。

実際の業務では予期しないエラーが発生することがあるため、適切なエラー処理が必要不可欠です。

 

エラーハンドリングとして、

On Error文を使用したエラートラップとエラー内容を教えてくれるメッセージの表示

の実装がおすすめです。

 

エラーハンドリングを実装したサンプルコードがこちら

Private Sub SafeFileProcess()
On Error GoTo ErrorHandler

Dim filePath As String
Dim wb As Workbook

filePath = "C:\temp\data.xlsx"

' ファイルの存在チェック
If Dir(filePath) = "" Then
Err.Raise 53, , "指定されたファイルが見つかりません"
End If

Set wb = Workbooks.Open(filePath)
Call ProcessWorkbook(wb)
wb.Close SaveChanges:=True

MsgBox "処理が正常に完了しました"
Exit Sub

ErrorHandler:
If Not wb Is Nothing Then wb.Close SaveChanges:=False
MsgBox "エラーが発生しました: " & Err.Description
End Sub

Private Sub ProcessWorkbook(ByRef targetWB As Workbook)
On Error GoTo ProcessError

With targetWB.Sheets(1)
.Range("A1").Value = "処理日時: " & Now()
.Range("A2").Value = "ステータス: 完了"
End With

Exit Sub

ProcessError:
Err.Raise Err.Number, "ProcessWorkbook", Err.Description
End Sub

 

上記のコードは、

指定するファイルパスでファイルの有無を確認。ファイルが存在しない場合、21行目~24行目のエラー内容を表示するコードを実行。

ファイルが存在する場合、26行目から34行目のProcessWorkbookを実行。実行中にエラーが発生した場合、36行目から38行目のエラー内容を表示するコードを実行。

という内容です。

 

On Error GoTo 〇〇では、

エラーが発生したとき〇〇に移動して処理を継続

させることができます。

 

関連記事「エラーを無視する方法」では、On Error Resume Nextの使い方が紹介されています。

[blogcard url="https://mamemametochan.com/excel-125/"]

 

 

VBAでエクセル業務の効率化を実現

VBAを活用することで、エクセルでの日常業務を劇的に効率化できます。

VBAを使えば、

繰り返し作業の自動化によって人的ミスを削減し、作業時間を大幅に短縮する

ことが可能です。

 

毎日行っているデータ集計やレポート作成を自動化すれば、数時間かかっていた作業がボタン一つで数分で完了します。

エクセル作業が多い環境ではVBAの導入は必須事項である!といっても過言ではありません。

 

マクロを導入するメリット

マクロを導入する最大のメリットは、作業時間の短縮と品質の向上を同時に実現できることです。

人間が時間をかけて行う単純作業をコンピュータが正確かつ高速に処理することができます。

 

たとえば、手作業で1時間かかっていたデータ整理が、マクロなら数秒で完了し、さらに計算ミスや入力間違いも完全に防げます。

また、一度作成したマクロは何度でも使い回せるため、長期的な業務効率化投資としても非常に価値があります。

 

結果として、マクロ導入は時間コストの削減と業務品質の向上という二重のメリットをもたらします。

 

VBA学習の始め方

VBA学習の最も効果的な始め方は、実際の業務課題から出発することです。

目的が明確な学習は記憶定着率が高く、モチベーションも維持しやすいのは間違いありません。

 

たとえば、毎週行っているデータ集計作業を自動化することを目標に設定し、必要な機能から順番に覚えていけば実践的なスキルがすぐに身につきます。

 

基本的な変数の使い方から始まり、ループ処理、条件分岐、配列など、段階的にレベルアップしていくことで、確実にVBAをマスターできます。

 

関連記事「VBA初心者必見!マクロの作り方」では、コードを書く画面の開き方や書いたコードの実行方法が図やサンプルコードを使って紹介されています。

[blogcard url="https://mamemametochan.com/excel-114/"]

 

マクロの開発を外注依頼する

業務内容に合わせた効率化マクロを導入したいけど、VBAコードを開発する時間がない。。。どうやってプログラムを組めばいいかわからない。。。

 

このような方は、マクロ開発を外注に依頼しちゃいましょう。

 

外注依頼することで本業に集中しながら高品質なマクロを即座に導入することができます。

 

ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。

開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、

費用が安い!スピード納期!!

でやらせてもらっています。

 

ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。

 

ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。

 

 

 

効率化マクロを導入してエクセル業務の効率をアップさせましょう。