EB000010_VBAエキスパート(ExcelVBAベーシック)合格講座/第十回:関数

VBAエキスパート(ExcelVBAベーシック)合格講座/第十回:関数 ExcelVBA Basic
  1. このページの内容について
  2. 関数とは
  3. 日付や時刻を操作する関数
    1. Now関数、Date関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    2. Year関数、Month関数、Day関数、Hour関数、Minute関数、Second関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    3. DateSerial関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
  4. 文字列を操作する関数
    1. Len関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    2. Left関数、Right関数、Mid関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    3. LCase関数、UCase関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    4. LTrim関数、RTrim関数、Trim関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    5. Replace関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    6. Instr関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    7. StrConv関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    8. Format関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    9. Int関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    10. Round関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    11. Abs関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    12. IsNumeric関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    13. IsDate関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
    14. Msgbox関数
      1. サンプルコード(クリックでコピー)
      2. 処理詳細
      3. 実行結果
    15. InputBox関数
      1. サンプルコード(クリックでコピー)
      2. 実行結果
  5. 【PR】VBAエキスパート試験対策記事

このページの内容について

このページは、VBAエキスパート(ExcelVBAベーシック)試験合格講座の第十回記事です。公式テキスト第8章「関数」の内容について解説します。1時間の講義でお話する程度の分量です。講座受講者の復習での利用を想定しています。

関数とは

Excelには「SUM」や「VLOOKUP」といった関数があります。呼び出すことで何かを返したり、処理を実行したりしてくれるもののことです。関数の中には呼び出すときに何かを渡す必要があるものがあります。この渡す値のことを「引数(ひきすう)」と呼び、関数が返してくれるもののことを「戻り値(もどりち)」と呼びます。ExcelVBAにも最初から使用可能な関数が用意されており、ここではVBAエキスパート試験に登場する関数を紹介します。

日付や時刻を操作する関数

Now関数、Date関数

書式(引数)戻り値働き
Now()Variant(Date)引数はありません。システム日時を返します。
Date()Variant(Date)引数はありません。システム日付を返します。

サンプルコード(クリックでコピー)

Private Sub Test_Now_Date()
Debug.Print Now
Debug.Print Date
End Sub

Now関数もDate関数も引数がありません。Excelの関数は引数がない場合でも「Now()」のように「()」が必要でしたが、VBAでは「()」を省略して記述することができます。

実行結果

上記サンプルを実行するとイミディエイトウィンドウに現在日時と現在の日付が表示されます。

Year関数、Month関数、Day関数、Hour関数、Minute関数、Second関数

書式(引数)戻り値働き
Year(Date)Variant(Integer)引数として渡した日付、時刻データの「年」を返します。
Month(Date)Variant(Integer)引数として渡した日付、時刻データの「月」を返します。
Day(Date)Variant(Integer)引数として渡した日付、時刻データの「日」を返します。
Hour(Date)Variant(Integer)引数として渡した日付、時刻データの「時」を返します。
Miunte(Date)Variant(Integer)引数として渡した日付、時刻データの「分」を返します。
Second(Date)Variant(Integer)引数として渡した日付、時刻データの「秒」を返します。

関数のDateは日付のみのデータを取得するものですが、変数の型であるDate(日付型)は日付・時刻をもつデータのことです。Date型の変数にDateで今日の日付を格納すると時刻は「0:00:00」となります。

サンプルコード(クリックでコピー)

Private Sub Test_DateFamily()
Debug.Print Year(Now)
Debug.Print Month(Now)
Debug.Print Day(Now)
Debug.Print Hour(Now)
Debug.Print Minute(Now)
Debug.Print Second(Now)
End Sub

実行結果

現在日時を「年月日時分秒」に分解してイミディエイトウィンドウに出力します。

DateSerial関数

書式(引数)戻り値働き
DateSerial(Year As Integer, Month As Integer, Day As Integer)Variant(Date)年、月、日を渡すと日付データに変換して返します。

サンプルコード(クリックでコピー)

Private Sub Test_DateSerial()
Debug.Print DateSerial(2024, 12, 25)
End Sub

Private Sub Test_DateSerialWithName()
Debug.Print DateSerial(Year:=2024, Month:=12, Day:=25)
End Sub

Year関数の引数は「Date」という型名のみでした。これは引数に名前が付いていない状態です。DateSerial関数の場合、引数に名前が付いているため、関数を呼び出す際に、名前を指定して引数を渡すことができます。DateSerial関数には省略可能な引数がないため、引数の入力が簡単になるというメリットはありません。しかもコードは少し冗長になりま。しかし、何を渡しているかはわかりやすくなります。どちらが正解ということはありません。

実行結果

上記のサンプルを実行するとイミディエイトウィンドウに「2024/12/25」が出力されます。この結果はあなたの属する国によって、表示形式が異なることがあります。

文字列を操作する関数

Len関数

書式(引数)戻り値働き
Len(Expression)Long文字列を渡すとその文字列の長さを返します。

引数のExpressionは「式」のことです。Lenの引数は文字列ですが、なぜExpressionと表記されるのか・・長くなるので読み飛ばしOK。

プログラミングにおいて「式」とは何らかの結果を返すもののことです。例えば演算子と被演算子の組み合わせも「式」です。「1 + 1」や「”Excel” & “VBA”」など。式は必ず結果を返します。この結果を得ることを一般には「式の評価」や「式を評価する」と表現します。そしてプログラミングにおいては、変数や関数も「式」とみなされます。例えば変数は、格納されているデータがその変数の評価(結果)です。関数も結果を返します。なにを「式」とみなすかはプログラミング言語によって異なっており、VBAにおいては数値(0~9の組み合わせ)は「式」ではありませんが、文字列(”ExcelVBA”など)は「式」です。Len関数の引数はExpressionであるため、文字列をそのまま渡すことはできますが、数値をそのまま渡すことはできません。ただし数値を変数に格納してから渡したり、セルに入力した数値をValueプロパティで取得して渡す場合、それらは「式」なのでエラーにはなりません。VBAの関数において引数にExpression(式)が設定されているのは、その関数のなんらか制御上の理由で値ではなく「式」が必要な時ですが、ほとんどすべてのデータは「式」なので、意識することはまずありません。

サンプルコード(クリックでコピー)

Private Sub Test_Len()
Debug.Print Len("この文字列の長さは?")
End Sub

実行結果

上記のサンプルを実行するとイミディエイトウィンドウに「この文字列の長さは?」の文字列の長さが出力されます。

Len関数の仕様として引数に直接数値を渡すとエラーが発生します。数値の長さを調べたい場合は「”(ダブルクォーテーション)」で囲って文字列として渡したり、セルや変数を介して渡すとエラーになりません。

Left関数、Right関数、Mid関数

書式(引数)戻り値働き
Left(String, Length As Long)Variant (String)渡した文字列を左から指定した長さだけ切り抜いて返します。
Right(String, Length As Long)Variant (String)渡した文字列を右から指定した長さだけ切り抜いて返します。
Mid(String, Start As Long, [Length])Variant (String)渡した文字列を指定位置から指定した長さだけ切り抜いて返します。長さを省略すると指定位置以降すべてを返します。

引数が「[Length]」のように大カッコで囲まれている場合は、その引数が省略可能であることを意味します。

サンプルコード(クリックでコピー)

Private Sub Test_StringTrim()

Dim char_val As String
char_val = "ABCDEFGHOJKLMN"

Debug.Print Left(char_val, 3) '①
Debug.Print Right(char_val, 4) '②
Debug.Print Mid(char_val, 2, 2) '③
Debug.Print Mid(char_val, 2) '④

End Sub

実行結果

上記サンプルを実行するとそれぞれの位置で文字列を切り抜いて返します。
① ・・・ 左から3文字切り抜いて返す
② ・・・ 右から4文字切り抜いて返す
③ ・・・ 左から2文字目から2文字切り抜いて返す
④ ・・・ 左から2文字目以降を切り抜いて返す

LCase関数、UCase関数

書式(引数)戻り値働き
LCase(String)Stringアルファベットを渡すとアルファベットを小文字に変換して返します。A→a
UCase(String)Stringアルファベットを渡すとアルファベットを大文字に変換して返します。a→A

サンプルコード(クリックでコピー)

Private Sub Test_LCase()

Debug.Print VBA.LCase("ABCDefg")

End Sub

Public Sub Test_UCase()

Debug.Print UCase("ABCDefg")

End Sub

LCase関数には「VBA.」を付けています。UCase関数には付けていません。詳しい原因は不明ですが、現状「VBA.」を省略してLCase関数を使用することができません。公式テキストでもLCase関数については、触れられていません。

実行結果

上記サンプルではアルファベットを大文字もしくは小文字に変換した文字列をイミディエイトウィンドウに出力します。

LTrim関数、RTrim関数、Trim関数

書式(引数)戻り値働き
LTrim(String)Variant (String)渡した文字列の左端から空白文字を取り除いて返します。
RTrim(String)Variant (String)渡した文字列の右端から空白文字を取り除いて返します。
Trim(String)Variant (String)渡した文字列の両端から空白文字を取り除いて返します。

サンプルコード(クリックでコピー)

Private Sub Test_LTrim()

Debug.Print LTrim("  Excel  VBA  ")

End Sub

Public Sub Test_RTrim()

Debug.Print RTrim("  Excel  VBA  ")

End Sub

Public Sub Test_Trim()

Debug.Print Trim("  Excel  VBA  ")

End Sub

実行結果

上記サンプルでは文字列から空白文字を取り除きます。ポイントは文字列の内部に位置する空白文字は取り除かないことです。

Replace関数

書式(引数)戻り値働き
Replace(Expression As String, Find As String, Replace As String)String「Expression」から「Find」を検索し「Replace」に置き換えで返します。

Replace関数には実際には省略可能な引数が複数存在します。また、戻り値についてもエラーを想定したものなど複数のパターンが存在します。実務においても使用頻度が低く、試験にも登場しないため、ここでの解説はしません。気になる場合は、公式サイトを確認してみましょう。

サンプルコード(クリックでコピー)

Private Sub Test_Replace()

Debug.Print Replace("090\1234\5678", "\", "-") '①
Debug.Print Replace("090-1234-5678", "-", "") '②

End Sub

実行結果

上記サンプルでは①「\」を「-」に置き換えた文字列をイミディエイトウィンドウに出力します。②は「-」を取り除いた文字列を出力します。

実務においては②の特定の文字列を取り除くために使用することが多いです。

Instr関数

書式(引数)戻り値働き
InStr(String1, String2)Variant(Long)「String1」のなかに「String2」が含まれていれば何文字目から始まるのかを数値で、含まれていなければ0を返します。

InStr関数はString1の中にString2が複数含まれている場合、最初に登場する文字列の先頭からの番号を返します。

サンプルコード(クリックでコピー)

Private Sub Test_InStr()

Debug.Print InStr("ExcelVBA", "VBA") '①
Debug.Print InStr("ExcelVBA", "OutlookVBA") '②

End Sub

実行結果

上記サンプルでは①「ExcelVBA」の中で「VBA」は6文字目から始まるため、イミディエイトウィンドウに「6」が出力されます。②は「ExcelVBA」の中に「OutlookVBA」という文字は存在存在しないため「0」が出力されます。

InStr関数では文字が存在しない場合でもエラーにならないため、戻り値が「0」か「1以上」かを確認することで指定した文字列が存在するかの判定にも使用できます。

StrConv関数

書式(引数)戻り値働き
StrConv(String, Conversion As VbStringConv)Variant (String)「Conversion」で指定した定数に応じて「String」を変換して返します。
定数(Conversion)変換方法
vbUpperCase文字列を大文字に変換する。a→A
vbLowerCase文字列を小文字に変換する。A→a
vbProperCase文字列の各単語の先頭の文字を大文字、それ以外を小文字に変換する。
vbWide文字列を全角文字に変換する。\→¥
vbNarrow文字列を半角文字に変換する。p→p
vbKatakana文字列をカタカナに変換する。か→カ
vbHiragana文字列をひらがなに変換する。ヲ→を

StrConv関数に指定できる定数は他にもありますが、試験には登場しません。気になる場合は、公式サイトを確認してみましょう。

サンプルコード(クリックでコピー)

Private Sub Test_StrConv()

Debug.Print StrConv("090-1234-5678", vbNarrow) '①
Debug.Print StrConv("excelVBA", vbProperCase) '②

End Sub

実行結果

上記サンプルでは①一部が全角文字の電話番号を半角文字にしてイミディエイトウィンドウに出力します。②は先頭の文字が大文字にとなり「ExcelVBA」が出力されます。

ユーザーは基本的にあなたの課したルールには従いません。実務において、入力形式の違いによってマクロでエラーを発生させないためにStrConv関数は非常によく使用します。

Format関数

書式(引数)戻り値働き
Format(Expression, [Format])Variant (String)「Format」で指定した書式で「Expression」を変換して返します。
書式(Format)変換方法
#1桁の数値
01桁の数値、桁が足りない場合0埋め
,桁区切り文字
yy西暦下2桁
yyyy西暦4桁
m(mm)月の数値(1桁の場合、先頭に0を付与)
d(dd)日の数値(1桁の場合、先頭に0を付与)
aaa日本語の曜日文字「月火水木金土日」
aaaa日本語の曜日文字に「曜日」を付与
ddd英語の曜日文字省略形
dddd英語の曜日文字
ww1年の内の何週目か
y1年の内の何日目か
oooo月の数値に「月」を付与
q1年の内の第何四半期か
gアルファベットの年号
gg日本語の年号1文字
ggg日本語の年号
e(ee)和暦の年(1桁の場合、先頭に0を付与)
h(hh)時の数値(1桁の場合、先頭に0を付与)
m(mm)分の数値(1桁の場合、先頭に0を付与)
s(ss)秒の数値(1桁の場合、先頭に0を付与)

ExcelのTEXT関数や表示形式のようなものですが、使用できない書式記号もあります。

サンプルコード(クリックでコピー)

Private Sub Test_Format()

Debug.Print Format(Date, "yyyy/mm/dd(ddd)")
Debug.Print Format(1000000, "#,##0")

End Sub

実行結果

上記サンプルでは①ではマクロを実行した日付を「2024/12/23(月)」のように変換してイミディエイトウィンドウに出力します。②は3桁区切りにして出力します。

Int関数

書式(引数)戻り値働き
Int(Number)Variant (Long)「Number」の整数部分を返します。

Int関数は整数部分を返すので、小数点以下の切り捨てとして利用できます。

サンプルコード(クリックでコピー)

Private Sub Test_Int()

Debug.Print Int(100.99)
Debug.Print Int(123.45)
Debug.Print Int(987654321.012345)

End Sub

実行結果

上記サンプルではいずれも整数部分がイミディエイトウィンドウに出力されます。

Round関数

書式(引数)戻り値働き
Round(Number,[NumDigitsAfterDecimal As Long])Variant (Double)「Number」の少数部を「NumDigitsAfterDecimal」の桁数になるように四捨五入を実施して返します。

Round関数は多くの場合、一般的な四捨五入と同じ結果を返しますが、一部、異なる結果になることがあります。そのため通常の実務では使用を避けます。代わりに「WorksheetFunction.Round」を使用しますが、スタンダードの学習範囲であり、ここでは解説を省略します。

サンプルコード(クリックでコピー)

Private Sub Round()

Debug.Print VBA.Round(0.12345, 4)
Debug.Print WorksheetFunction.Round(0.12345, 4)

Debug.Print VBA.Round(0.00005, 4)
Debug.Print WorksheetFunction.Round(0.00005, 4)

End Sub

Round関数も「VBA.」を省略するとエラーが発生します。

実行結果

上記サンプルは「VBA.Round」と「WorksheetFunction.Round」との結果が異なります。おそらく多くの人にとって直感的に正しい結果なのは「WorksheetFunction」の結果です。

公式テキストには上記のような事象について言及はありません。そのためVBAエキスパート試験においてはRound関数は四捨五入ができる関数として考えるようにしましょう。

Abs関数

書式(引数)戻り値働き
Abs(Number)Variant 「Number」を絶対値に変換して返します。

サンプルコード(クリックでコピー)

Private Sub Test_Abs()

Debug.Print Abs(-1.111)

End Sub

実行結果

上記サンプルは絶対値(マイナス符号を外した数値)をイミディエイトウィンドウに出力します。

IsNumeric関数

書式(引数)戻り値働き
IsNumeric(Number)Boolean「Number」が数値の場合「True」数値ではない場合「False」を返します。

サンプルコード(クリックでコピー)

Private Sub Test_IsNumeric()

Debug.Print IsNumeric(1234)
Debug.Print IsNumeric("1234")

End Sub

実行結果

上記サンプルはいずれも「True」を返します。

VBAには自動型変換機能があり、数値を文字列として記述しても数値に変換可能な場合、VBAは数値とみなして処理をします。

IsDate関数

書式(引数)戻り値働き
IsDate(Expression)Boolean「Expression」が日付・時刻データの場合「True」日付・時刻データではない場合「False」を返します。

サンプルコード(クリックでコピー)

Private Sub Test_IsDate()

Debug.Print IsDate("2024/12/23 12:00:00")
Debug.Print IsDate("令和6年12月23日")
Debug.Print IsDate(#12/23/2024#)

End Sub

実行結果

上記サンプルはいずれも「True」を返します。

VBAの自動型変換機能は、日付データに対しても有効です。VBAが日付と判定できるデータはすべて日付とみなして処理をします。日付を数値のように直に記述する場合は「#」で囲む必要があります。

Msgbox関数

書式(引数)戻り値働き
MsgBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly], [Title])Integer「prompt」を本文「title」をタイトル「Buttons」でボタンのパターンを指定し、メッセージボックスを表示します。ユーザーからの入力は定数値で返します。
定数(VbMsgBoxStyle)意味
vbOKOnly「OK」ボタン
vbOKCancel「OK」「キャンセル」ボタン
vbAbortRetryLgnore「中止」「再試行」「無視」ボタン
vbYesNoCancel「はい」「いいえ」「キャンセル」ボタン
vbYesNo「はい」「いいえ」ボタン
vbRetryCancel「再試行」「キャンセル」ボタン
vbDefaultButton1第一ボタンをデフォルトでフォーカス
vbDefaultButton2第二ボタンをデフォルトでフォーカス
vbDefaultButton3第三ボタンをデフォルトでフォーカス
vbCritical警告アイコン
vbQuestion問い合わせアイコン
vbExclamaition注意アイコン
vbInformation情報アイコン
戻り値意味
vbOK「OK」ボタンが押された
vbCancel「キャンセル」ボタンが押された
vbAbort「中止」ボタンが押された
vbRetry「再試行」ボタンが押された
vbIgnore「無視」ボタンが押された
vbYes「はい」ボタンが押された
vbNo「いいえ」ボタンが押された

省略可能な引数のあとの「=vbOKOnly」は、省略された場合に「=」のあとのデータが渡されたものとみなすということを意味します。

サンプルコード(クリックでコピー)

Private Sub Test_Msgbox()

Dim msg_result As VbMsgBoxResult

Call MsgBox("この処理はメッセージを表示し、結果を受け取りません。", vbOKOnly, "メッセージテスト") '①

msg_result = MsgBox("あなたはこのメッセージを読ましたか?", vbYesNo + vbQuestion + vbDefaultButton2) '②

If msg_result = vbYes Then '③

Call MsgBox("ありがとうございます", vbInformation) '④

Else '⑤

Call MsgBox("次回は是非メッセージを読んでください。", vbExclamation) '⑥

End If '⑦

End Sub

処理詳細

①メッセージを表示、「OK」ボタンのみ、タイトル指定あり。
②メッセージを表示し、入力結果を受け取り変数「msg_result」に格納。「はい」「いいえ」ボタン「問い合わせ」アイコンを付加し、第二ボタン(いいえ)をフォーカスした状態で表示
③メッセージへの入力結果が「vbYes」の場合に④以下を実行、それ以外の場合に⑥以下を実行
④メッセージを表示、「情報」アイコンを付加
⑤Trueパートの終端
⑥メッセージを表示、「警告」アイコンを付加
⑦If分岐の終端

実行結果

上記サンプルでは、まずメッセージを表示、次のメッセージでは入力内容を読み取り、入力結果に応じて、その後のメッセージを変化させています。

InputBox関数

書式(引数)戻り値働き
InputBox(Prompt, [Title], [Default])String「prompt」を本文「title」をタイトル「Default」をデフォルト値としてユーザーからの入力を受け付けるウィンドウを表示し、入力結果を返します。

「VBA.InputBox」はユーザーの入力をすべて文字列で受け取ります。「Application.InputBox」は同等の機能に加えて、ユーザーの入力する型を指定することができるため上位互換の関数ですが、公式テキストに登場しないため、解説はしません。

サンプルコード(クリックでコピー)

Private Sub Test_InputBox()

Debug.Print InputBox("あなたの年齢は?", "年齢を聞くマクロ", Int(Rnd * 100))
Debug.Print Application.InputBox("あなたの体重は?", "体重を聞くマクロ", Int(Rnd * 100), Type:=1)

End Sub

実行結果

上記サンプルではInputBox関数で年齢を聞きます。年齢を聞いているため数値入力をしてほしいところですが「ユーザーはあなたの課したルールには従いません」文字列の入力がされることもあります。「Application.InputBox」関数では入力形式に数値を指定できるため数値以外を入力するとユーザーは先に進むことができません。

【PR】VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment