VBAとは?カテゴリ別の関数一覧と104の実践例を紹介

当ページのリンクには広告が含まれています。

スポンサーリンク

VBAの全体像とVBA関数について解説しています

  • そもそも VBAとは? マクロとの違いも含め解説
  • VBA関数カテゴリ別 一覧表 で紹介
  • カテゴリ別の具体例合計104個 紹介

VBA関数を単体で見ただけでは、使うイメージがしづらいと思うので

カテゴリ別に分けて、具体例(例、解説、コード、出力結果)を紹介しています

目次から知りたい情報へ飛んで、辞書のように使って ください

悩み解決・アイデア探し・業務改善 に役立てば嬉しいです

Microsoft公式リファレンス でも「VBA関数」について学ぶことができます

クリックしてジャンプ

VBAとは、関数を自作すること

VBA(Visual Basic for Applications)とは Microsoft Office製品を拡張するためのプログラミング言語です

自動化したり、特定の操作をカスタマイズするためのスクリプト(プログラム)を書くことができます

というのが みんなが口をそろえて言うセリフですが、初心者からすると意味不明です

要するにどういうことか?

「VBA」を学ぶということは、関数を自作する ということです

例えば、皆が知ってるであろう「SUM関数」

選択した範囲を合計するソレです

VBAを用いることで、SUM関数と同じ動作の関数を自作する事が出来ます

「=SUM()」と全く同じ機能を持った「=俺のSUM()」という関数を作ってみます

動画を見てください

イメージ動画(音声はありません)

スポンサーリンク

動画のように関数を自作すことができます

自作した関数によって、実務を効率化したり 自動化したりできます

作った関数は 動画のように セルに打ち込んで 使用したり

ボタンを配置し それを クリック する事で使用したり、様々な実行方法があります

「他のエクセルブックを開いて、セル範囲を指定して、コピーして、今のブックに貼り付ける」

のような一連の作業を関数として作成し、その関数をボタンクリックで実行 のようなこともできます

普段のルーティンワークを自動化することができます

それが VBA です

こちら が上記のような自動化を紹介した記事です

ちなみに「俺のSUM」のコードは以下です

Function 俺のSUM(range As Range) As Double
    Dim cell As Range
    Dim total As Double
    total = 0 ' 合計を格納する変数の初期化
    
    ' 指定された範囲内の各セルに対してループ処理
    For Each cell In range
        If IsNumeric(cell.Value) Then ' セルの値が数値の場合のみ
            total = total + cell.Value ' 合計値に加算
        End If
    Next cell
    
    俺のSUM = total ' 計算された合計値を関数の結果として返す
End Function

VBA関数とは

一般に「VBA関数」と呼んでいるのは、予め用意されている「組み込みVBA関数」を指します

特定のタスクを実行するためのコードの集まりで、数値計算、文字列操作、日付と時間の管理など、様々な目的で使用されます

「組み込みVBA関数」を組み合わせることで、オリジナルの「関数」を 自作します

VBAとマクロの違い

違いを理解することは重要ではありませんが、一応 説明します

VBAとマクロは密接に関連していますが 同じものではありません

マクロ は、繰り返し行う操作を自動化する一連の命令のこと

VBA は、マクロを作成するための言語

以上。です

スポンサーリンク

VBA関数一覧(カテゴリ別)

数値、文字列、日時、配列、ファイル、変換、条件分岐、エラーハンドリングなど、カテゴリ別に関数一覧表を作成してあります。

知りたいカテゴリへは、目次からすばやくアクセスできます。

<数値>

数値を操作する関数一覧です

スクロールできます
名前説明サンプルコード結果
Abs指定した数値の絶対値を返します。Abs(-123)123
Atn指定した数値のアークタンジェント(逆正接)を返します。Atn(1)0.785398163
Cos指定した角度のコサインを返します。Cos(PI()/3)0.5
Expeを底とする指定した数値の指数関数を計算します。Exp(1)2.718281828
Fix数値の整数部分を返します。正数では小数点以下を切り捨て、負数では小数点以下を切り上げます。Fix(-123.45)-123
Int数値の整数部分を返します。常に小数点以下を切り捨てます。Int(-123.45)-124
Log指定した数値の自然対数を返します。Log(E())1
Rnd0以上1未満の乱数を生成します。Rnd()0.7055475 (例)
Sgn数値の符号を示します。(正は1、0は0、負は-1)Sgn(-10)-1
Sin指定した角度のサインを返します。Sin(PI()/2)1
Sqr指定した数値の平方根を返します。Sqr(16)4
Tan指定した角度のタンジェントを返します。Tan(PI()/4)1

スポンサーリンク

<文字列>

文字列を操作する関数一覧です

スクロールできます
名前説明サンプルコード結果
Asc指定した文字の文字コードを返します。Asc("A")65
Chr指定した文字コードに対応する文字を返します。Chr(65)"A"
InStr一つの文字列内で別の文字列が最初に現れる位置を返します。InStr("Hello World", "World")7
LCase文字列を小文字に変換します。LCase("HELLO")"hello"
Left文字列の左端から指定した数の文字を返します。Left("Hello World", 5)"Hello"
Len文字列の長さ(文字数)を返します。Len("Hello")5
Mid文字列の指定された位置から、指定された数の文字を返します。Mid("Hello World", 7, 5)"World"
Right文字列の右端から指定した数の文字を返します。Right("Hello World", 5)"World"
StrComp二つの文字列を比較し、結果を返します。StrComp("hello", "hello")0
Trim文字列の両端から空白を除去します。Trim(" Hello World ")"Hello World"
UCase文字列を大文字に変換します。UCase("hello")"HELLO"

スポンサーリンク

<日付と時刻>

日付と時刻を操作する関数一覧です

スクロールできます
名前説明サンプルコード結果
Date現在の日付を返します。Date()2024-03-20 (例)
DateAdd特定の日付単位(年、月、日など)を日付に加算します。DateAdd("m", 1, #2024-03-20#)2024-04-20
DateDiff二つの日付の間の特定の単位(年、月、日など)における差を計算します。DateDiff("d", #2024-03-20#, #2024-04-20#)31
DatePart日付から特定の部分(年、月、日など)を抽出します。DatePart("yyyy", #2024-03-20#)2024
DateSerial指定した年、月、日から日付を生成します。DateSerial(2024, 3, 20)2024-03-20
DateValue日付の文字列を日付型に変換します。DateValue("March 20, 2024")2024-03-20
Day指定した日付から「日」を抽出します。Day(#2024-03-20#)20
Month指定した日付から「月」を抽出します。Month(#2024-03-20#)3
Now現在の日付と時刻を返します。Now()2024-03-20 15:30:00 (例)
Time現在の時刻を返します。Time()15:30:00 (例)
Timer午前0時からの経過秒数を返します。Timer()55800 (例)
TimeSerial指定した時、分、秒から時刻を生成します。TimeSerial(15, 30, 0)15:30:00
TimeValue時刻の文字列を時刻型に変換します。TimeValue("15:30:00")15:30:00
Weekday指定した日付の曜日を返します。(1=日曜日)Weekday(#2024-03-20#)4 (水曜日)
Year指定した日付から「年」を抽出します。Year(#2024-03-20#)2024

スポンサーリンク

<配列>

配列を操作する関数一覧です

スクロールできます
名前説明サンプルコード結果
Array値のリストから配列を作成します。Array("apple", "banana", "cherry"){"apple", "banana", "cherry"}
LBound配列の最小インデックスを返します。LBound(Array("apple", "banana", "cherry"))0
UBound配列の最大インデックスを返します。UBound(Array("apple", "banana", "cherry"))2
Filter配列内の要素から特定の文字列を含むものを抽出します。Filter(Array("apple", "banana", "cherry"), "a"){"apple", "banana"}
Join配列の要素を指定した区切り文字で結合して文字列を作成します。Join(Array("apple", "banana", "cherry"), ", ")"apple, banana, cherry"
Split文字列を指定した区切り文字で分割して配列を作成します。Split("apple, banana, cherry", ", "){"apple", "banana", "cherry"}

スポンサーリンク

<ファイルとディレクトリ>

ファイルを操作する関数一覧です

スクロールできます
名前説明サンプルコード結果
Dirパターンに一致する最初のファイル名を返します。複数ある場合は、Dir関数を繰り返し呼び出して次のファイルを取得します。Dir("C:\*.txt")"example.txt"
EOFファイルの終端に達しているかどうかを示します。Open "C:\example.txt" For Input As #1 EOF(1)False
FileLen指定されたファイルのサイズ(バイト数)を返します。FileLen("C:\example.txt")1024
FreeFile使用できるファイル番号を返します。これにより、Openステートメントでファイルを開く際に使用するファイル番号の衝突を避けることができます。FreeFile()1
GetAttr指定したファイルまたはディレクトリの属性を返します。GetAttr("C:\example.txt")vbNormal
Kill指定したファイルを削除します。Kill("C:\example.txt")
MkDir新しいディレクトリを作成します。MkDir("C:\NewFolder")
RmDirディレクトリを削除します。RmDir("C:\NewFolder")

スポンサーリンク

<型変換>

型を変換する関数一覧です

スクロールできます
名前説明サンプルコード結果
CBool式をブール型(True または False)に変換します。CBool(0)False
CByte式をバイト型に変換します。CByte(123)123
CCur式を通貨型に変換します。CCur(123.456)123.456
CDate式を日付型に変換します。CDate("2024-03-20")2024-03-20
CDbl式を倍精度浮動小数点数に変換します。CDbl(123.456)123.456
CDec式を10進数に変換します。CDec(123.456)123.456
CInt式を整数型に変換します。CInt(123.456)123
CLng式を長整数型に変換します。CLng(123.456)123
CSng式を単精度浮動小数点数に変換します。CSng(123.456)123.456
CStr式を文字列型に変換します。CStr(123)"123"
CVar式をバリアント型(任意の型)に変換します。CVar("123.456")123.456

スポンサーリンク

<条件分岐と決定>

条件分岐に関する関数一覧です

スクロールできます
名前説明サンプルコード結果
IIf指定した条件がTrueかFalseかに基づいて、2つの値のいずれかを返します。IIf(True, "Trueの場合", "Falseの場合")"Trueの場合"
Choose指定したインデックスに応じて、リストから値を選択します。Choose(2, "一番目", "二番目", "三番目")"二番目"
Switch複数の条件を評価し、最初にTrueと評価される条件に対応する値を返します。Switch(1=2, "一番目", 2=2, "二番目", True, "それ以外")"二番目"
  • IIf関数は、単純な条件式に基づいて一方の値または他方の値を選択する際に便利です。
  • Choose関数は、インデックス(通常は数値)に基づいて値を選択する場合に使用されます。例えば、ユーザーの選択や一連のオプションからの選択を処理する際に役立ちます。
  • Switch関数は、複数の条件を同時に評価し、最初にTrueとなる条件に対応する値を返す場合に使用します。これにより、複数のIf-Then-ElseIfステートメントを簡潔に表現できます

スポンサーリンク

<その他の便利関数>

その他の便利な関数一覧です

スクロールできます
名前説明サンプルコード結果
Environ環境変数の値を返します。Environ("PATH")システムのPATH環境変数の値
IsArray指定した変数が配列かどうかを判定します。IsArray(Array("apple", "banana"))True
IsDate指定した式が日付として認識できるかを判定します。IsDate("2024-03-20")True
IsEmpty指定した変数が初期化されていないかを判定します。IsEmpty(a)True(aが未初期化の場合)
IsNull指定した式がNull値かどうかを判定します。IsNull(Nothing)True
IsNumeric指定した式が数値として評価できるかを判定します。IsNumeric("123.45")True
IsObject指定した変数がオブジェクトかどうかを判定します。IsObject(CreateObject("Scripting.FileSystemObject"))True
TypeName指定した変数のデータ型名を返します。TypeName(123)"Integer"
VarType指定した変数のバリアント型を示す数値を返します。VarType(123)2(整数型)

これらの関数を活用することで、プログラムの実行時にデータの型や状態を検証し、より堅牢なコードを書くことができます。例えば、ユーザー入力の検証、プログラム内での条件分岐の決定、変数の型に応じた処理の分岐などに役立ちます。

スポンサーリンク

<ユーザーインターフェース>

「MsgBox」や「InputBox」といった、ユーザーと対話するための基本的な関数一覧です

スクロールできます
名前説明サンプルコード結果
MsgBoxダイアログボックスを表示し、ユーザーからの応答を得ます。MsgBox("Hello World!", vbInformation, "Title")“Hello World!”というメッセージと情報アイコン、”Title”というタイトルのダイアログボックスが表示されます。
InputBoxユーザーにテキスト入力を求めるダイアログボックスを表示します。InputBox("あなたの名前は何ですか?", "名前の入力")“あなたの名前は何ですか?”と尋ねるダイアログボックスが表示され、ユーザーはテキストボックスに回答を入力できます。

これらの関数は、ユーザーから直接情報を取得したり、プログラムの実行状態について通知したりする際に非常に便利です。

スポンサーリンク

<エラーハンドリング>

エラーハンドリングに関する関数一覧です

スクロールできます
名前説明サンプルコード結果
Err.Number最後に発生したエラーの番号を返します。Err.Numberエラーコード(例: 9)
Err.Description最後に発生したエラーの説明を返します。Err.Descriptionエラーの説明(例: “Subscript out of range”)
Err.ClearErrオブジェクトをクリアします。Err.Clear

エラーハンドリングの基本的な使い方は、以下の通りです:

On Error GoTo ErrorHandler

' ここに通常の処理を記述

Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description
    Err.Clear

On Error GoTo ステートメントを使用してエラーが発生した場合のジャンプ先を指定し、エラー情報をErrオブジェクトから取得して適切に処理します

スポンサーリンク

104の実践例(カテゴリ別)

ここからはカテゴリ別に実践例を紹介します

知りたい情報へは、目次から素早くアクセスできます

<日付 / 時刻>

日付や時刻を操作するVBA関数は、日報作成やスケジュール管理など、ビジネスアプリケーション開発において非常に重要です

実務での使用例、コードスニペット、および簡単な解説を提供します

現在のシステム日付

Date関数は、システムの現在日付を取得します

報告書やログファイルに日付を記録する場合に便利です

Dim today As Date
today = Date
MsgBox "今日の日付は " & today & " です。"

現在のシステム時刻

Time関数は、現在の時刻を文字列形式で返します

タイムスタンプの記録や時間に基づく処理の実行に使用されます

Dim currentTime As String
currentTime = Time
MsgBox "現在の時刻は " & currentTime & " です。"

現在の日付と時刻

Now関数は、現在の日付と時刻を返します

ログ記録やタイムスタンプの作成に非常に便利です

Dim currentDateTime As String
currentDateTime = Now
MsgBox "現在の日付と時刻は " & currentDateTime & " です。"

日付に指定された期間を加算

DateAdd関数は、指定された日付に日数、月数、年数などを加算した新しい日付を返します

期限日の計算やスケジュール調整に役立ちます

Dim futureDate As Date
futureDate = DateAdd("d", 10, Date) ' 今日から10日後
MsgBox "10日後の日付は " & futureDate & " です。"

二つの日付の差を計算

DateDiff関数は、2つの日付の間の差(日数、月数、年数など)を計算します

プロジェクトの期間計算や経過日数の計測に便利です

Dim startDate As Date
Dim endDate As Date
Dim dayCount As Long

startDate = #1/1/2024#
endDate = #1/31/2024#
dayCount = DateDiff("d", startDate, endDate)

MsgBox "期間内の日数: " & dayCount

日付から月を取得

Month関数は

指定した日付から月を整数で返します

月ごとの報告書作成などに使用されます

Dim thisMonth As Integer
thisMonth = Month(Now)
MsgBox "現在は " & thisMonth & " 月です。"

日付から年を取得

Year関数は

指定された日付の年を返します。年次報告書の作成などに役立ちます

Dim thisYear As Integer
thisYear = Year(Now)
MsgBox "現在の年は " & thisYear & " です。"

日付から日を取得

Day関数は

指定された日付から日を返します

日ごとのデータ集計やログ記録に便利です

Dim today As Integer
today = Day(Date)
MsgBox "今日は " & today & " 日です。"

日付から曜日を取得

Weekday関数は

指定された日付の曜日を数字で返します(例: 日曜日=1)

スケジュール管理や曜日に基づいた条件分岐に使用されます

Dim dayOfWeek As Integer
dayOfWeek = Weekday(Now)
MsgBox "今日の曜日番号は " & dayOfWeek & " です。"

年、月、日から日付を作成

DateSerial関数は

年、月、日を指定して新しい日付を作成します

特定の日付を基準にした処理や計算に便利です

Dim specificDate As Date
specificDate = DateSerial(2024, 1, 1)
MsgBox "指定した日付は " & specificDate & " です。"

スポンサーリンク

<文字列操作>

文字列操作は、データの整形や検証、ログの生成など、あらゆるプログラムにおいて基本的かつ不可欠な処理の一つです。

文字列を効率的に扱うためのVBA関数を10個選び、それぞれについて具体的な使用例、コード、そして簡単な解説を提供します。

文字列の長さ

Len関数は

指定された文字列の文字数を整数で返します

文字列の検証や処理の際に長さを知ることが必要な場合に使用します

Dim length As Integer
length = Len("Hello World")
MsgBox "文字列の長さは " & length & " 文字です。"

一部を抽出

Mid関数は

指定された位置から指定された数の文字を文字列から抽出します

特定のパターンを持つ文字列から特定の部分を取り出す際に便利です

Dim partOfString As String
partOfString = Mid("Hello World", 7, 5)
MsgBox "抽出した文字列は '" & partOfString & "' です。"

文字を置換

Replace関数は

文字列内の指定された文字列を別の文字列に置換します

データの整形や修正に使用されます

Dim replacedString As String
replacedString = Replace("I love VBA", "love", "like")
MsgBox "置換後の文字列は '" & replacedString & "' です。"

前後の空白を削除

Trim関数は

文字列の先頭と末尾の空白文字を削除します

入力値の前後に不要な空白がある場合に有効です

Dim trimmedString As String
trimmedString = Trim("  Hello World  ")
MsgBox "'" & trimmedString & "'"

左側から指定された数の文字を取得

Left関数は

文字列の左側から指定された文字数分の文字列を返します

特定のフォーマットから必要な情報を切り出す場合に役立ちます

Dim leftPart As String
leftPart = Left("Hello World", 5)
MsgBox "左側の文字列は '" & leftPart & "' です。"

右側から指定された数の文字を取得

Right関数は

文字列の右側から指定された文字数分の文字列を返します

ファイル名の拡張子を取得する場合などに使用されます

Dim rightPart As String
rightPart = Right("Hello World", 5)
MsgBox "右側の文字列は '" & rightPart & "' です。"

大文字に変換

UCase関数は

指定された文字列内のすべての小文字を大文字に変換します

一貫した文字列の処理や比較を行う際に役立ちます

Dim upperCaseString As String
upperCaseString = UCase("Hello World")
MsgBox "大文字に変換: '" & upperCaseString & "'"

小文字に変換

LCase関数は

指定された文字列内のすべての大文字を小文字に変換します

大文字・小文字を問わない検索や比較に使用されます

Dim lowerCaseString As String
lowerCaseString = LCase("Hello World")
MsgBox "小文字に変換: '" & lowerCaseString & "'"

文字列の変換(例: 全角⇔半角)

StrConv関数は

文字列の大文字・小文字変換、全角・半角変換など、さまざまな形式の変換をサポートします

国際化されたアプリケーションで特に役立ちます

Dim convertedString As String
convertedString = StrConv("アイウエオ", vbHiragana)
MsgBox "変換後の文字列: '" & convertedString & "'"

一つの文字列が別の文字列に含まれる位置を検索

InStr関数は

指定された文字列が別の文字列内に最初に現れる位置を返します

文字列内の特定のパターンやキーワードの存在チェックに有効です

Dim position As Integer
position = InStr("Hello World", "World")
If position > 0 Then
    MsgBox "'World' は位置 " & position & " に見つかりました。"
Else
    MsgBox "'World' は見つかりませんでした。"
End If

スポンサーリンク

<データ型操作>

データ型操作関連の関数は、VBAにおけるプログラムの柔軟性と信頼性を高めるために不可欠です

異なるデータ型間での変換や特定のデータ型の操作を可能にするこれらの関数を通じて、エラーの可能性を減らし、プログラムの効率を向上させることができます

それぞれについて具体的な使用例、コードスニペット、そして簡単な解説を提供します

整数型に変換

CInt関数は

数値を整数に丸めて変換します

小数点以下は四捨五入されます

数値の加工やパラメータの型指定に使用されます

Dim number As Integer
number = CInt(10.75)
MsgBox "整数に変換された値: " & number

倍精度浮動小数点数に変換

CDbl関数は

文字列や数値を倍精度浮動小数点数に変換します

計算精度を必要とする場合に便利です

Dim doubleNumber As Double
doubleNumber = CDbl("123.456")
MsgBox "倍精度浮動小数点数に変換された値: " & doubleNumber

文字列に変換

CStr関数は

数値や日付を文字列に変換します

数値や日付をテキストとして扱う場合に使用されます

Dim text As String
text = CStr(100)
MsgBox "文字列に変換された値: '" & text & "'"

日付に変換

CDate関数は

文字列を日付型に変換します

日付としての妥当性が必要な場合に役立ちます

Dim dateValue As Date
dateValue = CDate("January 1, 2024")
MsgBox "日付に変換された値: " & dateValue

長整数型に変換

CLng関数は

数値を長整数に変換します

より大きな整数値を扱う必要がある場合に使用されます

Dim longNumber As Long
longNumber = CLng(123456789)
MsgBox "長整数に変換された値: " & longNumber

単精度浮動小数点数に変換

CSng関数は

数値を単精度浮動小数点数に変換します

メモリ使用量を節約するための計算に適しています

Dim singleNumber As Single
singleNumber = CSng(123.456)
MsgBox "単精度浮動小数点数に変換された値: " & singleNumber

式を論理値に変換

CBool関数は

数値をTrueまたはFalseの論理値に変換します

条件式の結果を扱う際に用いられます

Dim logicValue As Boolean
logicValue = CBool(1)
MsgBox "論理値に変換された値: " & logicValue

バリアント型に変換

CVar関数は

任意のデータ型をバリアント型に変換します

バリアント型はあらゆる種類のデータを格納できる柔軟性を持ちます

Dim variantValue As Variant
variantValue = CVar("任意の値")
MsgBox "バリアント型に変換された値: " & variantValue

バイト型に変換

CByte関数は

数値をバイト型に変換します

0から255までの範囲の整数値を扱う際に使用されます

Dim byteValue As Byte
byteValue = CByte(255)
MsgBox "バイト型に変換された値: " & byteValue

通貨型に変換

CCur関数は

数値を通貨型に変換します

金融データの処理において、高い精度を要求される場合に有効です

Dim currencyValue As Currency
currencyValue = CCur(123.456)
MsgBox "通貨型に変換された値: " & currencyValue

スポンサーリンク

<乱数や配列>

乱数や配列を扱う関数は、データのサンプリング、テストデータの生成、データの格納や操作など、多岐にわたる用途で活用されます

VBAで乱数を生成したり、配列を効率的に扱ったりするための主要な関数を10個紹介します

それぞれに具体的な使用例、コードスニペット、そして簡単な解説を提供します。

乱数を生成

Rnd関数は

0以上1未満のランダムなSingle型の値を返します

Randomizeステートメントと組み合わせて使うことで、毎回異なる乱数を生成できます

Randomize ' 乱数ジェネレータを初期化
Dim randomNumber As Single
randomNumber = Rnd ' 0以上1未満の乱数を生成
MsgBox "生成された乱数: " & randomNumber

乱数ジェネレータのシード値を設定

Randomizeステートメントは

乱数ジェネレータのシード値を設定します

シード値にはTimer関数を使うことが多く

プログラムの実行ごとに異なる乱数シーケンスが得られます

Randomize Timer ' 現在時刻をシード値として使用

配列を作成

Array関数は

引数に指定した値から配列を作成します

作成された配列はVariant型であり、異なるデータ型の値を含むことができます

Dim myArray As Variant
myArray = Array("Apple", "Banana", "Cherry")
MsgBox "配列の第1要素: " & myArray(0)

配列の最大インデックスを返す

UBound関数は

指定された配列の最大インデックス(要素数-1)を返します

配列のサイズを知ることができるため、配列をループ処理する際に有用です

Dim myArray As Variant
myArray = Array("Apple", "Banana", "Cherry")
MsgBox "配列の最大インデックス: " & UBound(myArray)

配列の最小インデックスを返す

LBound関数は

指定された配列の最小インデックスを返します

VBAでは配列のインデックスが通常0から始まるため

この関数の戻り値はほとんどの場合0ですが

Option Base 1を使用している場合や

動的配列を特定のインデックスから始めた場合に便利です

Dim myArray As Variant
myArray = Array("Apple", "Banana", "Cherry")
MsgBox "配列の最小インデックス: " & LBound(myArray)

配列のサイズを変更

ReDimステートメントは

動的配列のサイズを変更します

Preserveキーワードを使うことで

既存の配列データを保持したままサイズ変更が可能です

Dim myArray() As Integer
ReDim myArray(5)
ReDim Preserve myArray(10) ' Preserveキーワードで元のデータを保持しつつサイズ変更
MsgBox "配列の新しいサイズ: " & UBound(myArray) + 1

文字列を区切り文字で分割して配列に格納

Split関数は

第一引数に指定された文字列を第二引数に指定された区切り文字で分割し

結果を配列として返します

文字列データを配列に変換する際に役立ちます

Dim myArray() As String
myArray = Split("Apple,Banana,Cherry", ",")
MsgBox "配列の第2要素: " & myArray(1)

配列の要素を結合して文字列にする

Join関数は

配列の要素を指定された区切り文字で結合し、1つの文字列として返します

配列のデータを文字列で表現したい場合に使用されます

Dim myArray As Variant
myArray = Array("Apple", "Banana", "Cherry")
Dim myString As String
myString = Join(myArray, ", ")
MsgBox "結合された文字列: " & myString

配列かどうかを判定

IsArray関数は

指定された式が配列であるかどうかを判定します

変数の型を確認する際に役立ちます

Dim myArray As Variant
myArray = Array("Apple", "Banana", "Cherry")
If IsArray(myArray) Then
    MsgBox "変数は配列です。"
Else
    MsgBox "変数は配列ではありません。"
End If

要素を初期化

Eraseステートメントは

指定された配列の要素を全て初期化します

動的配列の場合、サイズも0になります

配列をリセットしたい時に使用します

Dim myArray() As Integer
ReDim myArray(5)
Erase myArray ' 配列の要素を全て初期化

スポンサーリンク

<ファイル操作>

ファイル操作は、データの保存、読み込み、管理などを自動化する上で重要な役割を果たします

ファイルやフォルダに対するさまざまな操作を行う関数やステートメントが用意されています

VBAで利用できるファイル操作関連の主要な機能を10個選び、それぞれについて具体例と共に紹介します

ファイルを開く

Openステートメントは

ファイルを開くために使用され

For Input

ファイルからの読み取り専用を意味します

#1はファイル番号です。

Open "C:\test.txt" For Input As #1
' ファイル操作
Close #1

ファイルを閉じる

Closeステートメントは

指定したファイル番号のファイルを閉じます

ファイル操作後は必ず閉じる必要があります

Close #1

ファイルにデータを書き込む

Print #ステートメントは

開かれたファイルにデータを書き込みます

For Output

ファイルへの書き込み専用を意味します

Open "C:\test.txt" For Output As #1
Print #1, "Hello, World!"
Close #1

ファイルからデータを読み取る

Input$関数は

開かれたファイルから指定された数の文字を読み取ります

LOF(1)

ファイル番号1の長さ(バイト数)を返します

Dim data As String
Open "C:\test.txt" For Input As #1
data = Input$(LOF(1), #1)
Close #1
MsgBox data

ファイルから一行読み取る

Line Inputステートメントは

開かれたファイルから一行を読み取り、変数に格納します

Dim lineData As String
Open "C:\test.txt" For Input As #1
Line Input #1, lineData
Close #1
MsgBox lineData

ファイルの終端を判定

EOF関数は

指定したファイル番号のファイルが終端に達したかどうかを判定します

ファイルの内容を最後まで読み取る際に使用します

Dim data As String
Open "C:\test.txt" For Input As #1
Do Until EOF(1)
    Line Input #1, data
    MsgBox data
Loop
Close #1

ファイルを削除

Killステートメントは

指定したパスのファイルを削除します

ファイルのクリーンアップに使用されます

Kill "C:\test.txt"

ファイルやフォルダの一覧を取得

Dir関数は

指定したパターンに一致するファイルやフォルダの名前を返します

ファイルやフォルダの一覧を取得する際に便利です

Dim fileName As String
fileName = Dir("C:\*.*")
Do While fileName <> ""
    MsgBox fileName
    fileName = Dir()
Loop

新しいフォルダを作成

MkDirステートメントは

指定したパスに新しいフォルダを作成します

フォルダが既に存在する場合はエラーが発生します

MkDir "C:\NewFolder"

カレントディレクトリを変更

ChDirステートメントは

プログラムのカレントディレクトリを変更します

ファイル操作のデフォルトの場所を変更するのに使用されます

ChDir "C:\NewFolder"

スポンサーリンク

<エラー処理>

エラー処理は、プログラムが予期せぬエラーに遭遇したときに、それを適切に処理し、プログラムの安定性と信頼性を確保するために重要です

VBAでは、エラー処理を効率的に行うためのいくつかのステートメントが用意されています

エラー処理に関連する主要な機能を紹介し、それぞれについて具体的な使用例と簡単な解説を提供します

エラーハンドラへのジャンプ

On Error GoToステートメントは

エラーが発生した場合に指定したラベル(エラーハンドラ)にジャンプします

エラー処理を集中して記述することができ、コードの可読性が向上します

On Error GoTo ErrorHandler
' ここに通常のコードを記述
Exit Sub
ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description
    Resume Next

エラー番号の取得

Err.Numberプロパティは

発生したエラーの番号を返します

この番号を用いて、特定のエラーに対する対応を行うことができます

If Err.Number <> 0 Then
    MsgBox "エラー番号: " & Err.Number
End If

エラーの説明を取得

Err.Descriptionプロパティは

発生したエラーの詳細な説明を返します

ユーザーにエラー情報を提供する際に有用です

MsgBox "エラーの説明: " & Err.Description

エラーオブジェクトをクリア

Err.Clearメソッドは

エラーオブジェクトの現在の値をクリアします

エラー処理後にエラー情報をリセットする際に使用します

Err.Clear

次の行から処理を続行

On Error Resume Nextステートメントは

エラーが発生しても次の行から処理を続けるように指示します

このモードではエラーが無視されるため

エラーが発生した後にErr.Numberをチェックして

適切に処理する必要があります

On Error Resume Next
' エラーが発生しうるコード
If Err.Number <> 0 Then
    ' エラー処理
End If

エラーハンドリングを無効

On Error GoTo 0ステートメントは

On Error Resume Nextによるエラーハンドリングを無効にし

エラーが発生した場合にデフォルトのエラーハンドラを使用するように設定します

エラーハンドリングの範囲を制限することができます

On Error GoTo 0

スポンサーリンク

<数学関係>

VBAには、数値計算をサポートする多くの数学関係の関数があります

金融分析、統計データの処理、エンジニアリング計算など、多岐にわたる用途で役立ちます

数学関連の主要なVBA関数をいくつかピックアップし、それぞれの具体的な使用例と解説を提供します

絶対値を返す

Abs関数は

指定された数値の絶対値を返します

負の値を正の値に変換する際に使用されます

Dim result As Double
result = Abs(-10.5)
MsgBox "絶対値: " & result

平方根を計算

Sqr関数は

指定された数値の平方根を返します

数学的な計算や統計分析においてよく使用されます

Dim result As Double
result = Sqr(16)
MsgBox "平方根: " & result

乱数を生成

Rnd関数は

0 から 1 までのランダムなSingle型の値を返します

Randomizeステートメントと組み合わせて

異なる乱数シーケンスを生成します

Randomize
Dim randomNumber As Single
randomNumber = Rnd
MsgBox "乱数: " & randomNumber

整数部分を返す(Int

Int関数は

指定された実数の整数部分を返します

数値の切り捨てに使用されます

Dim result As Integer
result = Int(10.75)
MsgBox "整数部分: " & result

数値を丸める

Round関数は

指定された精度で数値を丸めます

第二引数には小数点以下の桁数を指定します

金融計算など、特定の精度での数値処理に使用されます

Dim result As Double
result = Round(10.678, 2)
MsgBox "丸めた結果: " & result

自然対数を計算

Log関数は

指定された数値の自然対数(底はe)を返します

科学計算や統計分析でよく使用されます

Dim result As Double
result = Log(10)
MsgBox "自然対数: " & result

三角関数を計算

Sin, Cos, Tan関数は

それぞれ指定された角度(ラジアン単位)の正弦、余弦、正接を返します

物理学やエンジニアリングの問題を解く際に頻繁に使用されます

Dim angle As Double
angle = 3.14159265358979 / 4 ' 45度(ラジアンで指定)

MsgBox "Sin: " & Sin(angle)
MsgBox "Cos: " & Cos(angle)
MsgBox "Tan: " & Tan(angle)

自然対数の底eの指数関数を計算

Exp関数は

e(自然対数の底)を指定された数値のべき乗にした結果を返します

指数関数の計算に使用されます

Dim result As Double
result = Exp(1)
MsgBox "eの1乗: " & result

整数部分を返す(Fix

Fix関数もInt関数と同様に

数値の整数部分を返しますが、負の数値に対する挙動が異なります

Fixは数値を0に近づける方向で切り捨てます

Dim result As Integer
result = Fix(-10.75)
MsgBox "Fix結果: " & result

円周率πの値を返す

Pi関数は

円周率πの値を返します

円や球の面積、体積の計算に必要な定数です

Dim piValue As Double
piValue = Application.Pi
MsgBox "Piの値: " & piValue

スポンサーリンク

<オブジェクト操作>

VBAにおけるオブジェクト操作は、ExcelシートやWord文書、Outlookメールなど、Microsoft Officeアプリケーションの豊富なオブジェクトモデルにアクセスし、これらを制御するために不可欠です

オブジェクトを扱う際によく使用される操作やプロパティ、メソッドを紹介します

外部アプリケーションのオブジェクトを生成

CreateObject関数は

指定されたプログラムIDを持つオブジェクト(例:Excelアプリケーション)を生成します

他のOfficeアプリケーションやCOMオブジェクトを操作する際に使用されます

Dim excelApp As Object
Set excelApp = CreateObject("Excel.Application")
excelApp.Visible = True

既存のオブジェクトにアクセス

GetObject関数は

既に開かれているオブジェクトやファイルにアクセスするために使用されます

特定のファイルやアプリケーションのインスタンスとの連携に役立ちます

Dim existingWorkbook As Object
Set existingWorkbook = GetObject("C:\path\to\file.xlsx")

プロパティやメソッドにアクセス

Withステートメントは

同一のオブジェクトに対する複数の操作をグループ化しコードの可読性を高めるために使用されます

With Worksheets("Sheet1")
    .Cells(1, 1).Value = "Hello"
    .Cells(1, 2).Value = "World"
End With

オブジェクト変数にオブジェクトを割り当て

Setステートメントは

オブジェクト変数にオブジェクトの参照を割り当てる際に使用されます

オブジェクト変数を通じてオブジェクトのプロパティやメソッドにアクセスできます

Dim sheet As Worksheet
Set sheet = ThisWorkbook.Sheets("Sheet1")

オブジェクト変数の割り当てを解除

オブジェクト変数からオブジェクトの参照を解除するために

Nothingキーワードを使用します

不要になったオブジェクトへの参照をクリアしメモリリソースの解放を助けます

Set sheet = Nothing

コレクションに新しいアイテムを追加

.Addメソッドは

新しいシートをワークブックに追加するなどコレクションに新しいアイテムを追加する際に使用されます

Dim newSheet As Worksheet
Set newSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))

オブジェクトを削除

.Deleteメソッドは

指定したオブジェクト(例えばワークシート)を削除します

不要なデータやオブジェクトの整理に役立ちます

ThisWorkbook.Sheets("Sheet2").Delete

現在アクティブなブックやシートにアクセス

ActiveWorkbookActiveSheetプロパティを使用すると

現在アクティブなワークブックやシートに簡単にアクセスできます

ActiveWorkbook.Save
ActiveSheet.Cells(1, 1).Value = "Active Sheet"

セル範囲を指定

RangeオブジェクトやCellsメソッドを使用して

ワークシート上の特定のセルや範囲を指定し値の設定や書式設定を行うことができます

With Range("A1:B2")
    .Value = "Test"
    .Font.Bold = True
End With

Cells(1, 1).Value = "First Cell"

セル範囲内で値を検索

Findメソッドは

指定した範囲内で特定の値を検索し見つかった場合はそのセルを返します

データ検索や情報抽出の際に使用されます

Dim foundCell As Range
Set foundCell = Sheets("Sheet1").Range("A1:A100").Find(What:="検索文字列")
If Not foundCell Is Nothing Then
    MsgBox "見つかったセル: " & foundCell.Address
Else
    MsgBox "文字列が見つかりませんでした。"
End If

スポンサーリンク

<グラフィックと描画>

ExcelやWordなどのOfficeアプリケーション内でグラフィック要素(図形、チャートなど)を操作するための多くの関数やプロパティが用意されています

データの視覚化、報告書の美化、ユーザーインターフェースのカスタマイズなどが行えます

グラフィックと描画に関連する主要な操作をいくつか紹介します

図形を追加

AddShapeメソッドは

ワークシートに指定された形状(この例では四角形)を追加します

位置とサイズを指定して図形を作成し色を設定することができます

Dim shape As Object
Set shape = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 10, 10, 100, 50)
shape.Fill.ForeColor.RGB = RGB(255, 0, 0)

チャートを作成する

ChartObjects.Addメソッドは

ワークシートに新しいチャートを追加します

データソースを指定しチャートの種類を設定することができます

Dim chartObj As ChartObject
Set chartObj = ActiveSheet.ChartObjects.Add(Left:=100, Width:=375, Top:=50, Height:=225)
chartObj.Chart.SetSourceData Source:=Range("A1:B10")
chartObj.Chart.ChartType = xlLine

セルの背景色を設定

Interior.Colorプロパティを使用して

セルの背景色を設定します

色はRGB値で指定します

Range("A1").Interior.Color = RGB(0, 255, 0)

セルの背景色やパターン(模様)を操るための詳細は こちら で紹介しています

セルの枠線を設定

Bordersプロパティを使用して

セル範囲の特定の枠線(この例では下辺)に対するスタイル、色、太さを設定します

With Range("A1:B2").Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Color = RGB(0, 0, 0)
    .Weight = xlMedium
End With

テキストエフェクトを追加する

AddTextEffectメソッドは

ワークシートに特殊効果が適用されたテキストを追加します

フォントの種類、サイズ、太字の有無などをカスタマイズできます

Dim textEffect As Shape
Set textEffect = ActiveSheet.Shapes.AddTextEffect(PresetTextEffect:=msoTextEffect1, Text:="Hello World", _
    FontName:="Arial", FontSize:=24, FontBold:=msoTrue, FontItalic:=msoFalse, Left:=100, Top:=100)

画像を挿入する

AddPictureメソッドは

指定したパスの画像をワークシートに挿入します

画像の位置やサイズを指定することができます

Dim picture As Shape
Set picture = ActiveSheet.Shapes.AddPicture("C:\path\to\image.jpg", _
    LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=50, Top:=50, Width:=100, Height:=100)

スポンサーリンク

<データベース操作>

VBAを使用してデータベース操作を行う機能は、データの抽出、更新、挿入などのデータベース管理タスクを自動化する上で非常に有用です

Microsoft Office製品と連携することで、ExcelやAccessなどのアプリケーションから直接SQLクエリを実行し、データベースを操作することが可能になります

データベース操作に関連するVBAの主要な機能を紹介します

データベースへの接続を開く

ADODB.Connectionオブジェクトは

データベースへの接続を管理します

Openメソッドを使用して接続文字列を指定しデータベースへ接続します。

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\path\to\database.mdb"

データベースからデータを抽出

ADODB.Recordsetオブジェクトは

データベースから抽出したデータを保持します

OpenメソッドにSQLクエリと接続オブジェクトを指定してデータを抽出します

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM Table", conn, adOpenStatic, adLockReadOnly

SQLクエリを実行

ConnectionオブジェクトのExecuteメソッドを使用して、SQLクエリ(INSERT、UPDATE、DELETEなど)を直接実行します

データの更新や管理タスクを自動化できます

conn.Execute "INSERT INTO Table (Field1, Field2) VALUES ('Value1', 'Value2')"

パラメータ化されたSQLクエリを実行

ADODB.Commandオブジェクトを使用して、パラメータ化されたSQLクエリを実行することで、SQLインジェクション攻撃などのセキュリティリスクを減らすことができます

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
With cmd
    .ActiveConnection = conn
    .CommandText = "INSERT INTO Table (Field1, Field2) VALUES (?, ?)"
    .Parameters.Append .CreateParameter("param1", adVarChar, adParamInput, 50, "Value1")
    .Parameters.Append .CreateParameter("param2", adVarChar, adParamInput, 50, "Value2")
    .Execute
End With

トランザクションの管理

BeginTrans, CommitTrans, RollbackTransメソッドを使用して、複数の操作を1つのトランザクションとして管理します

エラーが発生した場合には、RollbackTransによって変更を元に戻すことができます

conn.BeginTrans
On Error GoTo RollbackTrans
conn.Execute "INSERT INTO Table1 (Field) VALUES ('Value')"
conn.Execute "INSERT INTO Table2 (Field) VALUES ('Value')"
conn.CommitTrans
Exit Sub
RollbackTrans:
    conn.RollbackTrans

スポンサーリンク

<イベント処理>

VBAでのイベント処理は、ユーザーからの入力や特定のアクションに応じてコードを実行するために重要です

Excel、Word、Accessなどのアプリケーションで発生するイベントを捕捉し、それに対応する処理を自動的に行うことができます

VBAにおけるイベント処理の主要な概念を紹介します。

ワークシートイベント

ワークシート内のセルが変更されたときに発生するChangeイベントを捕捉します

この例では、特定のセル(A1)が変更された場合にメッセージボックスを表示します。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        MsgBox "A1が変更されました。"
    End If
End Sub

ワークブックイベント

ワークブックが開かれたときに発生するOpenイベントを捕捉します

このコードはThisWorkbookオブジェクトの中に配置することで、ワークブック開始時に自動的に実行されます

Private Sub Workbook_Open()
    MsgBox "ワークブックが開かれました。"
End Sub

フォーム(UserForm)イベント

ユーザーフォーム上のコマンドボタンがクリックされたときに発生するClickイベントを捕捉します

ユーザーのアクションに対する応答として、メッセージボックスを表示します。

Private Sub CommandButton1_Click()
    MsgBox "ボタンがクリックされました。"
End Sub

コントロールイベント

ユーザーフォーム内のテキストボックスの内容が変更されたときに発生するChangeイベントを捕捉します

ユーザーによる入力の変更を検知して、特定の処理を実行することができます

Private Sub TextBox1_Change()
    MsgBox "テキストボックスの内容が変更されました。"
End Sub

アプリケーションイベント

Excelアプリケーション全体で発生するイベント(この例ではワークブックが閉じられる前のイベント)を捕捉します

WithEventsキーワードを使用してアプリケーションオブジェクトを宣言し、イベントを監視します

イベント処理の設定には、専用のセットアップサブルーチン(この例ではSetupApplicationEvent)を用います

Private WithEvents App As Application

Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    MsgBox "ワークブックが閉じられようとしています。"
End Sub

Sub SetupApplicationEvent()
    Set App = Application
End Sub

スポンサーリンク

<ユーザーインターフェイス>

VBAを使用してユーザーインターフェイス(UI)を操作する関数は、ユーザーの操作性を向上させ、インタラクティブなダイアログボックスやフォームを提供することで、ユーザーエクスペリエンスを豊かにします

UIを操作する際によく使用されるVBAの機能を紹介します

メッセージボックスを表示する

MsgBox関数は、ユーザーに情報を提供するためのシンプルなダイアログボックスを表示します。表示するテキスト、アイコン、ボタンの種類をカスタマイズできます。

MsgBox "処理が完了しました。", vbInformation, "完了"

ユーザーからの入力を受け取る

InputBox関数は、ユーザーからテキスト入力を受け取るためのダイアログボックスを表示します

入力された値を変数に格納して後続の処理で使用することができます。

Dim userName As String
userName = InputBox("あなたの名前を入力してください。", "名前の入力")

カスタムダイアログボックスを作成

UserFormは、VBAでカスタムダイアログボックスを設計し、表示するために使用します

テキストボックス、ラベル、ボタンなどのコントロールを配置して、ユーザーインタラクションを実装できます

' UserFormとそのコントロールの設計が必要
UserForm1.Show

ファイル選択ダイアログを表示

Application.GetOpenFilenameメソッドは、ファイル選択ダイアログボックスを表示し、ユーザーが選択したファイルのパスを返します

特定のファイルタイプをフィルタリングすることができます

Dim selectedFile As String
selectedFile = Application.GetOpenFilename("Excelファイル, *.xlsx")
If selectedFile <> "False" Then
    MsgBox "選択されたファイル: " & selectedFile
End If

保存ダイアログを表示

Application.GetSaveAsFilenameメソッドは、保存ダイアログボックスを表示し、ユーザーが指定した保存先のパスを返します

ファイルの保存処理をより柔軟に行うことができます

Dim savePath As String
savePath = Application.GetSaveAsFilename("document.xlsx", "Excelファイル, *.xlsx")
If savePath <> "False" Then
    MsgBox "保存されるパス: " & savePath
End If

ファイルやフォルダを選択

FileDialogオブジェクトを使用すると、ファイル選択、フォルダ選択、ファイルの保存など、さまざまな種類のファイルダイアログを表示できます

SelectedItemsコレクションを通じてユーザーが選択したアイテムにアクセスします

Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
If fd.Show = -1 Then
    MsgBox "選択されたフォルダ: " & fd.SelectedItems(1)
End If

スポンサーリンク

<ドキュメント作成>

ドキュメントやレポート作成は、データ分析、経営報告、プロジェクト管理など多くのビジネスプロセスにおいて重要な役割を果たします

VBAを活用することで、Word文書やExcelレポートの自動生成、フォーマットの調整、データの挿入などが効率的に行えます

ドキュメントとレポート作成に関連するVBAの主要な機能を紹介します

新しいWord文書を作成

Documents.Addメソッドは、新しいWord文書を開きます

Wordの自動化プロセスの一環として文書を生成できます

Dim doc As Word.Document
Set doc = Word.Application.Documents.Add
doc.Activate

新しいExcelワークブックを作成

Workbooks.Addメソッドは、新しいExcelワークブックを開きます

Excelでのデータ分析やレポート作成を自動化する際に使用されます

Dim wb As Excel.Workbook
Set wb = Excel.Application.Workbooks.Add
wb.Activate

Excelにデータを挿入

Range.Valueプロパティを使用して、指定したセル範囲にデータを挿入します

Excelレポートのデータ入力を自動化する際に役立ちます

Dim ws As Excel.Worksheet
Set ws = wb.Sheets(1)
ws.Range("A1").Value = "レポートタイトル"

Wordにテキストを挿入

Selection.TypeTextメソッドは、Word文書の現在の選択範囲にテキストを挿入します

Word文書の作成や編集を自動化する際に使用されます

Word.Application.Selection.TypeText Text:="ここに文書の内容が入ります。"

Excelにチャートを挿入

Charts.Addメソッドは、新しいチャートをワークブックに追加し、データ範囲とチャートタイプを設定します

データの視覚化を自動化する際に役立ちます

Dim chart As Excel.Chart
Set chart = wb.Charts.Add
With chart
    .SetSourceData Source:=ws.Range("A1:B10")
    .ChartType = xlColumnClustered
End With

Wordでメールマージを実行

MailMergeオブジェクトを使用して、Wordのメールマージ機能を自動化します

テンプレート文書にExcelなどの外部データソースからデータを挿入し、一括で文書を生成できます

Dim mainDoc As Word.Document
Set mainDoc = Word.Application.Documents.Open("メールマージテンプレート.docx")
With mainDoc.MailMerge
    .OpenDataSource Name:="データソース.xlsx"
    .Destination = wdSendToNewDocument
    .Execute
End With

スポンサーリンク

クリックしてジャンプ