トップ > スキル : アプリケーション > VBA for Excel > 応用編(関数の利用)

VBA_EXCEL

関数の利用

Excelで登録された計算方式を関数といいます。この関数は特定の処理を行うために用意されたものです。VBAには、多くの関数が用意されていて、それをVBA関数といいます。これに対して、皆さんが普段使っておられる関数をワークシート関数といいます。一部のワークシート関数もプロシージャ内で使うことができます。
また、Functionプロシージャを使ってユーザ定義関数というユーザ独自の関数も作成できることは、基礎編で取り上げました。では、関数の利用方法について学習してみましょう。

VBA関数

関数は引数として渡された文字列や数値などの値を処理して、その結果を「戻り値」として返しますが、その戻り値は変数などに代入して取得します。
つまり、変数=関数名(引数・・・)という記述になります。
関数の戻り値を変数に代入する際、引数を()カッコで囲む必要があります。逆に戻り値を取得しない場合は、引数のカッコは必要ないです。下はMsgBox関数を利用した例です。

戻り値を取得しない

MsgBox "保存してください。"

戻り値を取得する

MS = MsgBox("保存しますか?",vbYesNo)

1.日付・時刻を求める関数

現在の日付を求めるにはDate関数、現時刻ならTime関数、そして現在の日付と時刻の両方を同時に求めるにはNow関数を利用します。これらの関数は、パソコンに設定しているシステムカレンダーから値を返しています。

この例では、セルB2に現在の日付、セルB3に現時刻を表示するプロシージャとなっています。ワークシート関数でも同じ関数を使いますが、必要なときだけ利用するにはVBAを作成してボタンから実行させる方法が便利です。
また、引数のないこれらのVBA上での関数はカッコ()を付けません。ワークシート関数のように、Date()と空のカッコは付けないようにしましょう。

指定された日付から、年、月、日をそれぞれ取り出すには以下の関数を使います。

  引数の中から年を表す値を返す…… Year関数

  引数の中から月を表す値を返す…… Month関数

  引数の中から日を表す値を返す…… Day関数

この例では、セルB3からB4の日付データを年、月、日と分割して、それぞれのセルの右側列に入力するプロシージャです。複数のセル内のデータを同じ処理を行うには、For Each~Nextステートメントを利用します。またオブジェクト変数で、セルをまとめて指定すると効率のよい記述になります。

DateSerial関数を利用すると、指定した年、月、日から日付を求められます。

2.文字列を操作する関数

ある文字列から、特定の文字列を検索する関数にInStr関数があります。これは、見つけた文字列の先頭の文字からの位置を値として返します。そして、指定した文字列の中の特定の文字列を別の文字列に置換するにはReplace関数を利用し、置換後の文字列を返します。

InStr関数…特定の文字列を検索して、その位置を返す

InStr(Start、String1、String2)

引数 内容 省略
Start 検索の開始位置を指定 省略可
String 1 検索の対象となる文字列を指定 省略不可
String 2 検索する文字列を指定 省略不可
Replace関数…特定の文字列を別の文字列に置換する

Replace(Expression、Find、Replace)

引数 内容 省略
Expression 置換の対象となる文字列を指定 省略不可
Find 検索する文字列を指定 省略不可
Replace 置換後の文字列を指定 省略不可

※これらの関数は、一般に使っている検索と置換をVBAで処理することになります。

この例を説明すると、まずオブジェクト変数と整数型の変数を宣言します。整数型の変数は、検索される文字位置の値を格納するためのものです。セルB3からB5に対して繰り返し処理を行うためのFor Each~Nextステートメントを記述します。繰り返し行う処理は、InStr関数でセル内の文字列から全角空白を探し、その位置を変数Posに格納します。そして、変数Posから1つ左(-1)の文字数分を左端から取り出し、1列右のセルにそれを入力します。
次に変数Posから1つ右(+1)の位置から右側すべての文字列を取り出し、2列右のセルにそれを入力します。それをセルB3からB5まで繰り返し処理しています。つまり、全角空白の位置を基準にして、左側と右側を分割して、それぞれ指定したセルに入力していくプロシージャとなっています。

このプロシージャには、Left関数、Mid関数が使われています。その他、同様な関数にRight関数があります。これらは、文字列の一部を取り出すときに利用され、左端、右端、そして任意の位置からの文字列を取り出すことができます。以下を参照してください。

Left(String、Length) 引数Stringに指定した文字列から、引数Lengthに指定した文字数分の文字列を左端から取り出す。
Right(String、Length) 引数Stringに指定した文字列から、引数Lengthに指定した文字数分の文字列を右端から取り出す。
Mid(Stirng、Start、Length) 引数Stringに指定した文字列から、引数Lengthに指定した文字数分の文字列を引数Startに指定した位置から取り出す。

この例では、セルB3からB5までの文字列の中のAという文字をBに変換することを繰り返し処理し、変換後の文字列を1つ右側のセルに入力しているプロシージャです。

3.文字列を変換する関数

文字列の中の大文字、小文字、ひらがな、カタカナを変換するにはStrConv関数を使います。この関数の引数と定数は以下の表を参照してください。

StrConv関数

StrConv(String、Conversion)

引数 内容 省略
String 変換する文字列を指定 省略不可
Conversion 変換の種類を指定 省略不可
引数Conversionの定数
定数 内容
vbUpperCase 文字列内の英字を大文字に変換
vbLowerCase 文字列内の英字を小文字に変換
vbProperCase 文字列内の各単語の先頭を大文字に変換
vbWide 文字列内の数字、英字、カタカナを全角に変換
vbNarrow 文字列内の数字、英字、カタカナを半角に変換
vbKatakana 文字列内のひらがなをカタカナに変換
vbHiragana 文字列内のカタカナをひらがなに変換
vbUnicode 既定のコードページからUnicodeに変換
vbFromUnicode Unicodeから既定のコードページに変換

※Unicodeは半角文字、全角文字とも2バイトで表す文字コードです。コードページでは、半角文字は1バイト、全角文字は2バイトで表します。Excelは、Unicode対応のアプリケーションですから、文字のバイト数を調べるためには、StrConv関数を使ってコードページに変換する必要があります。

この例では、セルB2からB5までの文字列の単語の先頭を大文字に変換し、右側のセルに入力するプロシージャです。この関数のポイントは、文字列の変換種類を定数で指定することです。

4.ワークシート関数を利用

プロシージャ内でワークシート関数を利用するには、WorksheetFunctionオブジェクトのあとにワークシート関数名を記述します。WorksheetFunctionオブジェクトは、ワークシート関数の親オブジェクトでWorksheetFunctionプロパティを使って取得します。

WorksheetFunctionプロパティ

WorksheetFunctionオブジェクト.ワークシート関数名(引数)

例えば、セル範囲A2からD2までの合計を変数Goukeiに代入するには
Goukei = WorksheetFunction.Sum(Range("A2:D2"))と記述します。

ワークシート関数の引数で、セル範囲を指定する場合はRangeオブジェクトで指定します。つまり、以下のような記述であればエラーがでます。
Goukei = WorksheetFunction.Sum("A2:D2")  ×(エラー発生)

上の例では、セルE3からE列のデータがある最後のセルまでの金額の合計と平均、そして最も大きい金額を求めているプロシージャです。ワークシート関数の引数は、変数でE列の範囲を指定しています。そして、そのまま計算結果を入力し、表示形式を通貨に設定しています。
ワークシート関数のすべてをプロシージャ内で使うことはできません。Left関数、If関数などは利用できないので、代わりにVBA関数のLeft関数やIf~Thenステートメントを使います。