関数は引数として渡された文字列や数値などの値を処理して、その結果を「戻り値」として返しますが、その戻り値は変数などに代入して取得します。
つまり、変数=関数名(引数・・・)という記述になります。
関数の戻り値を変数に代入する際、引数を()カッコで囲む必要があります。逆に戻り値を取得しない場合は、引数のカッコは必要ないです。下はMsgBox関数を利用した例です。
MsgBox "保存してください。"
MS = MsgBox("保存しますか?",vbYesNo)
現在の日付を求めるにはDate関数、現時刻ならTime関数、そして現在の日付と時刻の両方を同時に求めるにはNow関数を利用します。これらの関数は、パソコンに設定しているシステムカレンダーから値を返しています。
この例では、セルB2に現在の日付、セルB3に現時刻を表示するプロシージャとなっています。ワークシート関数でも同じ関数を使いますが、必要なときだけ利用するにはVBAを作成してボタンから実行させる方法が便利です。
また、引数のないこれらのVBA上での関数はカッコ()を付けません。ワークシート関数のように、Date()と空のカッコは付けないようにしましょう。
指定された日付から、年、月、日をそれぞれ取り出すには以下の関数を使います。
引数の中から年を表す値を返す…… Year関数
引数の中から月を表す値を返す…… Month関数
引数の中から日を表す値を返す…… Day関数
この例では、セルB3からB4の日付データを年、月、日と分割して、それぞれのセルの右側列に入力するプロシージャです。複数のセル内のデータを同じ処理を行うには、For Each~Nextステートメントを利用します。またオブジェクト変数で、セルをまとめて指定すると効率のよい記述になります。
DateSerial関数を利用すると、指定した年、月、日から日付を求められます。
ある文字列から、特定の文字列を検索する関数にInStr関数があります。これは、見つけた文字列の先頭の文字からの位置を値として返します。そして、指定した文字列の中の特定の文字列を別の文字列に置換するにはReplace関数を利用し、置換後の文字列を返します。
InStr(Start、String1、String2)
引数 | 内容 | 省略 |
---|---|---|
Start | 検索の開始位置を指定 | 省略可 |
String 1 | 検索の対象となる文字列を指定 | 省略不可 |
String 2 | 検索する文字列を指定 | 省略不可 |
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つ右側のセルに入力しているプロシージャです。
文字列の中の大文字、小文字、ひらがな、カタカナを変換するにはStrConv関数を使います。この関数の引数と定数は以下の表を参照してください。
StrConv(String、Conversion)
引数 | 内容 | 省略 |
---|---|---|
String | 変換する文字列を指定 | 省略不可 |
Conversion | 変換の種類を指定 | 省略不可 |
定数 | 内容 |
---|---|
vbUpperCase | 文字列内の英字を大文字に変換 |
vbLowerCase | 文字列内の英字を小文字に変換 |
vbProperCase | 文字列内の各単語の先頭を大文字に変換 |
vbWide | 文字列内の数字、英字、カタカナを全角に変換 |
vbNarrow | 文字列内の数字、英字、カタカナを半角に変換 |
vbKatpointna | 文字列内のひらがなをカタカナに変換 |
vbHiragana | 文字列内のカタカナをひらがなに変換 |
vbUnicode | 既定のコードページからUnicodeに変換 |
vbFromUnicode | Unicodeから既定のコードページに変換 |
※Unicodeは半角文字、全角文字とも2バイトで表す文字コードです。コードページでは、半角文字は1バイト、全角文字は2バイトで表します。Excelは、Unicode対応のアプリケーションですから、文字のバイト数を調べるためには、StrConv関数を使ってコードページに変換する必要があります。
この例では、セルB2からB5までの文字列の単語の先頭を大文字に変換し、右側のセルに入力するプロシージャです。この関数のポイントは、文字列の変換種類を定数で指定することです。
プロシージャ内でワークシート関数を利用するには、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ステートメントを使います。