【目次】
はじめに
Excelにない関数を自作するため、Excelマクロを使ってユーザー関数を作成しようと思ったが、暫く振りで忘れていたため、ネットで拾い集めた情報を寄せ集めて対応した。
MSは時々何の前触れもなく仕様を変える前科があるため、この先も同じ手順で対応できるとは限らないが、念のため、記事として残しておこうと思った次第。
なお、個別の質問・問い合わせには一切応じないので悪しからず。
記事を読む前提条件
今回使用した環境など
- Windows 11 Home バージョン 24H2
- Microsoft Excel for Microsoft 365 MSO(バージョン 2508 ビルド 16.0.19127.20192) 64ビット
- 記事内容は2025年9月時点のもの。将来変更される可能性もある。
Excelユーザー関数の自作手順
1. Excelのオプションで「開発」タブを有効にする。※任意
Excelのタブから「ファイル>その他...>オプション」と選び、オプションダイアログを開く。

「リボンのユーザー設定...」タブを選択し「リボンのユーザー設定」ペインの一覧にある「開発」にチェックを入れて「OK」ボタンを押下する。

2. Visual Basic Editorを起動する。
- キーボードショートカットを使用する場合は、Alt+F11キー。
- GUIの場合は「開発」タブの「Visual Basic」ボタンを押下する。

3. 標準モジュールを追加する。
ユーザー関数は標準モジュールに記述しないとワークシートで呼び出せないため、標準モジュールを追加する。
方法については以下2種類どちらを選んでも可。
【方法1】メニューバーから「挿入>標準モジュール」を選択して、標準モジュールを追加する。

【方法2】ツールバーから「ユーザーフォームの挿入>標準モジュール」を選択して、標準モジュールを追加する。

4. ユーザー関数を作成する。
以下は一例。セル内の特定文字を数えて数値で返すユーザー関数。
Public Function CharCount(val As String, char As String) As Long
'// 変数定義
'// ちなみにVBAのコメントは本来シングルクォートだけで良い
'// スラッシュを付けるのは他言語風にして見やすくするため
Dim counter As Long
Dim i As Long
'// カウンターの初期設定
counter = 0
'// 引数に値がある場合のみ処理を行う
If ((val <> "") Or (char <> "")) Then
'// 1つ目の引数の文字数でループ処理
For i = 1 To Len(val)
'// ループ変数で指定した文字位置の内容が、
'// 2つ目の引数の内容と同じ場合
If (Mid(val, i, 1) = char) Then
'// カウンターをインクリメントする
counter = counter + 1
End If
Next i
End If
'// VBAでは関数名に対して戻り値を渡す
CharCount = counter
End Function
今回は自分で使うだけなので、これ以上の細かい対応はしない。
なおデバッグ時は、イミディエイトウィンドウを表示して「Debug.Print」で出力して確認してみることをお勧めする。

5. セル内でユーザー関数を呼び出して利用する。
作成したユーザー関数の頭文字を数文字入力して、オートコンプリート(自動補完)でセル内に関数名が表示されたら無事成功。

表示されない場合は、Excelに認識されていない、もしくは関数名を間違えている可能性もあるので、適宜確認・修正する。
途中でも書いたが、ユーザー関数は標準モジュールに書かないと認識されない。
なおユーザー関数はExcelに元々存在するワークシート関数ではないため、処理速度に問題が発生する場合がある。
補足:マクロ付きファイルの保存は「.xlsm」形式で。
マクロが付いていると通常の「.xlsx」形式では保存できない。以下のようなダイアログが表示されると思う。

詳細は、ダイアログに記載されている内容に従って欲しい。
Excelマクロの注意点
Excelマクロは使い方によっては悪用できるため、企業の環境によってはグループポリシーでマクロが無効化されて使えない場合もある。念のため。