このページの内容について
このページは、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
実行結果
上記サンプルを実行するとイミディエイトウィンドウに現在日時と現在の日付が表示されます。
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) | 引数として渡した日付、時刻データの「秒」を返します。 |
サンプルコード(クリックでコピー)
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
実行結果
上記のサンプルを実行するとイミディエイトウィンドウに「2024/12/25」が出力されます。この結果はあなたの属する国によって、表示形式が異なることがあります。
文字列を操作する関数
Len関数
書式(引数) | 戻り値 | 働き |
---|
Len(Expression) | Long | 文字列を渡すとその文字列の長さを返します。 |
サンプルコード(クリックでコピー)
Private Sub Test_Len()
Debug.Print Len("この文字列の長さは?")
End Sub
実行結果
上記のサンプルを実行するとイミディエイトウィンドウに「この文字列の長さは?」の文字列の長さが出力されます。
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) | 渡した文字列を指定位置から指定した長さだけ切り抜いて返します。長さを省略すると指定位置以降すべてを返します。 |
サンプルコード(クリックでコピー)
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
実行結果
上記サンプルではアルファベットを大文字もしくは小文字に変換した文字列をイミディエイトウィンドウに出力します。
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」に置き換えで返します。 |
サンプルコード(クリックでコピー)
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を返します。 |
サンプルコード(クリックでコピー)
Private Sub Test_InStr()
Debug.Print InStr("ExcelVBA", "VBA") '①
Debug.Print InStr("ExcelVBA", "OutlookVBA") '②
End Sub
実行結果
上記サンプルでは①「ExcelVBA」の中で「VBA」は6文字目から始まるため、イミディエイトウィンドウに「6」が出力されます。②は「ExcelVBA」の中に「OutlookVBA」という文字は存在存在しないため「0」が出力されます。
StrConv関数
書式(引数) | 戻り値 | 働き |
---|
StrConv(String, Conversion As VbStringConv) | Variant (String) | 「Conversion」で指定した定数に応じて「String」を変換して返します。 |
定数(Conversion) | 変換方法 |
---|
vbUpperCase | 文字列を大文字に変換する。a→A |
vbLowerCase | 文字列を小文字に変換する。A→a |
vbProperCase | 文字列の各単語の先頭の文字を大文字、それ以外を小文字に変換する。 |
vbWide | 文字列を全角文字に変換する。\→¥ |
vbNarrow | 文字列を半角文字に変換する。p→p |
vbKatakana | 文字列をカタカナに変換する。か→カ |
vbHiragana | 文字列をひらがなに変換する。ヲ→を |
サンプルコード(クリックでコピー)
Private Sub Test_StrConv()
Debug.Print StrConv("090-1234-5678", vbNarrow) '①
Debug.Print StrConv("excelVBA", vbProperCase) '②
End Sub
実行結果
上記サンプルでは①一部が全角文字の電話番号を半角文字にしてイミディエイトウィンドウに出力します。②は先頭の文字が大文字にとなり「ExcelVBA」が出力されます。
書式(引数) | 戻り値 | 働き |
---|
Format(Expression, [Format]) | Variant (String) | 「Format」で指定した書式で「Expression」を変換して返します。 |
書式(Format) | 変換方法 |
---|
# | 1桁の数値 |
0 | 1桁の数値、桁が足りない場合0埋め |
, | 桁区切り文字 |
yy | 西暦下2桁 |
yyyy | 西暦4桁 |
m(mm) | 月の数値(1桁の場合、先頭に0を付与) |
d(dd) | 日の数値(1桁の場合、先頭に0を付与) |
aaa | 日本語の曜日文字「月火水木金土日」 |
aaaa | 日本語の曜日文字に「曜日」を付与 |
ddd | 英語の曜日文字省略形 |
dddd | 英語の曜日文字 |
ww | 1年の内の何週目か |
y | 1年の内の何日目か |
oooo | 月の数値に「月」を付与 |
q | 1年の内の第何四半期か |
g | アルファベットの年号 |
gg | 日本語の年号1文字 |
ggg | 日本語の年号 |
e(ee) | 和暦の年(1桁の場合、先頭に0を付与) |
h(hh) | 時の数値(1桁の場合、先頭に0を付与) |
m(mm) | 分の数値(1桁の場合、先頭に0を付与) |
s(ss) | 秒の数値(1桁の場合、先頭に0を付与) |
サンプルコード(クリックでコピー)
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」の整数部分を返します。 |
サンプルコード(クリックでコピー)
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」の桁数になるように四捨五入を実施して返します。 |
サンプルコード(クリックでコピー)
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
実行結果
上記サンプルは「VBA.Round」と「WorksheetFunction.Round」との結果が異なります。おそらく多くの人にとって直感的に正しい結果なのは「WorksheetFunction」の結果です。
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
実行結果
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
実行結果
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 | 「いいえ」ボタンが押された |
サンプルコード(クリックでコピー)
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(Prompt, [Title], [Default]) | String | 「prompt」を本文「title」をタイトル「Default」をデフォルト値としてユーザーからの入力を受け付けるウィンドウを表示し、入力結果を返します。 |
サンプルコード(クリックでコピー)
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エキスパート試験対策記事
Comment