スポンサーリンク

050-VBA

Excelで長い「if関数」からおさらば!ユーザー定義関数を使って関数を楽々作る方法!

長い「if関数」は、勘弁してほしい!

さて、人事異動等で業務を引き継ぐと、前任者が作ったExcel(エクセル)ファイルを使う場面が良くあります。

そのまま使えれば良いのですが多くの場合、法令変わったりして条件を変更する必要が出てきます・・・

が、「if関数」が長いと見る気も失せ、解読する気にもなれません・・・

酷い場合は画面からはみ出て式が全部見えない程です。

止むを得ず式をコピーしてメモ帳に貼り付け、解読を試みますが・・・

正直嫌になる事が多いです・・・

こういう経験をされた方は結構多いのではないでしょうか?

そういう場合の為にExcelには「ユーザー定義関数」という、自分で自由自在に関数を作れる機能があります。

特に「長いif関数」を使わなければならない場合は、この「ユーザー定義関数」を使うことで、関数のメンテナンスの負荷がかなり軽減されます。

実際にユーザー定義関数を作ってみよう!

実際にユーザー定義関数を作るには、まずEXCELで「開発タブ」を、表示させる必要があります。

「開発タブ」の表示のさせかた

Excelを開き
 ↓
ファイル
 ↓
オプション
 ↓
リボンのユーザー設定
 ↓
開発にチェックを入れる

以上で、「開発」タブが表示されます。

開発タブを表示させないと使えないよ!

次に「ファイル」の「名前を付けて保存」を選び、ファイルの種類を「Excel マクロ有効ブック(*.xlsm)」を選択し、任意の名前でファイルを保存してください。

これで準備は完了です。

ここからいよいよユーザー定義関数を作成していきます。

開発タブ
 ↓
Visual Basic
 ↓
挿入を選択
 ↓
標準モジュール追加

で「標準モジュール」が追加されます。

開発タブから Visual Basic を選択
標準モジュールを追加

次に追加された標準モジュールを開き

*****コードここから*****

Function ユーザー定義関数(変数1, 変数2)

 ユーザー定義関数 = 変数1 + 変数2

End Function

*****コードここまで*****

こんな感じです

と入力し保存してください。

このユーザー定義関数の意味は次のとおりです。

「ユーザー定義関数」 → 関数の名前(名称は何でもよい)

「変数1」・「変数2」 → 関数に渡す値(引数)(名称は何でもよい)

つまり、

ユーザー定義関数 = 変数1 + 変数2 は、

「変数1」と「変数2」を足した値を「ユーザー定義関数」に返すという意味となります。

作った「ユーザー定義関数」の使い方

下図の様に、任意のエクセルの2つのセルに数字を入れてください。

事例では、「B1」と「C1」になります。

B1とC1に任意の数字を入力する

結果を表示させたいセルを選択し「関数ボタン」押し「関数の挿入」から「ユーザー定義」を選びます。

「fx」をクリックし、「ユーザー定義」を選択

「ユーザー定義」の中に先ほど作った「ユーザー定義関数」という名称の関数がありますので、それを選択します。

「ユーザー定義」から作成したユーザー定義関数(この場合は「ユーザー定義関数」)を選択する

「関数の引数」画面が表示されますので、「変数1」と「変数2」に、先ほど数字を入力した、任意の2つのセルをそれぞれ選択します。

結果が表示されます。

これがユーザ―定義関数!

これがユーザー定義関数の基本です。

スポンサーリンク

長い「if関数」をユーザー定義関数に変えてみる

次に長い「if関数」をユーザー定義関数に変えてみます。

例題:社員の当月の売上に応じてランクを入れる場合を想定しています。

当月の売上が

100,000円以上 200,000円未満なら ランクI
200,000円以上 300,000円未満なら ランクH
300,000円以上 400,000円未満なら ランクG
400,000円以上 500,000円未満なら ランクF
500,000円以上 600,000円未満なら ランクE
600,000円以上 700,000円未満なら ランクD
700,000円以上 800,000円未満なら ランクC
800,000円以上 900,000円未満なら ランクB
900,000円以上 1,000,000円未満なら ランクA
1,000,000円以上なら ランクS
100,000円未満なら ランク外

といった具合です。

if式の場合は?

これを「if式」で作成するとどうなりますか・・・?

=IF(C6<100000,"ランク外",IF(C6<200000,"I",IF(C6<300000,"H",IF(C6<400000,"G",IF(C6<500000,"F",IF(C6<600000,"E",IF(C6<700000,"D",IF(C6<800000,"C",IF(C6<900000,"B",IF(C6<1000000,"A","S"))))))))))

下図のエクセルのとおり「やたらと長い式」になります。

やたらと長い式となる

これはまだ簡単な例ですが条件分岐が多くなればなるほど、訳が分からなくなります。

ユーザー定義関数の場合は?

先ほどと同様に

開発タブ
 ↓
Visual Basic
 ↓
挿入を選択
 ↓
標準モジュール追加

で、「標準モジュール」が追加されます。

次に追加された、標準モジュールを開き

*****コードここから*****

Function 売上ランク2(売上2)

	If 売上2 < 100000 Then
	売上ランク2 = "ランク外"
	ElseIf 売上2 >= 100000 And 売上2 < 200000 Then
	売上ランク2 = "I"
	ElseIf 売上2 >= 200000 And 売上2 < 300000 Then
	売上ランク2 = "H"
	ElseIf 売上2 >= 300000 And 売上2 < 400000 Then
	売上ランク2 = "G"
	ElseIf 売上2 >= 400000 And 売上2 < 500000 Then
	売上ランク2 = "F"
	ElseIf 売上2 >= 500000 And 売上2 < 600000 Then
	売上ランク2 = "E"
	ElseIf 売上2 >= 600000 And 売上2 < 700000 Then
	売上ランク2 = "D"
	ElseIf 売上2 >= 700000 And 売上2 < 800000 Then
	売上ランク2 = "C"
	ElseIf 売上2 >= 800000 And 売上2 < 900000 Then
	売上ランク2 = "B"
	ElseIf 売上2 >= 900000 And 売上2 < 1000000 Then
	売上ランク2 = "A"
	Else: 売上ランク2 = "S"
	End If

End Function

*****コードここまで*****

次はこれです!

と入力し保存してください。

このユーザー定義関数の意味は、次のとおりです。

「売上ランク2」 → 関数の名前(名称は何でもよい)

「売上2」 → 関数に渡す値(引数)(名称は何でもよい)

つまり、

「売上2」の数字の大きさに応じて「売上ランク2」に「A~I・ランク外」を、返すとう意味となります。

どうでしょう!

大分見やすくなったと思いませんか?

使い方は先程と同様に

結果を表示させたいセルを選択し「関数ボタン」を押し「関数の挿入」から「ユーザー定義」を選びます。

「ユーザー定義」の中に先ほど作った「売上ランク2」という名称の関数がありますので、それを選択します。

「関数の引数」画面が表示されますので「売上2」にセクセル表内の「当月売上額」を選択します。

但し、これでは今後万が一「各ランクに対する売上の範囲」が変わった場合には「Visual Basic」を開きコードを変更する必要が出てきます。

これでも、「長いif関数」を直す事に比べればかなり楽ですが、どうせならもう1歩踏み込んでさらに楽にしましょう。

ユーザー定義関数で使用する条件範囲をセクセルのシートから持ってくる方法!

さて例題のおさらいです。

例題では社員の当月の売上に応じてランクを入れる場合を想定していました。

条件は次のとおり当月の売上に応じてランクを表示させるです。

100,000円以上 200,000円未満なら ランクI
200,000円以上 300,000円未満なら ランクH
300,000円以上 400,000円未満なら ランクG
400,000円以上 500,000円未満なら ランクF
500,000円以上 600,000円未満なら ランクE
600,000円以上 700,000円未満なら ランクD
700,000円以上 800,000円未満なら ランクC
800,000円以上 900,000円未満なら ランクB
900,000円以上 1,000,000円未満なら ランクA
1,000,000円以上なら ランクS
100,000円未満なら ランク外

この表をあらかじめエクセルの別シートに作成しておき「ユーザー定義関数」がその表を自動で参照する様にしておけば、今後万が一「各ランクに対する売上の範囲」が変わったとしてもこの「別シートに作成した表」を修正するだけで済みます。

作成した「別シートの表」は下図のとおりです。

次に「ユーザー定義関数」を作成します。

先程と同様に

開発タブ
 ↓
Visual Basic
 ↓
挿入を選択
 ↓
標準モジュール追加

で「標準モジュール」が追加されます。

次に追加された標準モジュールを開き

*****コードここから*****

Function 売上ランク(売上)

	Dim 売上NO1 As Long
	Dim 売上NO2 As Long
	Dim 売上NO3 As Long
	Dim 売上NO4 As Long
	Dim 売上NO5 As Long
	Dim 売上NO6 As Long
	Dim 売上NO7 As Long
	Dim 売上NO8 As Long
	Dim 売上NO9 As Long
	Dim 売上NO10 As Long

	Dim rank1 As String
	Dim rank2 As String
	Dim rank3 As String
	Dim rank4 As String
	Dim rank5 As String
	Dim rank6 As String
	Dim rank7 As String
	Dim rank8 As String
	Dim rank9 As String
	Dim rank10 As String

	売上NO1 = Worksheets("範囲表").Cells(5, 2).Value
	売上NO2 = Worksheets("範囲表").Cells(6, 2).Value
	売上NO3 = Worksheets("範囲表").Cells(7, 2).Value
	売上NO4 = Worksheets("範囲表").Cells(8, 2).Value
	売上NO5 = Worksheets("範囲表").Cells(9, 2).Value
	売上NO6 = Worksheets("範囲表").Cells(10, 2).Value
	売上NO7 = Worksheets("範囲表").Cells(11, 2).Value
	売上NO8 = Worksheets("範囲表").Cells(12, 2).Value
	売上NO9 = Worksheets("範囲表").Cells(13, 2).Value
	売上NO10 = Worksheets("範囲表").Cells(14, 2).Value
	売上NO0 = Worksheets("範囲表").Cells(15, 2).Value

	rank1 = Worksheets("範囲表").Cells(5, 4).Value
	rank2 = Worksheets("範囲表").Cells(6, 4).Value
	rank3 = Worksheets("範囲表").Cells(7, 4).Value
	rank4 = Worksheets("範囲表").Cells(8, 4).Value
	rank5 = Worksheets("範囲表").Cells(9, 4).Value
	rank6 = Worksheets("範囲表").Cells(10, 4).Value
	rank7 = Worksheets("範囲表").Cells(11, 4).Value
	rank8 = Worksheets("範囲表").Cells(12, 4).Value
	rank9 = Worksheets("範囲表").Cells(13, 4).Value
	rank10 = Worksheets("範囲表").Cells(14, 4).Value
	rank0 = Worksheets("範囲表").Cells(15, 4).Value

	If 売上 < 売上NO0 Then
	    売上ランク = rank0
	ElseIf 売上 >= 売上NO1 And 売上 < 売上NO2 Then
	    売上ランク = rank1
	ElseIf 売上 >= 売上NO2 And 売上 < 売上NO3 Then
	    売上ランク = rank2
	ElseIf 売上 >= 売上NO3 And 売上 < 売上NO4 Then
	    売上ランク = rank3
	ElseIf 売上 >= 売上NO4 And 売上 < 売上NO5 Then
	    売上ランク = rank4
	ElseIf 売上 >= 売上NO5 And 売上 < 売上NO6 Then
	    売上ランク = rank5
	ElseIf 売上 >= 売上NO6 And 売上 < 売上NO7 Then
	    売上ランク = rank6
	ElseIf 売上 >= 売上NO7 And 売上 < 売上NO8 Then
	    売上ランク = rank7
	ElseIf 売上 >= 売上NO8 And 売上 < 売上NO9 Then
	    売上ランク = rank8
	ElseIf 売上 >= 売上NO9 And 売上 < 売上NO10 Then
	    売上ランク = rank9
	Else: 売上ランク = rank10
	End If

End Function

*****コードここまで*****

ちょっと長いですが・・・
頑張ってください・・・

と入力し保存してください。

ちょっとコードが長いですが頑張ってください。

このユーザー定義関数の意味は、次のとおりです。

まず、コード内の変数(引数)にセクセルシート表内の数字等を、参照させる為に変数を定義する必要があります。

Dim 売上NO1 As Long 

は、変数「売上NO1」は「LONG・長整数型」であるという意味です。

次に、

売上NO1 = Worksheets(“範囲表”).Cells(5, 2).Value

は、「売上NO1」には、ワークシート「範囲表」から「B5」の値を代入するという意味です。

最後に

「売上ランク」 → 関数の名前(名称は何でもよい)

「売上」 → 関数に渡す値(引数)(名称は何でもよい)

つまり、

「売上」の数字の大きさに応じて「売上ランク」に「A~I・ランク外」を返すとう意味となります。

どうでしょう!

かなり関数のメンテナンスが楽になったと思いませんか?

使い方は先程と同様に

結果を表示させたいセルを選択し「関数ボタン」を押し「関数の挿入」から「ユーザー定義」を選びます。

「ユーザー定義」の中に先ほど作った「売上ランク」という名称の関数がありますので、それを選択します。

「関数の引数」画面が表示されますので「売上」にエクセル表内の「当月売上額」を選択します。

以上で完了です。

コードを書くことに慣れていないと、最初は難しいイメージを持つかと思います。

しかし、一度書いたコードをメモ帳等に保存しておけば、別のエクセルでも再利用可能です。

また案外仕事でよく使う関数なんて、結果的にはある程度絞られ「10~20個」くらいで納まることが多いです。

多くの場合は、「if関数を使った条件分岐式」ですので1つ作ってしまえば、それを直して再利用するという「リバースエンジニア」的な作り方で増やしていけます。

やってみると案外簡単です。

「長いif関数」に困っている方は、是非トライしてみてください。

例題のエクセルはこちらからダウンロードできます!ご自由にどうぞ!

まとめ

「長いif関数」は、ユーザー定義関数で一発解決!

ユーザー定義関数を使えば、関数のメンテナンスも楽々!

1つ作っておけば、いろいろと応用可能!

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

スポンサーリンク
スポンサーリンク

-050-VBA

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

EXCELやACCESSの関数やVBA・SQL文等の忘備録まとめ!

このページでは、管理人が良く使う次のソフト MS-EXCEL(エクセル) MS-ACCESS(アクセス) Oracle(オラクル)SQL について、良く使うけれどもすぐに忘れて、何度も調べ「関数やVB …