EXCEL VBA Choose関数の使い方(数値に応じて値を返す・リストの値を返す)
EXCEL VBA Choose関数の使い方(数値に応じて値を返す・リストの値を返す)
今回は、Choose関数の取り扱い方法を説明いたします。Choose関数は、Select Caseステートメントと似ています。数値データからなる1から始まる連番数値に対して、テキストデータ(文字列等)を返します。Select Caseでは、複数条件を設定すると縦にプログラムが長くなってしまいますが、Choose関数を使う事で、プログラムをコンパクトにする事ができます。それでは、順番にサンプルプログラムを交えて説明いたします。
【参照ページ:Select Case】
index :1から 2・3・4・・何番目の選択肢を返すかを指定します。
Choice : indexに対応する数値で指定した番目の項目を返します。
【 使用例】
Ans = Choose(No,”東”,”西”,”南”,”北”)
Msgbox Ans※Noが1の場合、1番名の東が表示されます。
※Noが2の場合、2番名の西が表示されます。
※Noが3の場合、3番名の南が表示されます。
※Noが4の場合、4番名の北が表示されます。
【注意点】
Ans = Choose(No,”東”,”西”,”南”,”北”)
Msgbox Ans
※上記プログラムの場合、リストデータが(”東”,”西”,”南”,”北”)で範囲が1~4の間を指定します。この範囲外の0や5以上を指定するとエラーまたは、NULL(空白)を返します。
ランダムで作成された数値に該当する項目を返します。(振り分ける)
下記のサンプルプログラムは、ランダムで発生した数値に対して該当する項目を返します。今回は、乱数を発生させて「おみくじ」結果を表示させるサンプルプログラムです。
【プログラムの説明】
●整数1~7までの乱数を発生させます。
●乱数で発生させた整数により、おみくじの結果を表示させます。
●1:大吉 2:中吉 3:小吉 4:吉 5:末吉 6:凶 7:大凶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
' ''******** AKIRA55.COM ******* https://akira55.com/Choose/ ' Sub Choose01() 'ランダムで作成された数値に該当する項目を返します。(おみくじ) Dim KujiNo As Integer Dim Ans As String KujiNo = MsgBox("本日のおみぐじを引きますか?", vbYesNo) If KujiNo = vbYes Then KujiNo = Int((7 - 1 + 1) * Rnd + 1) '整数1~7までの乱数を発生します。 Ans = Choose(KujiNo, "大吉", "中吉", "小吉", "吉", "末吉", "凶", "大凶") '乱数に応じての項目を返します。 MsgBox "今日の運勢は、" & Ans & "です。" 'おみくじ(乱数)の結果をメッセージボックスにて表示します。 Else MsgBox "キャンセルしました。" End If End Sub ' ' |
(画面クリックして拡大)
数値データを該当するテキストデータ(項目)に自動変換します。(データ変換・別シートに転記)
下記のサンプルプログラムは、シート(変換前)に数値データのみデータ一覧が登録されており、このデータを元に、別シート(変換後)へ数値データをテキストデータに変換して転記するサンプルプログラムです。プログラム内に、数値データとテキストデータを紐づける為に、Choose関数を利用します。
【プログラムの説明】
①シート【変換前】には、数値データのみ登録されています。
②この数値データを参照して、プログラム内にChoose関数で登録されているテキストデータに変換して、別シート【変換後】へ転記します。
【プログラム実行条件】
●ワークシートを【変更前】・【変更後】に指定する。
●数値データは、下記の範囲にて登録します。
・勘定科目Noの範囲は、1~7まで「備消品費”, “通信運搬費”, “交通費”, “修繕費”, “諸手数料”, “雑費”, “交際費」
・支店Noの範囲は、1~6まで「”東京支店”, “札幌支店”, “水戸支店”, “浜松支店”, “高知支店”, “宮崎支店”」
・担当者Noの範囲は、1~5まで「”山本太郎”, “小池百合子”, “七海ひろこ”, “宇都宮健児”, “桜井誠”」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
' ''******** AKIRA55.COM ******* https://akira55.com/Choose/ ' Sub Choose02() '数値データを該当するテキストデータ(項目)に変換します。(データ変換) Dim ws01, ws02 As Worksheet Dim I, L, Ans, No, lRow As Integer Dim Ans_TexT As String Set ws01 = Worksheets("変換前") Set ws02 = Worksheets("変換後") Ans = MsgBox("データを変換しますか?", vbYesNo) If Ans = vbYes Then lRow = ws02.Cells(Rows.Count, "A").End(xlUp).Row 'シート(変換後)の最終行を取得します。 ws02.Range("A2:H" & lRow + 2).ClearContents 'シート(変換後)を文字列クリアーします。 lRow = ws01.Cells(Rows.Count, "A").End(xlUp).Row 'シート(変換前)の最終行を For L = 2 To lRow ws02.Cells(L, "A") = ws01.Cells(L, "A") '日付を転記します。(シート変換前⇒変換後) No = ws01.Cells(L, "B") Ans_TexT = Choose(No, "備消品費", "通信運搬費", "交通費", "修繕費", "諸手数料", "雑費", "交際費") '勘定科目NOから勘定科目名に転記します。(シート変換前⇒変換後) ws02.Cells(L, "B") = No ws02.Cells(L, "C") = Ans_TexT No = ws01.Cells(L, "C") Ans_TexT = Choose(No, "東京支店", "札幌支店", "水戸支店", "浜松支店", "高知支店", "宮崎支店") '支店NOから支店名に転記します。(シート変換前⇒変換後) ws02.Cells(L, "D") = No ws02.Cells(L, "E") = Ans_TexT No = ws01.Cells(L, "D") Ans_TexT = Choose(No, "山本太郎", "小池百合子", "七海ひろこ", "宇都宮健児", "桜井誠") '担当者NOから担当名に転記します。(シート変換前⇒変換後) ws02.Cells(L, "F") = No ws02.Cells(L, "G") = Ans_TexT ws02.Cells(L, "H") = ws01.Cells(L, "E") '金額を転記します。(シート変換前⇒変換後) Next L MsgBox "数値データからテキストデータに" & lRow & "件変換しました。" Else MsgBox "キャンセルしました。" End If End Sub ' ' |
(画面クリックして拡大)
テキストファイル(データ)の数値データから該当するテキストデータ(項目)に変換します。(データ変換)
下記のサンプルプログラムは、テキストファイル(データ)の数値データから該当するテキストデータ(項目)に変換するサンプルプログラムです。プログラム内に、数値データとテキストデータを紐づける為に、Choose関数を利用します。
【プログラムの説明】
①テキストファイルから数値データ(請求書データ)をシート(テキスト取り込み)に取り込みます。
②シート(テキスト取り込み)に取り込んだ数値データを元に、テキストデータに変換して、別シート(データ変換後)に転記します。
【プログラム実行条件】
●ワークシートを【テキスト取り込み】・【データ変換後】に指定する。
●数値データは、下記の範囲にて登録します。
・請求先Noの範囲は、1~5まで「東京電機株式会社”, “株式会社神奈川工業”, “大阪商事株式会社”, “大阪商事株式会社”, “株式会社埼玉金庫”」
・品名Noの範囲は、1~4まで「”人事給与ソフト”, “会計ソフト代”, “画像加工ソフト”, “動画編集ソフト”」
・担当者Noの範囲は、1~5まで「”山本”, “小池”, “七海”, “宇都宮”, “桜井”」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
' ''******** AKIRA55.COM ******* https://akira55.com/Choose/ ' Sub Choose03() 'テキストファイル(データ)の数値データから該当するテキストデータ(項目)に変換します。(データ変換) Dim ws01, ws02 As Worksheet Dim I, L, Ans, No, lRow As Integer Dim FileName, Ans_TexT, Inp_TexT As String Dim Text_Data As Variant Set ws01 = Worksheets("テキスト取り込み") Set ws02 = Worksheets("データ変換後") 'ダイアログで対象のて期すとファイルを開く(テキストファイル選択) FileName = Application.GetOpenFilename("TEXTファイル,*.txt") If FileName = False Then 'ダイアログボックスでキャンセルした場合 MsgBox "キャンセルしました。" Exit Sub End If I = 0 Open FileName For Input As #1 '選択したテキストファイルを開きます。 Do Until EOF(1) 'テキストファイルの内容をすべて読み込みます。 I = I + 1 Line Input #1, Inp_TexT Text_Data = Split(Inp_TexT, ",") 'カンマ毎に登録させているデータを別々の配列データとして分けます。 For L = 0 To UBound(Text_Data) '一行分の配列データとして登録されたデータ分繰り返します。 ws01.Cells(I, L + 1) = Text_Data(L) 'テキストファイルをセル毎に代入します。 Next L Loop Close #1 'テキストファイルを読み込んだので閉じます。 lRow = ws02.Cells(Rows.Count, "A").End(xlUp).Row 'シート「データ変換後」)の最終行を取得します。 ws02.Range("A2:G" & lRow + 2).ClearContents 'シート「データ変換後」)を文字列クリアーします。 lRow = ws01.Cells(Rows.Count, "A").End(xlUp).Row 'シート「テキスト取り込み」の最終行を取得します。 For L = 2 To lRow ws02.Cells(L, "A") = ws01.Cells(L, "A") '請求NOを転記します。(シート「テキスト取り込み」⇒「データ変換後」) No = ws01.Cells(L, "B") Ans_TexT = Choose(No, "東京電機株式会社", "株式会社神奈川工業", "大阪商事株式会社", "大阪商事株式会社", "株式会社埼玉金庫") '請求先NOから請求先名を転記します。(シート「テキスト取り込み」⇒「データ変換後」) ws02.Cells(L, "B") = Ans_TexT No = ws01.Cells(L, "C") Ans_TexT = Choose(No, "人事給与ソフト", "会計ソフト代", "画像加工ソフト", "動画編集ソフト") '品名NOから品名に転記します。(シート「テキスト取り込み」⇒「データ変換後」) ws02.Cells(L, "C") = Ans_TexT No = ws01.Cells(L, "D") Ans_TexT = Choose(No, "山本", "小池", "七海", "宇都宮", "桜井") '担当者NOから担当名に転記します。(シート「テキスト取り込み」⇒「データ変換後」) ws02.Cells(L, "D") = Ans_TexT ws02.Cells(L, "E") = ws01.Cells(L, "E") '単価を転記します。(シート「テキスト取り込み」⇒「データ変換後」) ws02.Cells(L, "F") = ws01.Cells(L, "F") '数量を転記します。(シート「テキスト取り込み」⇒「データ変換後」) ws02.Cells(L, "G") = ws02.Cells(L, "E") * ws02.Cells(L, "F") '合計金額を転記 = (単価×数量) Next L MsgBox "数値データからテキストデータに" & lRow - 1 & "件変換しました。" End Sub ' ' ' |
(画面クリックして拡大)
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。