組み込み関数の使用
メニューを表示するにはスワイプしてください
VBA には数百種類の組み込み関数が用意されており、そのほとんどを使うことはありません。以下は、ビジネス自動化で頻繁に利用される関数です。テキストの整形、日付の操作、型変換などに役立ちます。
日付関数
Debug.Print Now() ' current date and time
Debug.Print Date ' today's date only
Debug.Print DateAdd("d", 30, Date) ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date) ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")
Now() と Date は似ていますが、用途が異なります。Now() は現在の時刻まで含む(マクロ実行時刻の記録などに便利)、一方 Date はカレンダー上の日付のみを返します(締切日や年齢計算などに適しています)。DateAdd と DateDiff は対になる関数です。DateAdd は指定した単位("d"=日、"m"=月、"yyyy"=年)で日付を前後に移動し、DateDiff は2つの日付の差を測定します。
VBA の日付リテラル(# 記号で囲まれたもの、例:#01/09/2023#)は、Windows の地域設定やシステムロケールに関係なく、常に MM/DD/YYYY の順序で内部処理されます。したがって、#01/09/2023# は 2023年1月9日 を意味し、9月1日ではありません(普段 DD/MM/YYYY 形式を使う場合でも同様です)。これはワークシートのセルに日付を入力する場合とは異なり、#...# リテラル形式は VBA 固有のルールであり、コードがどこで実行されても変わりません。
テキスト関数
Debug.Print UCase("wireless mouse") ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE") ' wireless mouse
Debug.Print Left("P001", 1) ' P
Debug.Print Right("P001", 3) ' 001
Debug.Print Mid("P001", 2, 3) ' 001
Debug.Print Trim(" Keyboard ") ' Keyboard
Debug.Print Len("Laptop Stand") ' 12
Debug.Print InStr("Wireless Mouse", "Mouse") ' 10 (position found)
UCase と LCase は、大文字・小文字を区別しない比較を行いたいときに便利です。例えば、If UCase(category) = UCase("electronics") Then のように使えば、元の入力がどのような大文字・小文字でも正しく比較できます。Left、Right、Mid は文字列の一部を抽出する関数で、カウントの開始位置が異なります。Left と Right は両端から、Mid は開始位置と長さを指定して抽出します。そのため、Mid("P001", 2, 3) と Right("P001", 3) は、ここでは同じ "001" を返します。Trim は先頭と末尾の空白を削除します。コピー&ペーストで余分な空白が混入したデータの整形に役立ちます。InStr は、ある文字列の中に別の文字列が含まれているかを検索し、見つかった位置を返します(見つからない場合は 0)。これにより、「この商品名に 'Mouse' という単語が含まれているか?」を正確な一致なしで判定できます。
数値関数
Debug.Print Round(24.996, 2) ' 25
Debug.Print Abs(-15) ' 15
Debug.Print Int(7.9) ' 7
Round と Int はどちらも数値を小さくしますが、方法が異なります。Round(24.996, 2) は小数点以下2桁で四捨五入(25.00、表示は25)、Int(7.9) は小数点以下を切り捨てて常に0方向に丸めます(7.9でも7)。この違いを混同すると価格計算のバグにつながります。価格を最も近い1円単位に丸める場合は Round を使うべきで、Int を使うと毎回わずかに少ない金額で計算されてしまいます。
型変換
ワークシートから値を取得する際に重要です。セルの値は多くの場合 Variant 型で渡されます:
Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText) ' text → number
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)
CDbl は Double 型、CInt は Integer 型、CStr は String 型、CDate は Date 型に変換します。
課題
Midを使って "P003" の数値部分のみを抽出する行(ヒント:2文字目から開始)。- 抽出したテキストを
CIntまたはCLngで実際の数値に変換する行。 DateDiffを使って、Emma Davis が雇用された日(15/03/2020)から今日まで何日経過したかを計算する行。
1. 数値部分の抽出
Midは3つの要素を取る:文字列自体、カウント開始位置、取得する文字数。- "P003" は1文字のアルファベットの後に3桁の数字が続く形式 — "P" を飛ばしてその後ろをすべて取得する。
- 開始位置2は「2文字目から始める」という意味 — 指で "P003" を数えて2番目が最初の "0" であることを確認。
2. 実際の数値への変換
Midで返されるものは見た目は数字でも、まだテキスト。Mid(...)の式全体をCInt(...)またはCLng(...)で囲む — 1つの関数の結果を別の関数で変換する。- 本章の前半でも説明した通り、
CInt/CLngはテキストを整数に変換する;数値が大きくなる可能性がある場合はCLngを使用。
3. 雇用日からの日数計算
DateDiffには3つの要素が必要:測定単位("d" は日数)、開始日、終了日。- VBA でリテラル日付を書く際の注意点 —
#記号で囲む(例:#03/15/2020#)。#...#内では、VBA は常に 月/日/年 の順序を期待する(地域設定に関係なく)— つまり3月15日は#03/15/2020#、#15/03/2020#ではない。 - 「今日」は日付を入力する必要はなく、2.3節で紹介した現在日付を常に返すキーワードがある。
- 2つの日付を
DateDiffに正しい順序(先に過去の日付)で渡す — 逆にすると負の値になる。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください