VBAについて
VBA(Visual Basic for Applications)とは、ExcelやWordなどのMicrosoft Office製品で行う作業を自動化するためのプログラミング言語です。
通常は手作業で行っている入力作業や集計作業、ファイル操作などを自動化することができ、業務効率の向上や作業時間の短縮につながります。
具体的には、以下のような処理を自動化できます。
- データ入力や集計を自動化
- 請求書や納品書を自動で作成
- Outlookと連携して、顧客ごとにメールを自動送信する
- 複数のExcelファイルから必要なデータを取得し、1つのシートに集約する
- 集計結果からグラフやレポートを自動作成する
VBAを利用するメリットとして、手作業による転記ミスや計算ミスを削減できることが挙げられます。
また、ExcelやWordに標準搭載されているため特別な開発環境を準備する必要がなく、すぐに利用を開始できます。
さらに、作業手順をプログラムとして残せるため、担当者ごとの作業品質のばらつきを減らし、業務の属人化を防ぐことにもつながります。
VBAが実行できるファイルの拡張子
ExcelではVBAを用いてマクロを作成・実行することが可能ですが、通常のファイル形式である「.xlsx」ではVBAコードを保存することができません。
そのため、VBAを利用する場合はマクロに対応した拡張子を使用する必要があります。
主に「.xlsm」「.xlsb」「.xlam」の3種類が利用されます。
※今回の作成されるVBAの手順では Microsoft 365 version 2603 、拡張子「.xlsm」にて作成されています。
- .xlsm
最も一般的な形式で、通常のExcelファイルとして扱いながらマクロを利用することができます。 - .xlsb
データをバイナリ形式で保存するためファイルサイズが軽く、起動や処理速度が速い特徴があります。
そのため大量データの処理や複雑なマクロ処理に適しています。
※VBAの処理速度自体が大きく向上するわけではありません - .xlam
Excelの機能を拡張するためのアドイン形式であり、作成した機能をボタンや独自関数として追加し、常駐ツールとして利用することが可能です。
マクロとVBA、VBEの違いについて
本記事では VBA の作り方について解説を行いますが、混同しがちな要素であるマクロや VBE といった要素に関してもおさらいをしておきましょう。
マクロとVBAは同じものとして認識されることもありますが、厳密には役割が異なります。
マクロとはExcel上で行う作業を自動化する機能のことを指し、入力作業やデータ集計、グラフ作成などの繰り返し処理を効率化することができます。
つまり以下のような認識になります。
- マクロ =「自動化された一連の処理の単位」
- VBA =「マクロを記述する言語」
また「マクロの記録」機能を利用することで、操作内容を自動的にコードとして記録することが可能であり、初心者でも比較的簡単に扱うことができます。
VBA(Visual Basic for Applications)は、マクロの動作内容を記述するためのプログラミング言語です。
ExcelだけでなくWordやOutlookなどのMicrosoft Office製品でも利用することができ、処理を自動化することで作業効率の向上や人的ミスの削減につながります。
VBE(Visual Basic Editor)はVBAコードを作成・編集・実行するための開発環境であり、VBAはこのVBE上で記述されます。
VBEという開発環境上でVBAコードを作成し、その内容がExcel上で実行されるという関係になっています。
| 項目 | マクロ | VBA | VBE |
|---|---|---|---|
| メリット |
|
|
|
| デメリット |
|
|
|
作成~実行まで
では実際にVBAの有効化と作成、実行までを実際に作ってみましょう
今回作成するのは、A1セルとメッセージボックスに「Hello」を表示するマクロです。
ファイルを作成し、実際のコードの作成〜処理の実行までを解説していきます。
実装の全体図
ファイルの作成
マクロは通常のExcelファイルでは実行することができないため、実行可能なExcelファイルの作成を行います。
今回は拡張子を「.xlsm」にて作成を行なっていきます。
方法1:新規作成時に拡張子を「.xlsm」にして作成
方法2:既存ファイルの拡張子を「.xlsm」に変更する
導入
ExcelでVBAやマクロを利用するには「開発タブ」を追加する必要があります。
タブの追加方法は**[ファイル] > [オプション] > [リボンのユーザー設定] を開き、右側のリストにある「開発」にチェックを入れて[OK]を押します。
①ファイルを押下
②左側のオプションメニューを選択
③リボンのユーザー設定から、開発にチェックを入れて「OK」ボタンを押す
④タブに開発が追加されれば完了です
標準モジュールの作成
標準モジュールとは
標準モジュールとは、複数のシートから共通で呼び出せる マクロ(Sub)や関数(Function)を記述する場所です。
注意点としては他にもExcelを開いていると開いているファイル分だけモジュールが増えたようにみえる現象があります。
この場合だと本来実行するべきでないモジュールを実行してしまう危険性や、保存を間違えてしまう可能性があるため、
複数のブックが同時に表示されている場合は、どのブックのモジュールかを確認して実行する必要があります。
コードの作成
標準モジュールを作成するには、まずリボンのユーザー設定から開発タブが選択された状態でVBE(Visual Basic Editor)を開きます。
①開発タブのVisual Basicと書かれた部分を押下
②下記のような画面が表示される
②_1 projectを右クリックで「挿入」→「標準モジュールを選択」
挿入することで左側に「標準モジュール」が追加され、「Module1」が追加されます。
Module1という名称はVBE側で自動的につけられた名称のため、プロパティウィンドウにて変更することが可能です。
標準モジュール内に「Module1」が作成され、そこにマクロを記述します。
②_2 標準モジュールを作成すると以下のようになります
標準モジュールは複数作成することができ、別モジュールに定義したマクロは他のマクロから呼び出して処理を組み合わせることができます。
③モジュールは「Sub」から、「End Sub」まで囲んだ範囲を実行します。
マクロ名には任意の名前を付けることができ、その名前で実行時に識別されます。
Sub マクロ名()
~コード本文~
End Sub④マクロの実行
以下は実際にメッセージ表示とセルへの値入力を行うサンプルコードです。
Sub マクロ()
MsgBox "Hello, World!" 'メッセージボックスに表示
Range("A1").Value = "Hello" 'セルのA1に表示
End Sub実行手順
①画面上部の▶を押下
②実行
実行結果
実行すると、A1セルとメッセージボックスに「Hello」が表示されます。
よく利用する基本操作
① セルに値を入れる
実務では集計結果の出力やデータ転記、処理結果の表示など、シートへ情報を書き込む際によく利用します。
Sub 入力()
Range("A1").Value = "テスト"
End Sub② セルの値を取得
実務では検索条件の取得や入力チェック、ファイル名や顧客名などのデータ取得によく利用されます。
Sub 取得()
Dim val As String
val = Range("A1").Value
MsgBox val
End Sub③ 繰り返し
実務では売上データの集計や請求書の一括作成、メール送信、データチェックなど、大量のデータをまとめて処理する際によく利用されます。
Sub ループ()
Dim i As Long
For i = 1 To 5
Cells(i, 1).Value = i
Next i
End Sub処理の結果としてはA1~A5に1~5の値が入る
④ 条件分岐
実務では入力チェックや承認状態の確認、売上判定、ファイルの存在確認など、状況に応じて処理を切り替える際によく利用される。
Sub 条件()
If Range("A1").Value = "OK" Then
MsgBox "OK"
Else
MsgBox "NG"
End If
End Sub処理の結果はA1セルの内容がOKの場合は「OK」を、そうでなければ「NG」を返す
①~④のイメージイラスト
プロシージャについて
マクロを作るために、「プロシージャ」というコードの塊を書く必要があります。
VBAでは1つの標準モジュール内に複数のプロシージャ(マクロ)を作成することができ、 そのため処理ごとにマクロを分けて管理したり、用途別に整理したりすることが可能です。
ただし複数のプロシージャを作成する場合、同じ名前を付けてしまうとVBA側で区別することができません。
そのため、各プロシージャには一意の名前を付ける必要があります。
また、プロシージャ名にはいくつかの命名ルールが存在します。
- 英数字(全角半角)や漢字が使用可能
- アンダーバー(_)は使用可能
- 空白は使用不可
- 先頭は英数字か漢字で始める
- 文字の長さが半角で255文字以上は使用できない
- 同一の標準モジュール内で同じ名前は使用できない
よくあるエラー・トラブル集
ここでは実際に運用した際に発生しやすいエラーと、その対処方法をまとめたセクションについて解説いたします。
セキュリティ関連のエラー
VBAではコード以外にも、セキュリティ設定が原因でマクロを実行できないケースがあります。「作成~実行まで」でファイルがそもそも開かない、セキュリティの解除できなくてマクロが実行できないなど、導入時に発生するエラーについての説明をいたします。 そのような場合は以下の対応を実施してみてください
①マクロが有効にならない
以下のようなビューが表示される場合がある
②セキュリティソフトによるブロック
正常に動いていたマクロが突然動かなくなり、PCの再起動などを試しても動かなくなった場合に以下のような症状が出た場合の対処法になります
- 突然動かなくなる
- 外部アクセスの失敗
コード上のエラー
①実行時エラー13
『 エラー内容「型が一致しません」 』
VBAでは、変数や値にはそれぞれ「型(データ型)」があり、 これが一致しない場合にエラーが発生します。
これに関してはいくつかのパターンで原因と対応についてお伝えいたします。
- 数値 → Integer, Long, Double
- 文字列 → String
- 日付 → Date
- オブジェクト → Range, Workbook
- その他 →Variant(あらゆる型を格納可能)
※Variantはあらゆる型の値を格納できるため便利な反面、不正な値が代入されてもエラーにならない場合があり意図しない挙動やバグの原因になることがあります。
パターン
- 数値型の変数に対して数値として解釈できない文字列を代入すると、型不一致エラーが発生します。
Dim num As Integer
num = "abc" ' ← エラー(数値に変換できない)⇒1の対処
- セルの値に空白や文字列が入っている/想定と違う
Dim num As Integer
num = Range("A1").Value
【対処方法】⇒2の対処
- Objectと値を混同している
「r」をRange型オブジェクトとして扱うはずが、「=」では値の代入として解釈される
Dim r As Range
r = Range("A1")⇒3の対処
- Null / Empty の混入
Nullは「値が未定義の状態」であり0や空文字とは異なる特殊な状態になります。
そのためIntegerなどの値が必要な型では、必要な値が存在しないとエラーになる。
Dim num As Integer
num = Null ' ← エラー⇒4の対処
②実行時エラー91
エラー内容「オブジェクト変数またはWithブロック変数が設定されていません」
これはオブジェクトに対して Setで代入していない or Nothingのまま使用している場合によく発生します
Dim r As Range
r.Value = "テスト" ' ← エラーこれは r に何も入っていない状態で使用しようとしているためエラーが発生しています。
③実行時エラー9
エラー内容「インデックスが有効範囲にありません」
これは存在しないシート・ブック・配列を参照しようとしているため発生します。
Worksheets("Sheet2").Activate ' ← Sheet2が存在しないとエラーよくあるパターンだと、
- シート名のスペルミス
- 全角/半角違い
- 非表示シート
のような場合があります。
対処法
セキュリティ関連の対処法
①の対処法
このエラーではいくつか想定される原因があります。
そのため頻出する原因を一つずつ確認するので1つ目から順番に確認してみてください。
1つ目: 「ファイルの情報が信用できない」エラーの解消方法
ファイルを右クリック>「プロパティ」>全般タブ下部の「セキュリティ」の許可するにチェック
2つ目:
Excelを格納しているフォルダー 又は マクロで連結対象のフォルダーが信用されていない場合
①ファイル選択
②オプション選択
③トラストセンターを選択
④信頼できる場所を登録 or 既存の信頼できる場所に格納する
3つ目:
会社の共有フォルダに保存されている場合は、会社の共有設定によりマクロが実行できない場合があるためローカル環境に移して実行します。
この時に他のファイルや資材を確認するコードを組んでいる場合はそれらも含めてローカルに移し、コードでファイルの参照場所の修正も実施する
→できない場合はローカルに移動後、1つ目と2つ目の対応を確認・実施
4つ目:
マクロ設定が「すべて無効」になっている場合だと、警告も何も出ず原因がわかりにくいです。
その場合はトラストセンターでマクロの設定を変更してください。
1~3で実行できない場合は以下を確認
トラストセンター > マクロの設定
>「警告を表示してすべてのマクロを無効にする」
この場合は直接マクロを有効化するのは危険なため、基本は上から2つ目を選択
①「警告して、VBAマクロを無効にする」を選択・OK
→ 一度ファイルを閉じて再度開く
②開いたときに警告バーが表示されるため、「コンテンツの有効化」で実行可能
それぞれの特徴と用途
| 設定 | 特徴 | セキュリティ | 用途 |
|---|---|---|---|
| ①すべてのマクロを無効にする(通知なし) | マクロは完全にブロックされ、警告も表示されない | 非常に高い | ・セキュリティ最優先の環境(会社PC・一般ユーザー) |
| ②警告を表示してすべてのマクロを無効にする(推奨) | マクロは無効だが、警告バーから有効化できる | バランス | 個人PC・開発/検証環境(基本はこれを選択) |
| ③デジタル署名されたマクロのみ有効にする | 信頼された発行元のマクロのみ実行可能 | 高い | 企業環境・社内ツール配布 |
| ④すべてのマクロを有効にする(非推奨) | すべてのマクロを無条件で実行可能 ※ウィルスも通してしまう |
✗ 低い (危険) |
ローカルの検証環境のみ(通常利用はNG) |
②の対処法
お使いのセキュリティソフトで、ウィルス対策に引っかかってしまい、動かなくなってしまうことがあります。 このような場合はお使いのセキュリティソフトの設定を見直し以下の対処を実行してみてください
- ブロックされているリンクやファイルを「例外設定」に登録
- ソフトの一時停止(検証時のみ)
コード上のエラーの対処
1の対処
Val() で数値化する 文字列の先頭から数値として認識できている部分(数字、ピリオド、符号)を抽出して、文字列を明示的に数値へ変換できます。 Valは文字列の先頭から数値として解釈できる部分だけを取得し、途中に数値以外の文字が現れた時点でそれ以降は無視されます。
Sub ValSample()
MsgBox Val("123.45") '結果: 123.45
MsgBox Val("100px") '結果: 100
MsgBox Val("No. 5") '結果: 0 (数値以外から始まっている)
MsgBox Val(" 1,000") '結果: 1(全角は認識されない)
MsgBox Val("&HFF") '結果: 255 (16進数に対応)
End Sub2の対処
If IsNumeric(Range("A1").Value) Then
num = Range("A1").Value
End Ifnumを事前に定義(Dim)していない場合はVBAで自動的にVariant型(なんでも入る型)として扱うため、代入ではエラーになりません。IsNumericではセルの中身が「数値」でなく「数字の文字列(”123”)」でもTrueと判定しそのまま代入可能
3の対処
- オブジェクトは「Set」で参照を代入しないといけません
Dim r As Range
Set r = Range("A1")※補足 「=」 ⇒ 値のコピー 「Set」 ⇒ オブジェクトの参照を渡す オブジェクト変数の前にSetを付け忘れると「 実行時エラー91」が発生します
4の対処
If IsNull(val) Or IsEmpty(val) Then
val = 0
End If- Nullではなく、値として0を入れる
※補足 実務ではオーバーフローを防ぐため、IntegerではなくLongを使用することが一般的です
②の対処法
- Setでオブジェクトを代入する
Dim r As Range
Set r = Range("A1")
r.Value = "テスト"Nothingチェック
If Not r Is Nothing Then
r.Value = "テスト"
End IfVBAはオブジェクトと値が別物で、「=」は値の代入、 「Set」はオブジェクトの参照を行っています。
③の対処法
- シートの存在チェック
例)
' ワークシートが存在している場合のみ有効
Function SheetExists(name As String) As Boolean
Dim ws As Worksheet
For Each ws In Worksheets
If ws.Name = name Then
SheetExists = True
Exit Function
End If
Next ws
End Function- シート名のスペルを確認
その他によくあるエラー
- 文字化け
VBAでCSVファイルを扱う場合、文字コードの違いによって文字化けが発生することがあります。
特にUTF-8のCSVファイルを取り込むと文字化けしてしまうことがあります。
あいうえお → 縺ゅ>縺?∴縺?これはExcelではShift-JISが標準であり、UTF-8を正しく認識できないことが原因になります。
その他によくあるエラーの対処
文字化けの対処法
- ADODB.Streamを使う
これは文字コードを指定することができるため、これでいったんCSVファイルを読み込むことで文字コードがUTF-8でも取り扱いができるようになります。 ※ExcelのバージョンによってはUTF-8対応されていますが、環境差があるため明示的に読み込む方法が安全です
対応は以下をそのまま利用可能です
Dim stm As Object
Set stm = CreateObject("ADODB.Stream")
With stm
.Charset = "UTF-8"
.Open
.LoadFromFile "C:\test.txt(対象ファイルのパス)"
text = .ReadText
.Close
End With- そもそもCSVは開かない
CSVをダブルクリックで開くと文字コードを指定できず、文字化けする可能性があります。 そのため、Excelの「データインポート」機能やVBAで読み込む方法が推奨されます。
※重要: インターネットからダウンロードしたファイルは 「ブロックの解除」をしないとマクロが実行できない場合があります