Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 組み込み関数の使用 | VBA基礎
ビジネス自動化のためのExcel VBA

組み込み関数の使用

メニューを表示するにはスワイプしてください

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 はカレンダー上の日付のみを返します(締切日や年齢計算などに適しています)。DateAddDateDiff は対になる関数です。DateAdd は指定した単位("d"=日、"m"=月、"yyyy"=年)で日付を前後に移動し、DateDiff は2つの日付の差を測定します。

Note
注意

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)

UCaseLCase は、大文字・小文字を区別しない比較を行いたいときに便利です。例えば、If UCase(category) = UCase("electronics") Then のように使えば、元の入力がどのような大文字・小文字でも正しく比較できます。Left、Right、Mid は文字列の一部を抽出する関数で、カウントの開始位置が異なります。LeftRight は両端から、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

RoundInt はどちらも数値を小さくしますが、方法が異なります。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)

CDblDouble 型、CIntInteger 型、CStrString 型、CDateDate 型に変換します。

課題

  1. Mid を使って "P003" の数値部分のみを抽出する行(ヒント:2文字目から開始)。
  2. 抽出したテキストを CInt または CLng で実際の数値に変換する行。
  3. DateDiff を使って、Emma Davis が雇用された日(15/03/2020)から今日まで何日経過したかを計算する行。
ヒント
expand arrow

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 に正しい順序(先に過去の日付)で渡す — 逆にすると負の値になる。
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  3

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  3
some-alt