ユーザ定義関数は、《コード》ウィンドウに直接入力し、Functionプロシージャで定義する。通常の関数と同様にワークシートで使える。
実習では、ブック「ユーザ定義関数.xls」を開く。(これをコピーしたフォルダは、各自で設定したもの。テキストでは、c:\My Documentsとしている。)
ワークシートに作成した成績表の「得点」から「評価」を判別する関数を作成する。
シート「成績評価」を選択する。
VBエディタに切り替える。(メニュー《ツール》→《マクロ》→《Visual Basic Editor》あるいは、ショートカットキーでAlt+F11)
コードの最後に「function 成績評価(得点)」を入力する。(英数字やカッコ、カンマはすべて半角で入力すること。)
Select Case文の構文は、テキストのp.124-125を参照のこと。
コンパイルし(メニュー《デバッグ》→《VBAProjectのコンパイル》)、上書き保存する。
テキストでは、「評価」のセルを前の関数を書き換える形で実行している。しかし、評価のセルを別にして下の方の行に「変更可能評価」を作れば、異なる評価関数とその結果が対比できる。
ヘルプから
引数 arglist は、次の形式で指定します。
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
指定項目 内容
Optional 省略可能です。指定した引数が省略可能であることを示します。このキーワードを指定した場合、引数 arglist のそれ以降の引数も省略可能でなければならず、すべてキーワード Optional を付けて宣言する必要があります。キーワード ParamArray を使った場合は、どの引数に対してもキーワード Optional は指定できません。
ByVal 省略可能です。その引数が、値渡しで渡されることを示します。
ByRef 省略可能です。その引数が、参照渡しで渡されることを示します。Visual Basic では、既定値は ByRef です。
ParamArray 省略可能です。引数 arglist の最後の引数でのみ使用できます。その引数がバリアント型 (Variant) の要素を持つ省略可能 (Optional) な 配列であることを示します。キーワード ParamArray を使うと、任意の数の引数を渡すことができます。ByVal、ByRef、Optional の各キーワードと共に使うことはできません。
varname 必ず指定します。引数を表す変数名を指定します。変数の標準的な名前付け規則に従って指定します。
type 省略可能です。プロシージャに渡す引数のデータ型を指定します。バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、10 進型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String) (可変長のみ)、オブジェクト型 (Object)、バリアント型 (Variant) のいずれかを指定できます。パラメータにキーワード Optional が指定されていない場合は、ユーザー定義型またはオブジェクトの種類を指定することもできます。
defaultvalue 省略可能です。任意の定数または定数式を指定します。キーワード Optional を指定したパラメータに対してのみ有効です。データ型がオブジェクト型 (Object) の場合、明示的な既定値は Nothing だけです。
Optionalが付いた引数名では、漢字と数字の間の空白は不可。数式パレットやコードの窓を参照すると分かる。
Excelのワークシート関数(やユーザ定義関数)をもとに、ユーザ定義関数を作れる。
以下にヘルプからの引用を貼り付けた。
Visual Basic でワークシート関数を使用する
Visual Basic ステートメントでは、ほとんどのワークシート関数を使用できます。使用できるワークシート関数の一覧を表示するには、「Visual Basic で使用できるワークシート関数一覧」を参照してください。
メモ 一部のワークシート関数は、Visual Basic ではあまり使いません。たとえば、Visual Basic では & 演算子を使って複数の文字列を結合できるので、Concatenate 関数は使わなくても済みます。
Visual Basic からワークシート関数を呼び出す
Visual Basic では、WorksheetFunction オブジェクトを介して Excel ワークシート関数を使用できます。
次の Sub プロシージャは、Min ワークシート関数を使用してセル範囲の最小値を決定します。最初に、変数 myRange を Range オブジェクトとして宣言します。次に、この変数にシート 1 のセル範囲 A1:C10 を設定します。別の変数 answer には変数 myRange に Min 関数を適用した結果を割り当てます。最後に、変数 answer の値をメッセージ ボックスに表示します。
Sub UseFunction() Dim myRange As Range Set myRange = Worksheets("Sheet1").Range("A1:C10") answer = Application.WorksheetFunction.Min(myRange) MsgBox answer End Sub
VLOOKUP関数で、もとのデータが入力されていないとき、あるいは、検索の型が完全一致のときに入力したコードがコード表にないときにも、エラーが表示されないような関数を作る。
PupVLOOKUP(検索値,範囲,列番号,検索の型)
@VLOOKUP関数の機能をすべて包含する。
A「検索値」が空白のときは、「#N/A」ではなく、空白を返す。
B「検索の型」が「False(完全一致)」のとき、「検索値」と一致する値が「範囲」にない場合「#N/A」ではなく、「該当なし」を返す。
VBAでワークシート関数を利用するには、Application.WorksheetFunction.関数名(引数)とする。
Exit Functionを使って、VLookup関数を呼び出すのを1回にまとめた例 Function PupVLOOKUP2(検索値, 範囲, 列番号, Optional 検索の型 = 1) If 検索値 = "" Then PupVLOOKUP2 = "" Else If 検索の型 = 0 Then If 検索値 <> Application.WorksheetFunction.VLookup(検索値, 範囲, 1) Then PupVLOOKUP2 = "該当なし" Exit Function End If End If PupVLOOKUP2 = Application.WorksheetFunction.VLookup(検索値, 範囲, 列番号) End If End Function
三角形の面積計算のユーザ関数を使うと、面積の計算自体はブラックボックスにでき、すこし簡単になる。あとは、ワークシートの関数Round()を使えば良い。
小数部桁数を引数に追加することになる。この引数をワークシートの関数Round()でも使う。
単純に、1万円札1枚を1000円札10枚に両替するので良い。(実際には、金額が10000円未満のときは、これでは正しくない。)
単純に、1万円札の指定枚数を1000円札10*指定枚数に両替するので良い。(実際には、金額が指定枚数万円未満のときは、これでは正しくない。)
Select Case ブロックを2重に使うことになる。(型、得点範囲)。ただし、1つが出来たら、コピーして評価の文字を編集すればよい。
データがあるか否かは、countで分かるが、数値か否かは、どうすればよいであろうか?
「実行式」に、実際の計算式を指定できるので、汎用的な関数ができる。
フォーム機能を使って、ワークシートにデータを入力するマクロの作成を学習する
フォームとは、ユーザが作ることのできるダイアログボックスで、このフォームにテキストボックスやボタンなどのコントロールを配置する。これらのコントロールは、それぞれオブジェクト名を付けることができる。このオブジェクト名を指定して。VBAの命令で、ワークシートの値をフォームに代入したり、フォームに入力した値をワークシートに転送したりすることができる。
イベントとは、出来事のことで、イベントをきっかけにVBAのプログラムを動かす。「クリック時」(Click)や「ダブルクリック時」(Dbclick)、「変更時」(change)などがあり、対象のコントロールがどのようなアクションを起こしたら、プログラムを起動するかを定義する。
標準のオブジェクト名(番号付)が付くが、変更するには、《プロパティ》ウィンドウの「オブジェクト名」に直接入力する。
データが文字のときの「+」は、「文字の結合」を意味する。 加算をしたいときには、文字データを数値データに変える「Val関数」を使って数値データに変換してから計算をする。
標題を変更するには、《プロパティ》ウィンドウの《キャプション》プロパティに直接入力するか、VBAの中で、Captionに代入する。
以上