VBAでユーザー定義関数を作成する方法:初心者向け完全ガイド

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

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


エクセルに標準でない特殊な関数を使いたい

他の人も簡単に使えるオリジナル関数を作成したい

繰り返し作業を減らし、業務効率をアップしたい

そんな悩みを解決できるのが
VBAを活用した「ユーザー定義関数」です!


この記事では、初心者の方でもわかりやすく、VBAで関数を自作する方法を解説します。

初心者でもわかりやすいように、関数を自作する基本手順から、繰り返し作業の自動化便利な応用例、さらにどのエクセルファイルでも使えるようにするアドイン化の方法まで解説します。

この記事を読めば、チーム全体で活用できる便利な関数が作れるようになります!
ぜひ最後までご覧いただき、エクセルをさらにパワーアップさせてください。


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事で「できるようになる」こと

スポンサーリンク

エクセル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プロシージャについてもっと詳しく知りたい方は、以下の記事をご覧ください。
基礎から応用までわかりやすく解説しています!

あわせて読みたい
VBA Functionプロシージャ入門|コードを簡潔に効率化する方法 「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

このコードで使用している機能

使用結果

アイデア1処理結果

使用例

=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

このコードで使用している機能

使用結果

アイデア2の処理結果

使用例

=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

このコードで使用している機能

使用結果

アイデア3の処理結果

使用例

=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

このコードで使用している機能

使用結果

アイデア4の処理結果

具体的な使用例

スクロールできます
セル範囲関数入力結果
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」となっています。

ファイル形式を「Excelアドイン(*.xlam)」に変更して保存

アドインの設定を行う

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 NextIf IsError()を使用し、エラー発生時の処理を定義しておくと、トラブルを最小限に抑えられます。

例 : vbaコードをコピーするOn Error Resume Next ' エラーが発生しても無視

3. 他のユーザーとの共有時の注意点

注意ポイント : アドインを正しく配布する

関数を他のユーザーと共有する場合、アドインファイル(*.xlam)を一緒に配布し、各ユーザーが設定する必要があります。

ヒント: 手順書やスクリーンショットを添えて、設定方法を簡単に説明すると親切です。

対策 : バージョン互換性に注意

作成した関数はエクセルのバージョンによって動作しない場合があります。
特に古いバージョンのエクセルを使用している場合は、事前にテストを行いましょう。

4. ユーザー定義関数のパフォーマンスに注意

注意ポイント : 関数が多すぎると動作が遅くなる

シート上で大量のユーザー定義関数を使用すると、計算速度が低下することがあります。

対処法: 必要最小限の関数を利用し、処理が重い関数はサブルーチン(Sub)に切り替えるなど工夫しましょう。

対策 : 頻繁に再計算が発生しないように設計

ユーザー定義関数は、参照するセルの値が変更されるたびに再計算が行われます。
可能であれば、計算範囲を限定するか、手動で更新を行う設定にすると効率的です。

スポンサーリンク

この記事のまとめ

この記事では、エクセルVBAを使ってユーザー定義関数を作成し、業務効率化を図る方法を解説しました。

関数を自作する基本から応用例、他のファイルでも使えるようにするアドイン化の手順、注意点までを網羅しています。

以下のポイントをもう一度復習してみましょう!

ポイントのおさらい

さらに学ぶために

この記事でユーザー定義関数の基本を学んだら、次は業務の自動化や分析ツールの作成にも挑戦してみましょう!
VBAをマスターすれば、エクセルの可能性は無限大です。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次