【VBA】Functionプロシージャの使い方を徹底解説!コピペで使えるサンプルコード集
「VBAのFunctionプロシージャって何?」「使い方がよく分からない。。。」
こんな悩みを抱えていませんか?
Funtionプロシージャは、
VBA学習を進めていると必ずぶち当たる壁
だと言っても過言ではありません。
ですが、
Functionプロシージャを使えるようになると、スマートで効率的なマクロを作成
できるようになります。
この記事では、VBA初心者でも安心して学べるよう基本的な仕組みから実践的な活用方法まで、段階的に解説します。
消費税計算、文字列操作、日付処理など、今すぐ使えるサンプルコードを豊富に掲載。
コピー&ペーストで即座にコードの処理を確認できるため、読み終わる頃には、あなたも自信を持ってFunctionプロシージャを使いこなせるようになるでしょう。
【VBA】Functionプロシージャとは?基本的な仕組みを理解しよう
VBA Functionプロシージャは、値を返すことができる特別なプロシージャです。
Excelの数式のように、計算結果や処理結果を戻り値として返すことが最大の特徴となります。
プログラミングにおいて、同じ処理を何度も書く必要がなくなり、コードの再利用性を格段に向上させることが可能。また、複雑な処理を関数化することで、メインのプログラムがすっきりと読みやすくなる
というメリットがあります。
Functionプロシージャは複雑な処理を実行するマクロに欠かせない重要な要素なのです。
FunctionプロシージャとSubプロシージャの違い
FunctionプロシージャとSubプロシージャの最も大きな違いは、戻り値の有無です。
Functionプロシージャは必ず値を返すのに対し、Subプロシージャは値を返すことができません。
FunctionプロシージャとSubプロシージャの比較ができるサンプルコードがこちら
' Functionプロシージャ(値を返す)
Function 足し算(a As Integer, b As Integer) As Integer
足し算 = a + b
End Function
' Subプロシージャ(値を返さない)
Sub メッセージ表示(text As String)
MsgBox text
End Sub
このように、Functionは計算結果を返しますが、Subは処理を実行するだけで値は返しません。
この違いを理解することで、適切なプロシージャの使い分けができるようになります。
【VBA】Functionの基本構文と書き方
Functionの基本構文は非常にシンプルで覚えやすい構造になっています。
使い方は、
Functionキーワードで始まり、End Functionで終わる間に処理を書くだけ
です。
こんな感じ
Function 関数名(引数1 As データ型, 引数2 As データ型) As 戻り値のデータ型
' 処理内容
関数名 = 計算結果や処理結果
End Function
重要なポイントは、関数名に結果を代入することで戻り値を設定すること。
これは他のプログラミング言語とは異なるVBA独特の書き方なので注意しましょう。
Functionプロシージャを使った基本的なサンプルコードがこちら
Function 円の面積(半径 As Double) As Double
円の面積 = 3.14159 * 半径 * 半径
End Function
この構文に従って書けば、誰でも簡単にFunctionプロシージャを作成できます。
戻り値とデータ型の指定方法
戻り値のデータ型指定は、Functionプロシージャの動作を決める重要な要素です。
適切なデータ型を指定することで、メモリ効率が向上し、予期しないエラーを防ぐことができます。
VBAでは、Integer(整数)、Double(小数)、String(文字列)、Boolean(真偽値)など、様々なデータ型が用意されています。
データ型を省略すると自動的にVariant型になりますが、処理速度とメモリ使用量の向上のため明示的に指定しましょう。
Long(数値型)を指定するサンプルコードがこちら
Sub testo()
Dim 価格 As Long
価格 = 200
Debug.Print 税込価格(価格)
End Sub
Function 税込価格(価格 As Long) As Long
税込価格 = 価格 * 1.1
End Function
上記のコードの実行結果がこちら
String(文字列)を指定するサンプルコードがこちら
Sub testo()
Dim 名前 As String
名前 = "マメ父ちゃん"
Debug.Print 挨拶文(名前)
End Sub
Function 挨拶文(名前 As String) As String
挨拶文 = "こんにちは、" & 名前 & "さん"
End Function
上記のコードの実行結果がこちら
このように、戻り値の種類に応じて適切なデータ型を指定することで、安全で効率的なプログラムを作成できます。
VBA Function使い方の基本をマスターしよう
VBA Functionの使い方をマスターするには、宣言から実行まで一連の流れを理解することが重要です。
Functionプロシージャは、一度作成すれば何度でも呼び出すことができる再利用可能なコードブロックです。
Excel VBAでは、標準モジュールに記述することで、どこからでも呼び出すことができます。また、ワークシート上で数式として使用することも可能で、これによりExcelの機能を大幅に拡張することが可能です。
正しい使い方を身につけることで、プログラミング効率が飛躍的に向上するでしょう。
Functionプロシージャの宣言方法
Functionプロシージャの宣言は、標準モジュールまたはクラスモジュールで行います。
宣言時には、アクセス修飾子(Public、Private)を指定することで、他のモジュールからの呼び出し可否を制御できます。
- Publicを指定すると全てのモジュールからの呼び出しが可能になる
- Privateを指定すると同じモジュール内からのみ呼び出しが可能になる
- 省略した場合はPublicとして扱われる
Funtionプロシージャ導入の目的に合わせて使い分けましょう。
標準モジュールでFuntionプロシージャを宣言する基本的なサンプルコードがこちら
' 標準モジュールでの宣言例
Public Function 消費税計算(金額 As Long) As Long
消費税計算 = 金額 * 0.1
End Function
Private Function 内部処理用関数(値 As Integer) As Integer
内部処理用関数 = 値 * 2
End Function
このように宣言することで、必要に応じて関数の公開範囲を制御できます。
引数の設定と使い方
引数は、Functionプロシージャに外部から値を渡すための仕組みです。
引数を使うことで、同じ処理でも異なる値を使って計算することができます。
引数には、ByVal(値渡し)とByRef(参照渡し)の2つの渡し方があり、通常はByValを使用し、元の変数を変更したい場合のみByRefを使用します。
また、Optional キーワードを使用することで、省略可能な引数も設定できます。
Funtionプロシージャに引数を渡す基本的なサンプルコードがこちら
Function 割引価格(定価 As Long, Optional 割引率 As Double = 0.1) As Long
割引価格 = 定価 * (1 - 割引率)
End Function
Function 文字列結合(ByVal 文字1 As String, ByVal 文字2 As String) As String
文字列結合 = 文字1 & 文字2
End Function
このように引数を設定することで、柔軟で再利用性の高い関数を作成できます。
関連記事「変数を引き渡す方法」では、ByVal(値渡し)とByRef(参照渡し)の使い方が紹介されています。
戻り値の設定方法
戻り値の設定は、関数名に値を代入で処理を行います。
複数の箇所で戻り値を設定することも可能で、条件分岐によって異なる値を返すことが可能。
さらに、Exit Function文を使用することで、処理を途中で終了させることも可能です。
Funtionプロシージャで戻り値を設定する基本的なサンプルコードがこちら
Function 成績判定(点数 As Integer) As String
If 点数 >= 80 Then
成績判定 = "優"
ElseIf 点数 >= 60 Then
成績判定 = "良"
Else
成績判定 = "不可"
End If
End Function
配列を使って戻り値を設定する基本的なサンプルコードがこちら
Function 最大値検索(配列 As Variant) As Double
Dim 最大値 As Double
最大値 = 配列(0)
For i = 1 To UBound(配列)
If 配列(i) > 最大値 Then
最大値 = 配列(i)
End If
Next i
最大値検索 = 最大値
End Function
このように、条件に応じて異なる戻り値を設定することで、より実用的な関数を作成できます。
関連記事「配列の使い方」では、セルの値を配列に格納する、配列に格納した値をセルに出力する方法が紹介されています。
【VBA】Functionのサンプルコード集【初心者向け】
初心者の方でも安心して使えるVBA Functionのサンプルコードを紹介します。
これらのコードは、日常的なExcel作業でよく使われる基本的な処理を関数化したものです。
コピー&ペーストで即座に使用できるように設計されているので、実際にVBAコードを動かしてみてください。
まずは簡単な計算から始めて、徐々に複雑な処理へとステップアップしていきましょう。
Functionプロシージャの理解を深めて、効率化マクロをどんどん導入していきましょう。
簡単な計算を行うFunction(四則演算)
四則演算を行うFunctionは、VBAプログラミングの基礎中の基礎です。
これらの関数を作成することで、複雑な計算式を簡潔に表現できます。
特に、消費税計算や割引計算など、ビジネスでよく使われる計算を関数化しておくと、作業効率を飛躍的に向上させることが可能。
また、計算ロジックが変更になった場合も、関数内の処理を修正するだけで、全体に反映されることができます。
' 消費税込み価格を計算する関数
Function 税込価格(価格 As Long) As Long
税込価格 = 価格 * 1.1
End Function
' 割引価格を計算する関数
Function 割引計算(定価 As Long, 割引率 As Double) As Long
割引計算 = 定価 * (1 - 割引率)
End Function
' 平均値を計算する関数
Function 平均値(数値1 As Double, 数値2 As Double, 数値3 As Double) As Double
平均値 = (数値1 + 数値2 + 数値3) / 3
End Function
これらの関数を使用することで、複雑な計算も簡単に実行できるようになります。
文字列操作を行うFunction(結合・抽出)
文字列操作は、データ処理において非常に重要な機能です。
名前の結合、住所の分割、文字列の抽出など、様々な場面で活用できます。
VBAには標準で多くの文字列関数が用意されていますが、業務に特化した独自の関数を作成することで、より効率的な処理が可能になるでしょう。
特に、定型的な文字列処理を関数化しておくと、同じ処理を何度も書く必要がなくなります。
' 姓名を結合する関数
Function 氏名結合(姓 As String, 名 As String) As String
氏名結合 = 姓 & " " & 名
End Function
' 文字列から数字のみを抽出する関数
Function 数字抽出(文字列 As String) As String
Dim 結果 As String
Dim i As Integer
For i = 1 To Len(文字列)
If IsNumeric(Mid(文字列, i, 1)) Then
結果 = 結果 & Mid(文字列, i, 1)
End If
Next i
数字抽出 = 結果
End Function
' 文字列を指定文字数で切り取る関数
Function 文字列切り取り(文字列 As String, 文字数 As Integer) As String
If Len(文字列) > 文字数 Then
文字列切り取り = Left(文字列, 文字数) & "..."
Else
文字列切り取り = 文字列
End If
End Function
これらの関数により、文字列の操作が簡単に行えるようになります。
日付・時刻を扱うFunction(フォーマット変換)
日付と時刻の処理は、業務システムでは必須の機能です。
VBAには標準で日付関数が用意されていますが、特定の形式での出力や、業務に合わせた日付計算を行う場合は、独自の関数を作成すると作業効率がアップします。
特に、和暦変換や営業日計算など、日本の業務に特化した処理を関数化しておくと、様々な場面で活用できるのでおすすめです。
' 日付を文字列形式に変換する関数
Function 日付文字列(日付 As Date) As String
日付文字列 = Format(日付, "yyyy年mm月dd日")
End Function
' 年齢を計算する関数
Function 年齢計算(生年月日 As Date) As Integer
年齢計算 = DateDiff("yyyy", 生年月日, Date)
If Format(生年月日, "mmdd") > Format(Date, "mmdd") Then
年齢計算 = 年齢計算 - 1
End If
End Function
' 曜日を日本語で取得する関数
Function 曜日取得(日付 As Date) As String
Dim 曜日配列 As Variant
曜日配列 = Array("日", "月", "火", "水", "木", "金", "土")
曜日取得 = 曜日配列(Weekday(日付) - 1)
End Function
これらの関数を使用することで、日付処理が格段に簡単になります。
VBA Functionの実践的なサンプルコード集【中級者向け】
中級者向けのVBA Functionサンプルコードは、実際の業務でよく使われる高度な処理を関数化したものです。
これらの関数は、Excel操作、配列処理、エラーハンドリングなど、より実践的な機能を提供します。
単純な計算だけでなく、データの検索、抽出、変換など、複雑な業務処理の効率化が可能。
これらのサンプルを理解しし、実際のエクセル業務にどんどん導入していきましょう。
エラー処理も含めたVBAコードにすることで、信頼性の高い効率化マクロに仕上げることができます。
Excel操作を行うFunction(セル検索・データ抽出)
Excel操作を行うFunctionは、VBAプログラミングの真価を発揮する重要な機能です。
セルの検索、データの抽出、範囲の操作など、手動では時間のかかる処理を瞬時に実行できます。
特に、大量のデータを扱う場合は、積極的にFuntionプロシージャで作成する関数を導入しましょう。
ワークシート関数では実現困難な複雑な条件での検索や、複数のシートにまたがるデータ処理も簡単に実現できます。
' 指定した値を検索してセルのアドレスを返す関数
Function セル検索(検索値 As Variant, 検索範囲 As Range) As String
Dim 見つかったセル As Range
Set 見つかったセル = 検索範囲.Find(検索値)
If Not 見つかったセル Is Nothing Then
セル検索 = 見つかったセル.Address
Else
セル検索 = "見つかりませんでした"
End If
End Function
' 指定列から最大値を取得する関数
Function 列最大値(列範囲 As Range) As Double
Dim セル As Range
Dim 最大値 As Double
最大値 = 列範囲.Cells(1, 1).Value
For Each セル In 列範囲
If IsNumeric(セル.Value) Then
If セル.Value > 最大値 Then
最大値 = セル.Value
End If
End If
Next セル
列最大値 = 最大値
End Function
' 条件に合致するセルの数を数える関数
Function 条件一致数(範囲 As Range, 条件 As Variant) As Integer
Dim セル As Range
Dim カウント As Integer
カウント = 0
For Each セル In 範囲
If セル.Value = 条件 Then
カウント = カウント + 1
End If
Next セル
条件一致数 = カウント
End Function
これらの関数により、Excel操作が格段に効率化されます。
配列を扱うFunction(データ処理・変換)
配列処理は、大量のデータを効率的に処理するための重要な技術です。
配列を使用することで、メモリ上でデータを高速に処理でき、Excel操作の回数を大幅に削減できます。
特に、データの変換、フィルタリング、ソートなどの処理では、配列を活用することで処理速度を飛躍的に向上させることが可能です。
また、複数の配列を組み合わせることで、複雑なデータ処理も実現できます。
' 配列から重複を除去する関数
Function 重複除去(元配列 As Variant) As Variant
Dim 結果配列() As Variant
Dim i As Integer, j As Integer
Dim 重複フラグ As Boolean
Dim カウント As Integer
カウント = 0
For i = LBound(元配列) To UBound(元配列)
重複フラグ = False
For j = LBound(元配列) To i - 1
If 元配列(i) = 元配列(j) Then
重複フラグ = True
Exit For
End If
Next j
If Not 重複フラグ Then
ReDim Preserve 結果配列(カウント)
結果配列(カウント) = 元配列(i)
カウント = カウント + 1
End If
Next i
重複除去 = 結果配列
End Function
' 配列を逆順にする関数
Function 配列逆順(元配列 As Variant) As Variant
Dim 結果配列() As Variant
Dim i As Integer
ReDim 結果配列(LBound(元配列) To UBound(元配列))
For i = LBound(元配列) To UBound(元配列)
結果配列(i) = 元配列(UBound(元配列) - i + LBound(元配列))
Next i
配列逆順 = 結果配列
End Function
これらの関数により、配列処理が簡単に実現できます。
エラーハンドリングを含むFunction(安全な処理)
エラーハンドリングは、堅牢なプログラムを作成するために不可欠な技術です。
予期しないエラーが発生した場合でも、プログラムが異常終了することなく、適切に処理を継続できます。
特に、ユーザーからの入力を受け取る関数や、外部データを処理する関数では、エラーハンドリングが必須です。
On Error文を使用することで、エラーが発生した場合の処理を定義できます。
' 安全な除算を行う関数
Function 安全除算(分子 As Double, 分母 As Double) As Variant
On Error GoTo エラー処理
If 分母 = 0 Then
安全除算 = "ゼロ除算エラー"
Else
安全除算 = 分子 / 分母
End If
Exit Function
エラー処理:
安全除算 = "計算エラー: " & Err.Description
End Function
' 安全な文字列→数値変換関数
Function 安全数値変換(文字列 As String) As Variant
On Error GoTo エラー処理
If IsNumeric(文字列) Then
安全数値変換 = CDbl(文字列)
Else
安全数値変換 = "数値変換エラー"
End If
Exit Function
エラー処理:
安全数値変換 = "変換エラー: " & Err.Description
End Function
' 安全な日付変換関数
Function 安全日付変換(文字列 As String) As Variant
On Error GoTo エラー処理
If IsDate(文字列) Then
安全日付変換 = CDate(文字列)
Else
安全日付変換 = "日付変換エラー"
End If
Exit Function
エラー処理:
安全日付変換 = "変換エラー: " & Err.Description
End Function
これらのエラーハンドリング機能により、安全で信頼性の高いプログラムを作成できます。
関連記事「On Error Resume Nextの使い方」では、エラーを無視する方法や注意点が紹介されています。
VBAでエクセル業務の効率化を実現
VBAを活用することで、エクセルでの日常業務を劇的に効率化できます。
VBAを使えば、
繰り返し作業の自動化によって人的ミスを削減し、作業時間を大幅に短縮する
ことが可能です。
毎日行っているデータ集計やレポート作成を自動化すれば、数時間かかっていた作業がボタン一つで数分で完了します。
エクセル作業が多い環境ではVBAの導入は必須事項である!といっても過言ではありません。
マクロを導入するメリット
マクロを導入する最大のメリットは、作業時間の短縮と品質の向上を同時に実現できることです。
人間が時間をかけて行う単純作業をコンピュータが正確かつ高速に処理することができます。
たとえば、手作業で1時間かかっていたデータ整理が、マクロなら数秒で完了し、さらに計算ミスや入力間違いも完全に防げます。
また、一度作成したマクロは何度でも使い回せるため、長期的な業務効率化投資としても非常に価値があります。
結果として、マクロ導入は時間コストの削減と業務品質の向上という二重のメリットをもたらします。
VBA学習の始め方
VBA学習の最も効果的な始め方は、実際の業務課題から出発することです。
目的が明確な学習は記憶定着率が高く、モチベーションも維持しやすいのは間違いありません。
たとえば、毎週行っているデータ集計作業を自動化することを目標に設定し、必要な機能から順番に覚えていけば実践的なスキルがすぐに身につきます。
基本的な変数の使い方から始まり、ループ処理、条件分岐、配列など、段階的にレベルアップしていくことで、確実にVBAをマスターできます。
関連記事「VBA初心者必見!マクロの作り方」では、コードを書く画面の開き方や書いたコードの実行方法が図やサンプルコードを使って紹介されています。
マクロの開発を外注依頼する
業務内容に合わせた効率化マクロを導入したいけど、VBAコードを開発する時間がない。。。どうやってプログラムを組めばいいかわからない。。。
このような方は、マクロ開発を外注に依頼しちゃいましょう。
外注依頼することで本業に集中しながら高品質なマクロを即座に導入することができます。
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
効率化マクロを導入してエクセル業務の効率をアップさせましょう。