【エクセルVBA】とは?関数一覧と実践例
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 |
Exp | eを底とする指定した数値の指数関数を計算します。 | Exp(1) | 2.718281828 |
Fix | 数値の整数部分を返します。正数では小数点以下を切り捨て、負数では小数点以下を切り上げます。 | Fix(-123.45) | -123 |
Int | 数値の整数部分を返します。常に小数点以下を切り捨てます。 | Int(-123.45) | -124 |
Log | 指定した数値の自然対数を返します。 | Log(E()) | 1 |
Rnd | 0以上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.Clear | Err オブジェクトをクリアします。 | Err.Clear |
エラーハンドリングの基本的な使い方は、以下の通りです:
On Error GoTo ErrorHandler
' ここに通常の処理を記述
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description
Err.Clear
On Error GoTo
ステートメントを使用してエラーが発生した場合のジャンプ先を指定し、エラー情報をErr
オブジェクトから取得して適切に処理します
104の実践例(カテゴリ別)
ここからはカテゴリ別に実践例を紹介します
知りたい情報へは、目次から素早くアクセスできます
<文字列操作>
文字列操作は、データの整形や検証、ログの生成など、あらゆるプログラムにおいて基本的かつ不可欠な処理の一つです。
文字列を効率的に扱うためのVBA関数を10個選び、それぞれについて具体的な使用例、コード、そして簡単な解説を提供します。
一つの文字列が別の文字列に含まれる位置を検索
InStr
関数は
指定された文字列が別の文字列内に最初に現れる位置を返します
文字列内の特定のパターンやキーワードの存在チェックに有効です
Dim position As Integer
position = InStr("Hello World", "World")
If position > 0 Then
MsgBox "'World' は位置 " & position & " に見つかりました。"
Else
MsgBox "'World' は見つかりませんでした。"
End If
<ファイル操作>
ファイル操作は、データの保存、読み込み、管理などを自動化する上で重要な役割を果たします
ファイルやフォルダに対するさまざまな操作を行う関数やステートメントが用意されています
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におけるオブジェクト操作は、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
現在アクティブなブックやシートにアクセス
ActiveWorkbook
やActiveSheet
プロパティを使用すると
現在アクティブなワークブックやシートに簡単にアクセスできます
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