2001年1月11日新規作成
  関谷トップページへ トップページへ

No.26 ExcelVBA 「第7章ユーザ定義関数(つづき)、第8章フォーム」

2001.1.11 関谷

第7章 ユーザ定義関数(つづき)

 ユーザ定義関数は、《コード》ウィンドウに直接入力し、Functionプロシージャで定義する。通常の関数と同様にワークシートで使える。
 実習では、ブック「ユーザ定義関数.xls」を開く。(これをコピーしたフォルダは、各自で設定したもの。テキストでは、c:\My Documentsとしている。)

7-4 成績評価関数を作成する

7-4-1 成績表の評価計算

 ワークシートに作成した成績表の「得点」から「評価」を判別する関数を作成する。

7-4-2 Functionプロシージャ「成績評価」の作成

 シート「成績評価」を選択する。
 VBエディタに切り替える。(メニュー《ツール》→《マクロ》→《Visual Basic Editor》あるいは、ショートカットキーでAlt+F11)
 コードの最後に「function 成績評価(得点)」を入力する。(英数字やカッコ、カンマはすべて半角で入力すること。)
 Select Case文の構文は、テキストのp.124-125を参照のこと。
 コンパイルし(メニュー《デバッグ》→《VBAProjectのコンパイル》)、上書き保存する。

7-4-3 ユーザ定義関数「成績評価」の利用

7-5 成績評価変更可能関数を作成する

7-5-1 成績評価変更可能関数の作成

7-5-2 Functionプロシージャ「成績評価変更可能」の作成

7-5-3 ユーザ定義関数「成績評価変更可能」の利用

 テキストでは、「評価」のセルを前の関数を書き換える形で実行している。しかし、評価のセルを別にして下の方の行に「変更可能評価」を作れば、異なる評価関数とその結果が対比できる。

7-6 成績評価省略可能関数を作成する

 ヘルプから
引数 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 だけです。

7-6-1 成績評価省略可能関数の作成

7-6-2 Functionプロシージャ「成績評価省略可能」の作成

 Optionalが付いた引数名では、漢字と数字の間の空白は不可。数式パレットやコードの窓を参照すると分かる。

7-6-3 ユーザ定義関数「成績評価省略可能」の利用

7-7 高機能表引きPupVLOOKUP関数を作成する

7-7-1 ワークシート関数とユーザ定義関数

 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

7-7-2 高機能表引きPupVLOOKUPの仕様

 VLOOKUP関数で、もとのデータが入力されていないとき、あるいは、検索の型が完全一致のときに入力したコードがコード表にないときにも、エラーが表示されないような関数を作る。

 PupVLOOKUP(検索値,範囲,列番号,検索の型)
@VLOOKUP関数の機能をすべて包含する。
A「検索値」が空白のときは、「#N/A」ではなく、空白を返す。
B「検索の型」が「False(完全一致)」のとき、「検索値」と一致する値が「範囲」にない場合「#N/A」ではなく、「該当なし」を返す。

7-7-3 Functionプロシージャ「PupVLOOKUP」の作成の準備

 VBAでワークシート関数を利用するには、Application.WorksheetFunction.関数名(引数)とする。

7-7-4 Functionプロシージャ「PupVLOOKUP」の作成

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

7-6-5 ユーザ定義関数「PupVLOOKUP」の利用

7-8 ユーザ定義の練習問題

Q4 ユーザ定義関数「3角形の面積小数部1桁」

 三角形の面積計算のユーザ関数を使うと、面積の計算自体はブラックボックスにでき、すこし簡単になる。あとは、ワークシートの関数Round()を使えば良い。

Q5 ユーザ定義関数「3角形の面積小数部桁数」

 小数部桁数を引数に追加することになる。この引数をワークシートの関数Round()でも使う。

Q6 ユーザ定義関数「金種計算万円両替」

 単純に、1万円札1枚を1000円札10枚に両替するので良い。(実際には、金額が10000円未満のときは、これでは正しくない。)

Q7 ユーザ定義関数「金種計算万円指定」

 単純に、1万円札の指定枚数を1000円札10*指定枚数に両替するので良い。(実際には、金額が指定枚数万円未満のときは、これでは正しくない。)

Q8 ユーザ定義関数「成績評価改」(評価を"A","B","C","D"か"優","良","可","不可"か)

 Select Case ブロックを2重に使うことになる。(型、得点範囲)。ただし、1つが出来たら、コピーして評価の文字を編集すればよい。

Q9 ユーザ定義関数「PupSUM」

 データがあるか否かは、countで分かるが、数値か否かは、どうすればよいであろうか?

Q10 ユーザ定義関数「税別金額」「税込金額」

Q11 ユーザ定義関数「空白非表示」(引数は「空白可能セル」と「実行式」)

 「実行式」に、実際の計算式を指定できるので、汎用的な関数ができる。


第8章フォーム

 フォーム機能を使って、ワークシートにデータを入力するマクロの作成を学習する

8-1 フォームとは

8-1-1 フォームとコントロール

フォームとは、ユーザが作ることのできるダイアログボックスで、このフォームにテキストボックスやボタンなどのコントロールを配置する。これらのコントロールは、それぞれオブジェクト名を付けることができる。このオブジェクト名を指定して。VBAの命令で、ワークシートの値をフォームに代入したり、フォームに入力した値をワークシートに転送したりすることができる。

8-1-2 イベント

 イベントとは、出来事のことで、イベントをきっかけにVBAのプログラムを動かす。「クリック時」(Click)や「ダブルクリック時」(Dbclick)、「変更時」(change)などがあり、対象のコントロールがどのようなアクションを起こしたら、プログラムを起動するかを定義する。

8-1-3 オブジェクト名

標準のオブジェクト名(番号付)が付くが、変更するには、《プロパティ》ウィンドウの「オブジェクト名」に直接入力する。

8-1-4 テキストボックス

データが文字のときの「+」は、「文字の結合」を意味する。 加算をしたいときには、文字データを数値データに変える「Val関数」を使って数値データに変換してから計算をする。

Point プロパティへの値の代入と《Value》プロパティ

Point Val関数

8-1-5 チェックボックス

 標題を変更するには、《プロパティ》ウィンドウの《キャプション》プロパティに直接入力するか、VBAの中で、Captionに代入する。

8-1-6 ラベル

8-1-7 コマンドボタン

参考 《ツールボックス》

8-2 採点用フォームの構想を練る

8-2-1 採点用フォームを作成する

8-2-2 フォームの設計(外部仕様の検討)

8-3 採点用フォームを作成する

8-3-1 フォームの原型の作成

8-3-2 テキストボックスの配置

8-3-3 ラベルの配置

8-3-4 採点用テキストボックスとチェックボックスの配置

8-3-5 「移動」ボタンの配置

8-3-6 「閉じる」ボタンの配置

8-3-7 オブジェクト名の設定

8-4 フォームを設計する(内部仕様)

8-4-1 内部仕様

8-4-2 フォームを開く

8-4-3 フォームを開くとき

8-4-4 チェックボックスのクリック時

8-4-5 「点数」テキストボックスに変化が生じた場合

8-4-6 下へ移動ボタンのクリック時

8-4-7 上へ移動ボタンのクリック時

8-4-8 閉じるボタンのクリック時

8-5 プログラムを作成する

8-5-1 「採点用フォームを開く」プログラムの作成

8-5-2 マクロボタンの作成

8-5-3 フォームが開くときのプログラムの作成

8-5-4 「チェックボックスのクリック時」のプログラムの作成

8-5-5 「点数テキストボックスの更新時」のプログラムの作成

8-5-6 「データの書き込み」プログラムの作成

8-5-7 「下へ移動ボタンのクリック時」のプログラムの作成

8-5-8 「上へ移動ボタンのクリック時」のプログラムの作成

8-5-9 「閉じるボタンのクリック時」のプログラムの作成

8-5-10 動作の確認

8-6 プログラムを評価して設計を変更する

8-7 システムを仕上げて運用する

8-8 練習問題

以上