Excel VBA自作関数サンプル集!実務で役立つプロシージャ設計と関数活用術
生徒
「VBAの基本は分かりましたが、実際に仕事で使える便利な関数を自分で作ってみたいです。どんなものを作れば効率が上がりますか?」
先生
「実務では、文字列の加工や日付の計算、データの変換などが頻繁に登場します。これらを自作関数(User Defined Function)としてまとめておくと、作業が劇的に楽になりますよ。」
生徒
「自作関数……。エクセルに最初から入っているSUM関数などのように、自分で新しい関数を作れるということですか?」
先生
「その通りです!一度作れば何度も使い回せる、実務に即した最強のサンプル集を一緒に見ていきましょう。」
1. 自作関数(Function)とは?業務効率化の強力な味方
Excel VBAでいう関数(Functionプロシージャ)とは、何か特定の「材料」を渡すと、それを加工して「結果」を返してくれる自動調理器のようなものです。プログラミング未経験の方には、エクセル標準の VLOOKUP や IF 関数を自分で手作りできる機能だと想像してもらうと分かりやすいでしょう。
仕事で「いつも同じ文字の抜き出し作業をしている」「複雑な日付計算を何度も繰り返している」といった悩みがあるなら、それを一つの関数にまとめてしまいましょう。これを関数設計と呼びます。一度設計してしまえば、あとは名前を呼び出すだけで一瞬で処理が終わるようになり、ミスも大幅に減らすことができます。ここでは、文字列、日付、検索、変換という四つの分野から、すぐに使えるサンプルを紹介します。
2. 文字列を自由に操る!名字だけを抜き出す関数
名簿などのデータで、「苗字と名前がスペースで区切られているけど、名字だけを抽出したい」という場面は多いですよね。これを自動で行う関数を作ってみましょう。文字列を扱うときは String(ストリング)という型を使います。文字の集まりを意味する言葉です。
' フルネームから名字(スペースより前の文字)を取り出す関数
Function GetLastName(fullName As String) As String
Dim spacePos As Integer
' スペースが何番目にあるかを探す
spacePos = InStr(fullName, " ")
If spacePos > 0 Then
' スペースより前の文字を抜き出す
GetLastName = Left(fullName, spacePos - 1)
Else
' スペースがない場合はそのまま返す
GetLastName = fullName
End If
End Function
' 使い方を確認するプログラム
Sub TestString()
Dim myName As String
myName = "田中 太郎"
MsgBox "名字は「" & GetLastName(myName) & "」です。"
End Sub
この関数を使えば、何千人といる名簿からでも一瞬で名字だけをリストアップできます。InStr(インストリング)は文字を探す命令、Left(レフト)は左から文字を切り取る命令です。これらを組み合わせるのが文字列操作の基本です。
3. 日付の計算をマスター!締め日を求める関数
事務仕事で欠かせないのが「締め日」の計算です。例えば、「今日の日付から、今月末が何日になるか」を自動で出してくれる関数があると便利ですよね。日付を扱うときは Date(デイト)型を使います。これは、カレンダーの情報を正しく管理するための専用の箱です。
' 指定した日付の「月末日」を求める関数
Function GetEndOfMonth(targetDate As Date) As Date
' 翌月の1日の「1日前」を計算することで月末を出す
GetEndOfMonth = DateSerial(Year(targetDate), Month(targetDate) + 1, 0)
End Function
' 実行結果を表示する
Sub ShowDeadline()
Dim today As Date
today = Date ' 今日の日付を取得
MsgBox "今月の締め日は " & GetEndOfMonth(today) & " です。"
End Sub
この DateSerial(デイトシリアル)という命令は、年・月・日を指定して日付を作るものですが、日にちに「0」を指定すると「前月の末日」になるという面白い性質を持っています。こうした日付関数のテクニックを知っておくと、複雑なスケジュール管理も自動化できます。
4. データの変換を自動化!数値から判定結果を返す
「テストの点数が80点以上なら『合格』、それ以外なら『不合格』」といった変換処理も、関数にしておくと便利です。数値を文字に変換する設計ですね。判定結果によって言葉を返すので、戻ってくる値は文字型(String)になります。
' 点数に応じて「合格・不合格」の文字を返す関数
Function JudgeScore(score As Integer) As String
If score >= 80 Then
JudgeScore = "合格"
Else
JudgeScore = "不合格"
End If
End Function
' 使い方の例
Sub CheckMyScore()
Dim myPoint As Integer
myPoint = 85
MsgBox "判定は " & JudgeScore(myPoint) & " です!"
End Sub
このように、一つのプロシージャを独立させておくことで、もし合格ラインが70点に変わっても、一箇所の数字を直すだけで全ての処理を修正できるというメリットがあります。これを保守性が高いと言います。
5. 検索と存在チェック!シートがあるか確認する関数
VBAでシートを操作するとき、その名前のシートが本当に存在するか確認しないとエラーで止まってしまうことがあります。「検索」の技術を使って、シートの有無を「YesかNoか」で教えてくれる関数を作ってみましょう。「Yes/No」を表すのは Boolean(ブーリアン)という型です。
' 指定した名前のシートがあるか探す関数
Function SheetExists(sheetName As String) As Boolean
Dim ws As Worksheet
SheetExists = False ' 最初は「ない」と決めておく
' 全てのシートを順番にチェック
For Each ws In ThisWorkbook.Worksheets
If ws.Name = sheetName Then
SheetExists = True ' 見つかったら「ある」にする
Exit Function
End If
Next ws
End Function
' 実行結果のテスト
Sub CheckSheet()
If SheetExists("売上データ") Then
MsgBox "シートが見つかりましたので、作業を開始します。"
Else
MsgBox "エラー:売上データシートが存在しません!"
End If
End Sub
For Each(フォーイーチ)は、たくさんのデータ(ここではシート)を一つずつ順番に調べるための繰り返しの命令です。実務での検索処理では非常に頻繁に使われる重要なテクニックです。
6. エクセル画面でも使える「ユーザー定義関数」
これまで紹介した Function で作った自作関数は、なんとエクセルのセルの中に直接入力して使うこともできます。例えば、セルに =GetLastName(A1) と入力すれば、A1セルの氏名から名字だけが表示されます。
パソコンの操作に不慣れな同僚に「この関数を使ってね」と教えるだけで、複雑なマクロの知識がなくてもあなたの作った便利な機能を使ってもらえるようになります。これはVBAによるアドイン設計の第一歩でもあります。セルで使う関数を作る際は、計算が重くならないよう、シンプルで高速な処理を心がけるのがコツです。実務の現場では、この機能が最も喜ばれることが多いですよ。
7. 変換の応用:数値の端数を綺麗に整える
四捨五入や切り捨てなど、数値を特定の形式に変換する処理も実務では必須です。VBA標準の Round 関数は少し特殊な動き(銀行丸め)をするため、私たちが普段使う「四捨五入」を正確に行う関数を作っておくと安心です。
' 指定した桁で正しく四捨五入する関数
' エクセルのワークシート関数(Round)をVBAから呼び出して使います
Function MyRound(num As Double, digit As Integer) As Double
MyRound = Application.WorksheetFunction.Round(num, digit)
End Function
' 実行例
<pre><code class="language-">
Sub TestRound()
MsgBox "123.456を小数第1位で四捨五入すると " & MyRound(123.456, 1)
End Sub
Application.WorksheetFunction を使うと、エクセルでおなじみの関数をVBAの中でも借りてくることができます。一から全て作らなくても、既存の便利な機能を組み合わせるのが賢い関数設計の秘訣です。これにより、計算ミスを最小限に抑えつつ、効率的にプログラミングが進められます。
8. エラーに強い関数を作るための「戻り値」の工夫
関数を作るとき、もし計算ができなかった場合にどんな「結果(戻り値)」を返すかも重要です。例えば、割り算の関数で「0で割る」ようなミスが起きたとき、エラーで止まるのではなく「0」や「エラー」という文字を返すように設計します。
このように、あらかじめ失敗を予想して対策を練っておくことを例外処理と呼びます。プログラミング未経験の方は、まず「もしダメだったら何を返すか」をセットで考える癖をつけましょう。これだけで、他の人があなたのプログラムを使ったときに「何だかよく分からないけど止まっちゃった」というトラブルを防ぐことができるようになります。親切な設計が、信頼されるツールを生みます。
9. 文字列のクリーニング!不要な空白を取り除く
外部のシステムからダウンロードしたデータには、文字の前後になぜか「空白(スペース)」が入っていることがよくあります。これがあると、検索がうまくいかなかったり、見た目が悪かったりします。これを一括で掃除する変換関数も実務の定番です。
' 文字列の前後の空白を消し、さらに全角スペースも半角にする関数
Function CleanText(txt As String) As String
Dim temp As String
' 前後の空白を削除
temp = Trim(txt)
' 全角スペースを半角スペースに変換(Replace関数)
CleanText = Replace(temp, " ", " ")
End Function
Sub RunClean()
Dim dirtyTxt As String
dirtyTxt = " エクセル 太郎 "
MsgBox "お掃除後:「" & CleanText(dirtyTxt) & "」"
End Sub
Trim(トリム)は両端を削る、Replace(リプレイス)は置き換えるという意味です。こうしたテキストクリーニングの関数は、データ分析の前処理として非常に重宝されます。綺麗なデータこそ、正しい分析の第一歩です。
10. 関数を組み合わせて「自分専用ツール箱」を作ろう
一つ一つの関数は小さくても、これらを組み合わせることで、どんな複雑な業務も自動化できるようになります。今日紹介したサンプルは、言わば「部品」です。名字を取り出す部品、日付を計算する部品、データを掃除する部品……これらをパズルのように組み合わせるのが、VBAによるシステム開発の楽しさです。
最初はコードをコピーして貼り付けるだけでも構いません。実際に動かしてみて、「ここの数字を変えたらどうなるかな?」と試行錯誤するうちに、自然と理屈が分かってきます。パソコンに詳しくない方でも、日常の小さな不便を解決する関数を作ることで、エクセルの作業はもっと楽しく、創造的なものに変わります。ぜひ、あなただけの「実務関数サンプル集」を育てていってくださいね!