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

【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と引数を使ったサンプルコードがこちら

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から引数を取得し結果を表示する

という内容です。

 

実行結果がこちら

Private Subと引数を使ったサンプルコードの実行結果

 

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

 

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

 

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の使い方」では、繰り返し処理と条件分岐の組み合わせる方法が紹介されています。

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

 

【実践テクニック】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の実行方法やイミディエイト欄の活用法が紹介されています。

 

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のサンプルです。

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

 

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

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の場合、「優秀」と表示し集計する

という内容です。

 

実行結果がこちら

データ処理やレポート作成などの定型業務に活用されるサンプルコードの実行結果

 

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

 

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

プロレベルの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の使い方が紹介されています。

 

 

VBA初心者が『効率化VBA』を導入する方法

VBA初心者が『効率化VBA』を導入する方法

 

VBAなんて扱ったことないけど、エクセル業務の効率をアップさせるVBAを導入したい!

 

こんな問題を解決する方法がこちら

  • マクロの開発を外注に依頼する
  • マクロが設定されたエクセルファイルをダウンロードする
  • 参考書やネットでVBAスキルを身に付ける

 

VBAスキルを身に着ける前は、「マクロ開発の外注」で対応していましたが、

今では自分で効率化マクロをサクッと導入しちゃいます。

 

完成されたマクロを使ってエクセル業務を処理する

作業効率が2倍以上アップ!!

便利すぎて自分でもマクロを設定したいと考え始める

参考書やネットの情報でVBAスキルを身に付ける

マクロ開発を代行できる程のスキルを習得

 

 

VBAは

他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい

という特徴があります。

 

外注した方が楽だけど、費用がかかる。自分で導入すれば費用は0円だけど時間がかかる。。

いずれにせよ、効率化マクロを導入できれば作業効率が飛躍的にアップするのは間違いありません。

 

あなたに合った方法で導入しちゃいましょう。

 

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

マクロ開発を外注に依頼する方法は

VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法

です。

 

「こんなデータ抽出作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」

こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。

 

Left Caption

ガッツポーズの人

完成まで本業に集中できるので効率的

 

 

デメリットは、費用がかかることだけ。

開発内容、依頼先によってかかる費用は大きく異なります。

私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。

 

Left Caption

疑問がある人

ちょっと高くない。。。

 

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

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

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

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

 

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

 

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

 

 

マクロが設定されたエクセルファイルをダウンロードする

VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』することで、

すぐに使っているエクセルにマクロを導入することができます。

 

VBA初心者でも形になっているマクロをゲットできる、費用が安い、

というメリットがあります。

しかし、

想定するマクロを見つけることが難しい、業務内容に合わせるためのアレンジが必要

というデメリットもあります。

 

Left Caption

ガッツポーズの人

お目当てのマクロが見つかればラッキー

 

個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。

 

今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。

 

 

 

参考書やネットでVBAスキルを身に付ける

先程も紹介しましたが、

VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい

プログラミングです。

 

言い換えると、

情報量が豊富なので自分で勉強できちゃう

ということです。

 

私のVBAスキルはほとんど独学で身に付けたもので、

考えた処理のほとんどをVBAで表現できるレベルにまで到達した!

と思っています。

 

私の作ったマクロをプロのプログラマーが見れば、

お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!

と感じるはずです。

 

でも、

私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?

 

独学であっても『写真を貼り付けるマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、

業務内容に合ったマクロを開発できるようになれます。

 

独学でVBAスキルを身に付けるコツは、

エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる

です。

 

とは言っても、全くの知識0の方は何をすればいいかわからないですよね。

 

VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】』を読んでみてください。

 

VBAの知識0の方でもすいすい読み進められる内容になっています。

やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。

 

実際に私はこの参考書を読んでからVBAの勉強を始めました。

 

Left Caption

ひらめく人

VBA学習スタートのきっかけをくれた参考書


 

 

VBAの魅力を発見した後は、

ひたすら自動化したい内容のコードを書くだけ

です。

 

【VBA Private 使い方】【VBA 変数渡し】でネット検索すれば知りたいコードをすぐにゲットできます。

 

実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると

自然といろんなマクロが作れるようになっているはずです。

 

VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。