【VBA】Callの使い方を徹底解説!初心者にもできる別マクロを呼び出すテクニック
VBAでマクロを作っていると「同じ処理を何度も書くのが面倒」「コードが長すぎて読みにくい」という悩みを抱えていませんか?
こんな問題は、VBAのCall文の導入ですぐ解決することができます。
Call文を使えば、
別のマクロを自由に呼び出すことができプログラムを1つの部品に分けて管理
することが可能。
たとえば、
データ入力・計算・出力といった3種類の処理を別々のマクロに分けることで、メンテナンスが格段に楽になる
というイメージです。
この記事では、Call文の基本的な使い方から、条件分岐やエラー処理を使った実践的なテクニックまで、業務ですぐに使える具体例を交えて分かりやすく解説。
初心者の方でも安心して学べるよう実際のコードを豊富に掲載しているので、コードをコピペし実際に手を動かしながら参考にしてみてください。
【VBA】Callとは?別マクロを呼び出す基本概念
VBA のCall文は、別のプロシージャやマクロを呼び出すための命令文です。
プログラムを1つ1つ小さな部品に分けて作ることで、コードの管理がとても簡単になります。
VBAでは、SubプロシージャやFunctionプロシージャを自由に呼び出すことができるので、プログラムを1つずつ分けて管理すること可能です。
Callステートメントの基本構文と書き方
Call文の基本的な書き方は「Call プロシージャ名」というシンプルな形です。
実はCallという文字を省略することもできますが、コードを読みやすくするためにCallを付けることをおすすめします。
基本構文では引数がある場合は括弧で囲み、引数がない場合は括弧を付けません。
Callの基本構文がこちら
' 基本的なCall文の書き方
Call HelloMessage
Call CalculateTotal(100, 200)
' Callを省略した書き方(同じ動作)
HelloMessage
CalculateTotal 100, 200
この構文を覚えることで、どんなプロシージャでも簡単に呼び出せるようになり、プログラムの流れを自由にコントロールできるようになります。
Call文を使うメリットとコードの可読性向上
Call文を使う最大のメリットは、プログラムが読みやすくなることです。
長いコードを一つのプロシージャに書くよりも、機能ごとに分けて作った方がバグを見つけやすく、修正も簡単になります。
また、同じ処理を何度も使う場合、一度プロシージャを作っておけば何回でも呼び出せるため、コードの重複を避けることができます。
Callを使った基本的なサンプルコードがこちら
Sub MainProcess()
Call DataInput ' データ入力
Call DataCalc ' データ計算
Call DataOutput ' データ出力
End Sub
上記のコードは、
データ入力用のマクロ「DataInput」を呼び出す、データ計算用のマクロ「DataCalc」を呼び出す、データ出力ようのマクロ 「DataOutput」を呼び出す
という内容です。
このように処理を分けることで、メンテナンス性が向上し、チームでの開発作業もスムーズに進められるのです。
Subプロシージャを呼び出す具体例
Subプロシージャの呼び出しは、日常的なExcel作業を自動化する際によく使われます。
たとえば、セルの書式設定とデータの入力を別々のプロシージャに分けることで、処理の流れが明確になります。
メインプロシージャから2つのSubプロシージャを順番に呼び出すサンプルコードがこちら
Sub MainTask()
Call SetCellFormat
Call InputData
MsgBox "処理が完了しました"
End Sub
Sub SetCellFormat()
Range("A1:C1").Font.Bold = True
Range("A1:C1").Interior.Color = RGB(200, 200, 255)
End Sub
Sub InputData()
Range("A1").Value = "商品名"
Range("B1").Value = "価格"
Range("C1").Value = "在庫数"
End Sub
上記のコードは、
MainTaskを実行すると、SetCellFormatを呼び出しA1セルからC1セルを太文字にし背景色を変える。
次にInputDataを呼び出しA1セルに「商品名」、B1セルに「価格」、C1セルに「在庫数」を入力する
という内容です。
実行結果がこちら
機能を分割することで、後から書式だけを変更したい時や、データの入力方法だけを修正したい時に、該当するプロシージャだけを編集することができます。
VBA Call文の正しい使い方と基本パターン
VBA Call文には、引数の有無や戻り値の扱いによっていくつかの基本パターンがあります。
正しい使い方を身につけることで、エラーを防ぎ、安定したプログラムを作ることができます。
特に引数の渡し方や括弧の使い方にはルールがあるため、これらのパターンを理解することが重要です。
初心者の方でも、基本的なパターンを覚えてしまえば、複雑な処理でも自信を持ってプログラムを組めるようになります。
引数なしでマクロを呼び出す方法
引数がないプロシージャを呼び出す場合は、プロシージャ名の後に括弧を付けません。
これが最もシンプルなCall文の使い方です。
引数がない場合、Callキーワードを省略することもできますが、コードの意図を明確にするためにCallを付けることをおすすめします。
引数がないプロシージャを呼び出すサンプルコードがこちら
Sub Main()
Call ShowWelcomeMessage
Call ClearWorksheet
Call SaveWorkbook
End Sub
Sub ShowWelcomeMessage()
MsgBox "処理を開始します"
End Sub
Sub ClearWorksheet()
Cells.Clear
End Sub
Sub SaveWorkbook()
ThisWorkbook.Save
End Sub
上記のコードは、
Mainを実行すると、順番にメッセージボックスを表示するマクロ「ShowWelcomeMessage」、セルをクリアするマクロ「ClearWorksheet」、ブックを保存するマクロ「SaveWorkbook」を実行する
という内容です。
単純な作業を順番に実行する場合によく使われ、プログラムの流れが一目でわかるようになります。
引数ありでマクロを呼び出す方法
引数があるプロシージャを呼び出す場合は、Callキーワードを使う時は括弧で引数を囲み、Callを省略する時は括弧を付けずにスペースで区切ります。
この使い分けを正しく理解することが重要です。
引数を使うことで、同じプロシージャでも異なる値を渡して、複雑な処理を実現するコードの設定ができるようになります。
引数があるプロシージャを呼び出すサンプルコード(Callを記述するバージョン)がこちら
Sub Main()
' Callを使う場合は括弧が必要
Call CreateReport("売上データ", "2024年1月")
Call SetCellValue(Range("B1"), "合計金額")
End Sub
Sub CreateReport(reportTitle As String, period As String)
Range("A1").Value = reportTitle
Range("A2").Value = period & "のレポート"
End Sub
Sub SetCellValue(targetCell As Range, cellValue As String)
targetCell.Value = cellValue
targetCell.Font.Bold = True
End Sub
引数があるプロシージャを呼び出すサンプルコード(Callを記述しないバージョン)がこちら
Sub Main()
' Callを省略する場合は括弧不要
CreateReport "在庫データ", "2024年2月"
SetCellValue Range("B1"), "平均単価"
End Sub
Sub CreateReport(reportTitle As String, period As String)
Range("A1").Value = reportTitle
Range("A2").Value = period & "のレポート"
End Sub
Sub SetCellValue(targetCell As Range, cellValue As String)
targetCell.Value = cellValue
targetCell.Font.Bold = True
End Sub
上記のコードを1行ずつ実行している様子がこちら
「F8」キーを使って実行することで
どんな順番んでコードが実行されていくのか、どのタイミングで引数が渡されているのか、を確認
することができます。
引数を渡すコードでは、どのような流れで処理が実行されていくのかを把握することが重要です。
関連記事「デバックの方法」では、作成したコードを効率的に実行する方法が紹介されています。
[blogcard url="https://mamemametochan.com/excel-19/"]
戻り値を受け取るFunction呼び出し
Functionプロシージャを呼び出す場合は、戻り値を変数で受け取ることが可能です。
Functionは計算結果や処理結果を返すプロシージャなので、その結果を変数に格納して後続の処理で使用します。
Call文でFunctionを呼び出す場合は戻り値を受け取れないため、通常は代入文の形で呼び出します。
Call文でFunctionを呼び出すサンプルコードがこちら
Sub Main()
Dim result As Double
Dim message As String
' Functionの戻り値を変数で受け取る
result = CalculateTotal(1000, 0.1)
message = CreateMessage("田中", result)
MsgBox message
End Sub
Function CalculateTotal(price As Double, taxRate As Double) As Double
CalculateTotal = price * (1 + taxRate)
End Function
Function CreateMessage(customerName As String, amount As Double) As String
CreateMessage = customerName & "様の請求金額は" & Format(amount, "#,##0") & "円です"
End Function
上記のコードは、
Mainを実行すると、マクロ「CalculateTotal」を呼び出しresultを計算する、次にマクロ「CreateMessage」を呼び出し「氏名」と「result」を引数として渡しメッセージボックスを作成する
という内容です。
実行結果がこちら
このようにFunctionを活用することで、計算処理を独立させ、結果を柔軟に活用できるプログラムを作ることができます。
関連記事「Functionプロシージャの使い方」では、戻り値や宣言方法などFunctionプロシージャの活用方法が紹介されています。
[blogcard url="https://mamemametochan.com/excel-16/"]
【VBA】Callを使った実践的なマクロ作成テクニック
実際のエクセル業務でCallを活用する場合、
単純な呼び出しだけでなく条件分岐やエラー処理を組み合わせた高度なテクニックが必要
になります。
これらのテクニックを使えば、
複数のプロシージャを組み合わせて複雑な業務処理を自動化したり、状況に応じて異なる処理を実行したりする
ことができるようになります。
複数のマクロを順番に実行する方法
エクセル作業では、
データの取得、加工、出力といった複数の工程を順番に実行する
ことがよくありますよね。
各工程を独立したプロシージャに分けることで、処理の流れが明確になり、メンテナンスも簡単になります。
エラーが発生した場合も、どの工程で問題が起きたかを特定しやすくなるのです。
複数のマクロを順番に実行するサンプルコードがこちら
Sub ExecuteMonthlyReport()
Call InitializeWorkbook
Call ImportSalesData
Call CalculateSummary
Call CreateChart
Call FormatReport
Call SaveAndClose
MsgBox "月次レポートの作成が完了しました"
End Sub
Sub InitializeWorkbook()
Worksheets.Add.Name = "月次レポート"
Range("A1").Value = "売上分析レポート"
End Sub
Sub ImportSalesData()
' 外部データの取り込み処理
Range("A3").Value = "商品A: 50万円"
Range("A4").Value = "商品B: 30万円"
End Sub
Sub CalculateSummary()
Range("A6").Value = "合計: 80万円"
Range("A7").Value = "平均: 40万円"
End Sub
Sub CreateChart()
' グラフの作成
Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects.Add(Left:=200, Top:=100, Width:=300, Height:=200)
With chartObj.Chart
.SetSourceData Range("A3:A4")
.ChartType = xlColumnClustered
.HasTitle = True
.ChartTitle.Text = "売上グラフ"
End With
End Sub
Sub FormatReport()
' レポートの書式設定
Range("A1").Font.Size = 16
Range("A1").Font.Bold = True
Range("A1").Interior.Color = RGB(200, 220, 255)
Range("A3:A7").Borders.LineStyle = xlContinuous
Range("A3:A7").Font.Name = "メイリオ"
Range("A6:A7").Font.Bold = True
End Sub
Sub SaveAndClose()
' ファイルの保存と終了処理
Dim fileName As String
fileName = "月次レポート_" & Format(Date, "yyyy-mm-dd") & ".xlsx"
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & fileName
MsgBox "レポートを保存しました: " & fileName
' 不要なシートがあれば削除
Application.DisplayAlerts = False
If Worksheets.Count > 1 Then
Worksheets("Sheet1").Delete
End If
Application.DisplayAlerts = True
End Sub
上記のコードは、
新しくシートを作成するマクロ、セルにデータを入力するマクロ、データの集計をするマクロ、データからグラフを作図するマクロ、作成した書類の書式を編集するマクロ、ブックを保存するマクロ
を順番に実行します。
実行結果がこちら
このように工程を分けることで、各処理の責任範囲が明確になり、チームでの開発や後からの修正作業がスムーズに進められます。
関連記事「名前を付けて保存を自動化する方法」では、SaveAsの使い方が紹介されています。
[blogcard url="https://mamemametochan.com/excel-saveas/"]
プログラムにブックを保存する工程を組み込むなら使い方をマスターしておきましょう。
条件分岐でマクロを呼び分ける応用例
実際の業務では、状況に応じて異なる処理を実行する必要があります。
IF文やSelect Case文と組み合わせて、条件に応じて適切なプロシージャを呼び出しましょう。
Select Case文とCallを組み合わせたサンプルコードがこちら
Sub ProcessDataByType()
Dim dataType As String
dataType = Range("A1").Value
Select Case dataType
Case "売上データ"
Call ProcessSalesData
Case "在庫データ"
Call ProcessInventoryData
Case "顧客データ"
Call ProcessCustomerData
Case Else
Call ShowErrorMessage("未対応のデータ形式です")
End Select
End Sub
Sub ProcessSalesData()
Range("B1").Value = "売上データを処理中..."
' 売上データ固有の処理
Range("C1").Value = "売上集計完了"
End Sub
Sub ProcessInventoryData()
Range("B1").Value = "在庫データを処理中..."
' 在庫データ固有の処理
Range("C1").Value = "在庫チェック完了"
End Sub
Sub ShowErrorMessage(errorText As String)
MsgBox errorText, vbExclamation
End Sub
上記のコードは、
A1セルに入力されたテキストが「売上データ」の場合マクロ「ProcessSalesData」を呼び出す
A1セルに入力されたテキストが「在庫データ」の場合マクロ「ProcessInventoryData」を呼び出す
A1セルに入力されたテキストが「顧客データ」の場合マクロ「ProcessCustomerData」を呼び出す
A1セルに入力されたテキストが3つ以外の場合マクロ「ShowErrorMessage」を呼び出す
という内容です。
データの種類や処理条件に応じて柔軟に対応できる汎用性の高いマクロを作成できます。
関連記事「For文とIF関数の組み合わせ」では、繰り返し処理と条件分岐を組み合わせる方法が紹介されています。
[blogcard url="https://mamemametochan.com/excel-5/"]
エラーハンドリングと例外処理の実装
実用的なマクロでは、予期しないエラーに対する適切な処理が重要です。
On Error文と組み合わせることで、エラーが発生しても適切に対処し、ユーザーに分かりやすいメッセージを表示できます。
エラーハンドリングを実装したサンプルコードがこちら
Sub SafeDataProcessing()
On Error GoTo ErrorHandler
Call ValidateInputData
Call ProcessMainTask
MsgBox "処理が正常に完了しました"
Exit Sub
ErrorHandler:
Call HandleError(Err.Number, Err.Description)
End Sub
Sub ValidateInputData()
If Range("A1").Value = "" Then
Err.Raise 1001, , "入力データが見つかりません"
End If
End Sub
Sub ProcessMainTask()
' メイン処理(エラーが発生する可能性のある処理)
Dim result As Double
result = Range("A1").Value / Range("B1").Value
Range("C1").Value = result
End Sub
Sub HandleError(errorNum As Long, errorDesc As String)
Dim errorMsg As String
errorMsg = "エラーが発生しました" & vbCrLf
errorMsg = errorMsg & "エラー番号: " & errorNum & vbCrLf
errorMsg = errorMsg & "詳細: " & errorDesc
MsgBox errorMsg, vbCritical
End Sub
上記のコードは、
2行目のコードでエラーが発生するとマクロ「 HandleError」を呼び出す
27行目から33行目のコードでエラー内容をメッセージボックスで表示する
という内容です。
全てのセルを空白の状態でマクロを実行した様子がこちら
16行目のコードでエラーを検知し、「入力データがみつかりません」というメッセージボックスが表示されました。
このようにエラーハンドリングを組み込むことで、予期しない状況でもマクロが適切に動作し、ユーザーに対して親切な対応ができるようになります。
関連記事「エラーを無視する注意点」では、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スキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
効率化マクロを導入してエクセル業務の効率をアップさせましょう。