「エクセルの関数を自作したい…」
そんな風に考えたことはありませんか?

・エクセルに標準でない特殊な関数を使いたい
・他の人も簡単に使えるオリジナル関数を作成したい
・繰り返し作業を減らし、業務効率をアップしたい



そんな悩みを解決できるのが
VBAを活用した「ユーザー定義関数」です!
この記事では、初心者の方でもわかりやすく、VBAで関数を自作する方法を解説します。
初心者でもわかりやすいように、関数を自作する基本手順から、繰り返し作業の自動化や便利な応用例、さらにどのエクセルファイルでも使えるようにするアドイン化の方法まで解説します。
この記事を読めば、チーム全体で活用できる便利な関数が作れるようになります!
ぜひ最後までご覧いただき、エクセルをさらにパワーアップさせてください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
この記事で「できるようになる」こと
- ユーザー定義関数とは? や、具体的な使用例を確認する
- ユーザー定義関数で使用するFunctionプロシージャを習得する
- ユーザー定義関数のアイデアの例を見てみる
- アドインを設定してどのエクセルでもユーザー定義関数を使用できるようにする
- ユーザー定義関数の注意ポイントを学習する
エクセルVBAの「ユーザー定義関数」とは? | 使用方法をご紹介
ユーザー定義関数とは、エクセルの標準機能ではできない計算や処理を、自分で作成して追加できる関数のことです。
VBAを使えば、エクセルに便利な機能を自由にカスタマイズし、業務の効率化や作業の自動化を実現できます。
ユーザー定義関数でできること
ユーザー定義関数を使えば、エクセルに標準でない計算や処理を追加し、業務に特化したカスタマイズが可能になります。
作成した関数は通常のエクセル関数と同じように使えるため、誰でも簡単に利用できます。
- 標準関数にはない処理を簡単に追加
- 作成した関数は通常のエクセル関数と同じように入力して使用できます。
- 複雑な計算式をシンプルにまとめる
- 長い数式を1つの関数にすることで、可読性が向上しミスも減らせます。
- 繰り返し作業を効率化
- 手動で行っていた計算やデータ処理を自動化し、作業時間を短縮できます。
【具体例】セルのコメントを出力する関数
以下の例は、セルに挿入されているコメント(メモ)を、そのセルの隣に出力するユーザー定義関数です。
エクセルの標準関数では実現できませんが、ユーザー定義関数を作れば簡単に実現できます。
入力コード
標準モジュールに、以下のコードを記述します。
Function GetComment(TargetCell As Range) As String
'// セルのコメントを取得する関数
On Error Resume Next
GetComment = TargetCell.Comment.Text
If Err.Number <> 0 Then
GetComment = "コメントがありません"
End If
On Error GoTo 0
End Function
ユーザー定義関数の使用方法
先ほど作成したFunctionプロシージャの名前を「関数名」として呼び出すだけで、使用することができます。


VBAで「ユーザー定義関数」を作成する理由とは? | Functionプロシージャの基礎
ユーザー定義関数とは、自分で作成した関数をエクセルで使えるようにするものです。
エクセルには多くの標準関数がありますが、業務に特化した処理や複雑な計算が必要な場合、標準機能だけでは限界があります。
そんなとき、VBAのFunctionプロシージャを使って、独自の関数を作成することで、自由自在にエクセルをカスタマイズできます。
なぜFunctionプロシージャを使うのか?
Functionプロシージャを使う主な理由は以下の3つです。
- 値を返すことができる
計算結果や処理結果を返し、エクセルのセルに表示したり、他のプロセスで利用できます。 - エクセル関数のように使える
作成した関数は、標準のエクセル関数と同じ形式で使えます。
例:=MyFunction(A1)
。 - 標準関数では実現できない処理を簡単に作成できる
- 複雑なロジックや業務特有の計算を効率的に実現できるため、作業時間を大幅に短縮できます。
Functionプロシージャの基本構文と実例
Functionプロシージャの基本構文は以下の通りです。
「引数」を渡して処理し、その結果を「戻り値」として返します。
Functionプロシージャの基本構文
Functionプロシージャの基本構文は以下の様に記述します。
Function 関数名(引数1 As 型, 引数2 As 型, ...) As 戻り値の型
'// 処理内容
関数名 = 結果
End Function
引数がある場合の例
以下は、2つの数値を受け取って足し算する関数の例です。
Function AddNumbers(Number1 As Double, Number2 As Double) As Double
AddNumbers = Number1 + Number2
End Function
- セルに
=AddNumbers(5, 3)
と入力すると、「8」が表示されます。
引数がない場合の例
引数を取らず、特定の値を直接返す関数も作成できます。
Function GetPi() As Double
GetPi = 3.14159
End Function
- セルに
=GetPi()
と入力すると、「3.14159」が表示されます。
引数が省略可能な場合の例
引数を省略可能にする場合は、Optional
キーワードを使います。
引数が渡されなかった場合には、デフォルト値を設定できます。
Function Greet(Name As String, Optional Greeting As String = "こんにちは") As String
Greet = Greeting & ", " & Name & "さん!"
End Function
=Greet("太郎")
→ 「こんにちは, 太郎さん!」=Greet("太郎", "おはよう")
→ 「おはよう, 太郎さん!」
関連記事でさらに詳しく!
Functionプロシージャについてもっと詳しく知りたい方は、以下の記事をご覧ください。
基礎から応用までわかりやすく解説しています!


エクセル標準関数では足りない?業務効率化に役立つユーザー定義関数の活用例
エクセルの標準関数は便利ですが、業務や分析では「こんな機能があれば…」と思うこともあります。
そこで、標準関数では実現できないけれど、ユーザー定義関数で作成すると便利なアイデアをいくつかご紹介します。
アイデア1. セルのコメントを隣のセルに表示する関数
標準関数ではセルのコメント(またはメモ)を直接取得することはできません。
この関数を使えば、セルのコメント内容を表示でき、コメントの内容を効率的に確認できます。
サンプルコード
Function GetComment(TargetCell As Range) As String
On Error Resume Next
GetComment = TargetCell.Comment.Text
If Err.Number <> 0 Then
GetComment = "コメントがありません"
End If
On Error GoTo 0
End Function
このコードで使用している機能
使用結果


使用例
=GetComment(A1)
→ セルA1のコメント内容が表示されます。
アイデア2. 範囲内で最初に空白セルが現れる位置を返す関数
エクセルの標準関数では、空白セルを検索しその位置を返すことはできません。
この関数を使えば、指定した範囲内で空白であるセルの行番号や列番号を簡単に取得できます。
サンプルコード
Function FindFirstEmptyCell(TargetRange As Range) As String
Dim Cell As Range
For Each Cell In TargetRange
If IsEmpty(Cell.Value) Then
If FindFirstEmptyCell = "" Then
FindFirstEmptyCell = Cell.Address
Else
FindFirstEmptyCell = FindFirstEmptyCell + "," & Cell.Address
End If
End If
Next Cell
If FindFirstEmptyCell = "" Then
FindFirstEmptyCell = "空白セルなし"
End If
End Function
このコードで使用している機能
使用結果


使用例
=FindFirstEmptyCell(A1:A10)
→ 範囲内で空白セルのアドレス(例: $C$3
)を返します。
アイデア3. 範囲内の数値セルだけを合計する関数
標準のSUM
関数は、文字列が含まれていてもエラーにはなりませんが、数値以外を無視して合計する機能はありません。
この関数を使えば、指定範囲の数値セルだけを正確に合計できます。
サンプルコード
Function SumNumbersOnly(TargetRange As Range) As Double
Dim Cell As Range
Dim Total As Double
For Each Cell In TargetRange
If IsNumeric(Cell.Value) Then
Total = Total + Cell.Value
End If
Next Cell
SumNumbersOnly = Total
End Function
このコードで使用している機能
使用結果


使用例
=SumNumbersOnly(A1:A10)
→ 範囲内の数値だけを合計します。
アイデア4. 範囲内のデータを結合する関数(引数なし・引数ありで柔軟に対応)
標準関数でデータを結合する場合、TEXTJOIN
関数やCONCAT
関数がありますが、これらは制約があり、使い勝手が良いとは言えません。
このコードでは、範囲内のデータを任意の区切り文字で結合し、空白セルを自動で無視することができます。
さらに、区切り文字を省略した場合はデフォルトのカンマ「,」を使用するため、簡単かつ柔軟にデータをまとめられます。
サンプルコード
Function JoinRange(TargetRange As Range, Optional Separator As String = ",") As String
Dim Cell As Range
Dim Result As String
'// 範囲内のデータを結合
For Each Cell In TargetRange
If Not IsEmpty(Cell.Value) Then
Result = Result & Cell.Value & Separator
End If
Next Cell
'// 最後の区切り文字を削除
If Len(Result) > 0 Then
Result = Left(Result, Len(Result) - Len(Separator))
End If
JoinRange = Result
End Function
このコードで使用している機能
使用結果


具体的な使用例
セル範囲 | 関数入力 | 結果 |
---|---|---|
A1:A5 | =JoinRange(A1:A5, "; ") | データ1; データ2; データ3 |
A1:A5 | =JoinRange(A1:A5) | データ1,データ2,データ3 |
A1:A5 | =JoinRange(A1:A5, CHAR(10)) | データ1 データ2 データ3 |
(※CHAR(10)
を使用すると改行で結合され、セル内でリスト形式になります。)
エクセル関数をどのファイルでも使えるように!アドイン化の手順を解説
作成した関数を別のエクセルファイルでも利用可能にするには、「アドイン」として保存する必要があります。
ここでは、その設定手順を分かりやすく解説します!
アドインとは?
アドインとは、エクセルで作成した特定の機能やカスタム関数を、他のエクセルファイルでも簡単に利用できるようにする仕組みです。
一度作成すれば、関数を毎回コピーする手間が省け、効率的に業務を進められます。
アドインの作成手順
拡張子を「Excelアドイン (*.xlam)」として保存
1.VBAエディターで作成した関数が含まれるファイルを開きます。
2.「ファイル」→「名前を付けて保存」を選択します。
3.ファイル形式を「Excelアドイン(*.xlam)」に変更して保存します。
※保存場所は、任意の箇所を指定してください。
⇒ 標準では「C:\Users\ ~~ \AppData\Roaming\Microsoft\AddIns」となっています。


アドインの設定を行う
1.任意のエクセルファイルを開きます。
※どのエクセルファイルでも問題有りません。 ( 現在のエクセルファイルでもOKです )
2.「ファイル」タブをクリックします。
3.「オプション」を選択します。
4.「アドイン」を選択します。
5.「設定 (G)」をクリックします。


6.「参照 (B)」をクリックします。
7.先ほど保存した「.xlam」ファイルをクリックします。
8.「OK」をクリックします。


9.先ほど追加したファイルが追加されたことを確認します。


ユーザー定義関数の動作確認をしましょう!
1.別のエクセルファイルを開きます。
2.作成した関数をセルに入力(例: =MyFunction(A1)
)。
3.関数が正しく動作すれば設定完了です!
エクセルのユーザー定義関数で失敗しないための注意ポイント
ユーザー定義関数を活用すると、エクセルをさらに便利にカスタマイズできます。
ただし、スムーズに使いこなすためには、いくつかの注意点を知っておく必要があります。以下で詳しく解説します!
1. 関数が動作しない場合の原因
注意ポイント : マクロ設定を有効にする必要がある
ユーザー定義関数を利用するには、エクセルでマクロが有効になっている必要があります。
マクロが無効の場合、関数が正しく動作しないことがあります。
対策 : アドインが正しく登録されているか確認
アドインが設定されていない場合、関数は利用できません。
「オプション」→「アドイン設定」で、追加したアドインが有効になっているか確認しましょう。
2. エラーが発生する場合の対応
注意ポイント : エラーコードを確認する
エラーが出た場合は、デバッグモードでコードを確認し、修正を行います。
特に、入力範囲や引数が想定と異なる場合にエラーが起きやすいです。
対策 : エラー処理を追加して回避
VBAコード内でOn Error Resume Next
やIf IsError()
を使用し、エラー発生時の処理を定義しておくと、トラブルを最小限に抑えられます。
例 : vbaコードをコピーするOn Error Resume Next ' エラーが発生しても無視
3. 他のユーザーとの共有時の注意点
注意ポイント : アドインを正しく配布する
関数を他のユーザーと共有する場合、アドインファイル(*.xlam)を一緒に配布し、各ユーザーが設定する必要があります。
ヒント: 手順書やスクリーンショットを添えて、設定方法を簡単に説明すると親切です。
対策 : バージョン互換性に注意
作成した関数はエクセルのバージョンによって動作しない場合があります。
特に古いバージョンのエクセルを使用している場合は、事前にテストを行いましょう。
4. ユーザー定義関数のパフォーマンスに注意
注意ポイント : 関数が多すぎると動作が遅くなる
シート上で大量のユーザー定義関数を使用すると、計算速度が低下することがあります。
対処法: 必要最小限の関数を利用し、処理が重い関数はサブルーチン(Sub)に切り替えるなど工夫しましょう。
対策 : 頻繁に再計算が発生しないように設計
ユーザー定義関数は、参照するセルの値が変更されるたびに再計算が行われます。
可能であれば、計算範囲を限定するか、手動で更新を行う設定にすると効率的です。
この記事のまとめ
この記事では、エクセルVBAを使ってユーザー定義関数を作成し、業務効率化を図る方法を解説しました。
関数を自作する基本から応用例、他のファイルでも使えるようにするアドイン化の手順、注意点までを網羅しています。
以下のポイントをもう一度復習してみましょう!
ポイントのおさらい
- ユーザー定義関数の基本と使い方
- エクセルの標準機能にない処理や計算を、VBAのFunctionプロシージャを使って簡単に実現できます。
⇒ 「エクセルVBAの「ユーザー定義関数」とは? | 使用方法をご紹介」をもう一度見る。
⇒ 「VBAで「ユーザー定義関数」を作成する理由とは? | Functionプロシージャの基礎」をもう一度見る。
- エクセルの標準機能にない処理や計算を、VBAのFunctionプロシージャを使って簡単に実現できます。
- 標準関数では実現できない便利な活用例
- セルのコメントを取得する関数や、範囲内の数値セルだけを合計する関数など、業務効率化に役立つ4つのアイデアを具体例とともに紹介しました。
⇒ 「標準関数では実現できない!ユーザー定義関数の便利なアイデア」をもう一度見る。
- セルのコメントを取得する関数や、範囲内の数値セルだけを合計する関数など、業務効率化に役立つ4つのアイデアを具体例とともに紹介しました。
- 他のエクセルファイルでも使えるようにする方法
- 作成した関数をアドイン化して、どのエクセルファイルでも利用できるようにする手順を解説しました。
設定方法や動作確認のポイントも詳しく説明しています。
⇒「エクセル関数をどのファイルでも使えるように!アドイン化の手順を解説」をもう一度見る。
- 作成した関数をアドイン化して、どのエクセルファイルでも利用できるようにする手順を解説しました。
- ユーザー定義関数を使う際の注意ポイント
- 関数をスムーズに活用するために、マクロ設定の有効化、エラー処理、パフォーマンスの最適化など、トラブルを防ぐためのコツを解説しました。
⇒ 「エクセルのユーザー定義関数で失敗しないための注意ポイント」をもう一度見る。
- 関数をスムーズに活用するために、マクロ設定の有効化、エラー処理、パフォーマンスの最適化など、トラブルを防ぐためのコツを解説しました。
さらに学ぶために
この記事でユーザー定義関数の基本を学んだら、次は業務の自動化や分析ツールの作成にも挑戦してみましょう!
VBAをマスターすれば、エクセルの可能性は無限大です。

