プログラミング言語を整える
初級VBA を整える。
= Excel の手作業を自動化する VBA を、同じお題で読んで学ぶ
VBA が初めての方は、先に そもそも VBA とは・どんな場面で使うか をどうぞ。
VBAとは
Excel などの Office アプリの中で動き、表計算や帳票づくりの手作業を自動化するための言語です。
| 誕生 | 1993年(Excel 5.0 に搭載) |
|---|---|
| 作った人・組織 | Microsoft |
| 型の付け方 | 型を宣言しなくても動きます(Variant 型になる)。Option Explicit を書くと変数の宣言を強制できます |
| 動かし方 | Excel・Access などの Office アプリの中で動きます(VBE で書いてその場で実行する) |
| ファイルの拡張子 | .bas(標準モジュールを書き出したファイル)。マクロ付きのブックは .xlsm |
| 手元で動かすには | Alt+F11 で VBE を開き、標準モジュールに貼り付けて F5 で実行(結果は Ctrl+G のイミディエイトウィンドウ) |
日本での使われ方
- 事務・経理の部門で、Excel の集計・転記・並べ替えといった繰り返し作業の自動化に使われています。
- 請求書や報告書などの帳票を、Excel のシートから作る用途で使われています。
- Access と組み合わせて、部署内の小さな業務システム(台帳・在庫・顧客の管理など)を作る例があります。
- Office が入っている PC ならそのまま書き始められるため、開発環境を別に用意しにくい職場でも使われています。
新人研修での位置づけ
事務職・営業事務の人向けの研修で、Excel の作業を自動化する手段として学ばれています。IT 部門のない会社では、現場の担当者が業務改善のために覚えることもあります。
関わる資格・試験
- VBAエキスパート Excel VBA ベーシック
- VBAエキスパート Excel VBA スタンダード
- VBAエキスパート Access VBA ベーシック
- VBAエキスパート Access VBA スタンダード
そもそも VBA とは
Excel などの中で動き、毎日の手作業を自動化できる言語。
VBA(Visual Basic for Applications)は、Excel・Access・Word など Microsoft Office の中で動く言語で、1993年の Excel 5.0 に搭載されました。Office が入っているパソコンなら、別のソフトを用意しなくても、Excel の中の VBE(エディター)にコードを書いてすぐ実行できます。
Excel の「マクロの記録」で操作を記録すると、その中身が VBA のコードとして残ります。記録したものを書き換えれば、繰り返しの作業を自分好みに自動化できます。Visual Basic 系の読みやすい書き方をする言語です。
どこで・どんな場面で使うか
-
Excel の集計・転記の自動化
毎日・毎月くり返す、コピー・並べ替え・合計といった作業を、ボタン1つで行えるようにします。
-
請求書や報告書の作成
シートのデータから、決まった形式の帳票を作る用途で使われています。
-
Access の小さな業務システム
部署内の台帳・在庫・顧客の管理などを、Access と組み合わせて作る例があります。
-
既存の Excel ファイルの保守
職場に残っているマクロ付きのブックを、直したり引き継いだりする場面があります。
-
求人での位置づけ
事務・経理・営業事務の募集で、Excel VBA が使えることを歓迎条件にしているものがあります。
向いている場面・向いていない場面
- 向いている:Excel の繰り返し作業を減らしたいとき。手作業の時間を減らし、入力ミスも防げます。
- 向いている:開発環境を別に用意しにくい職場。Office が入っていれば、すぐに書き始められます。
- 向いていない:大勢が同時に使う本格的なシステム。Office の中で動く前提なので、そうした用途は別の言語で作るほうが安心です。
下のコード例を、手元の Excel の VBE(Alt+F11)に貼って動かしてみてください。
5つのお題をVBAで書く
C・C++・Java・C#・COBOL・VBA の6ページで、同じ5つのお題を同じ順に並べています。言語を切り替えると、書き方の違いがそのまま比べられます。
このページではコードを実行できません。VBA は Excel などの Office の中でしか動かないため、表示している出力は Excel で実行したものではなく、コードを1行ずつ手で追って確かめたものです。
コード(.bas)
Sub Main()
Debug.Print "Hello, World!"
End Sub
実行すると
Hello, World!
VBA のプログラムは Sub ~ End Sub の「プロシージャ」単位で書きます。Debug.Print の結果は画面ではなく、VBE のイミディエイトウィンドウ(Ctrl+G)に出ます。
コード(.bas)
Sub Main()
Dim i As Long
For i = 1 To 15
If i Mod 15 = 0 Then
Debug.Print "FizzBuzz"
ElseIf i Mod 3 = 0 Then
Debug.Print "Fizz"
ElseIf i Mod 5 = 0 Then
Debug.Print "Buzz"
Else
Debug.Print CStr(i)
End If
Next i
End Sub
実行すると
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
余りは % ではなく Mod 演算子で求めます。Debug.Print i のように正の数をそのまま出すと先頭に空白が1つ付くため、CStr で文字列にしてから出しています。
コード(.bas)
Sub Main()
Dim a As Variant
Dim i As Long
Dim total As Long
a = Array(3, 1, 4, 1, 5, 9, 2, 6)
For i = LBound(a) To UBound(a)
total = total + a(i)
Next i
Debug.Print "合計: " & CStr(total)
Debug.Print "平均: " & Format(total / (UBound(a) - LBound(a) + 1), "0.00")
End Sub
実行すると
合計: 31 平均: 3.88
Array 関数で作った配列は 0 から始まります。要素数は UBound - LBound + 1 で求めます。平均 3.875 は Format で小数2桁に丸めて 3.88 と表示しています(Format は 5 を切り上げます)。
コード(.bas)
Sub Main()
Dim path As String
Dim f As Integer
Dim buf As String
path = Environ("TEMP") & "\memo.txt"
f = FreeFile
Open path For Output As #f
Print #f, "1行目: こんにちは"
Print #f, "2行目: VBA"
Close #f
f = FreeFile
Open path For Input As #f
Do Until EOF(f)
Line Input #f, buf
Debug.Print buf
Loop
Close #f
End Sub
実行すると
1行目: こんにちは 2行目: VBA
Environ("TEMP") は Windows の一時フォルダの場所を返すので、書き込める場所に memo.txt を作れます。Open ... For Output で書き込み(同名ファイルは上書き)、For Input で読み込み、Line Input # で1行ずつ取り出します。FreeFile は空いているファイル番号を返す関数です。
コード(.bas)
Sub Main()
Dim a As Long, b As Long, c As Long
On Error GoTo ErrHandler
a = 10
b = 0
c = a / b
Debug.Print "ここは表示されません"
Exit Sub
ErrHandler:
Debug.Print "エラー番号: " & CStr(Err.Number)
Debug.Print "処理を終了します"
End Sub
実行すると
エラー番号: 11 処理を終了します
On Error GoTo で、エラーが起きたら指定したラベルへ飛ぶようにします。0 で割るとエラー番号 11 になります。Err.Description の文言は Office の言語や版で変わるため、ここでは番号だけを出しています。正常時に処理部分へ落ちないよう、ラベルの前に Exit Sub を置きます。
出力当てクイズ
コードを読んで、画面に出るものを選んでください。選ぶと正解と理由が出ます(答えはどこにも送られず、記録もしません)。
問1
Sub Main()
Debug.Print CStr(7 \ 2) & "," & CStr(7 / 2)
End Sub
画面に出るのは?
\(円記号・バックスラッシュ)は整数の割り算で、小数部分を切り捨てて 3 になります。/ は小数まで計算する割り算で 3.5 になります。
問2
Sub Main()
Debug.Print CStr(17 Mod 5)
End Sub
画面に出るのは?
Mod は割り算の余りを返します。17 ÷ 5 は 3 余り 2 なので 2 です。
問3
Sub Main()
Dim s As String
s = "10"
Debug.Print (s & 5) & "/" & CStr(s + 5)
End Sub
画面に出るのは?
& は必ず文字列としてつなぐので "10" & 5 は "105" です。+ は片方が数値だと足し算になり、"10" が数値の 10 に変換されて 15 になります。文字列をつなぐときは & を使うと取り違えが起きません。
問4
Sub Main()
Debug.Print CStr(Len("日本語"))
End Sub
画面に出るのは?
Len は文字数を数えるので、全角の文字も1文字は1と数えて 3 になります。バイト数を数える LenB だと 6 になります。
よくあるエラーと直し方
初めて書く人が出会いやすいエラーです。メッセージは英語のまま出ることが多いので、どの言葉を手がかりにすればよいかもあわせて載せています。
実行時 実行時エラー '9'(インデックスが有効範囲にありません)
エラーになるコード
Sub Main()
Dim a(2) As Long
a(3) = 10
End Sub
画面に出るメッセージ(抜粋)
実行時エラー '9': インデックスが有効範囲にありません。
何が起きているか:Dim a(2) は a(0)~a(2) の3つを作る宣言なので、a(3) は存在しません。存在しない名前のシートを Worksheets("…") で指定したときも同じエラーになります。
直し方:添字が LBound(a)~UBound(a) の範囲に入っているか確かめます。要素を増やすなら Dim a(3) のように宣言を広げます。
実行時 実行時エラー '13'(型が一致しません)
エラーになるコード
Sub Main()
Dim n As Long
n = "abc"
End Sub
画面に出るメッセージ(抜粋)
実行時エラー '13': 型が一致しません。
何が起きているか:数値型(Long)の変数に、数値として読めない文字列 "abc" を入れようとしています。セルの値を数値の変数に入れるとき、セルに文字が入っていると起きやすいエラーです。
直し方:IsNumeric で数値として読めるか確かめてから代入します。文字列を入れたいなら変数を As String で宣言します。
実行時 実行時エラー '1004'(Excel 側の操作の失敗)
エラーになるコード
Sub Main()
Range("A0").Value = 1
End Sub
画面に出るメッセージ(抜粋)
実行時エラー '1004':(続くメッセージは原因によって変わります)
何が起きているか:Excel のシートやセルに対する操作が失敗したときに出る番号です。この例は存在しないセル番地 A0 を指定しています(行は 1 から始まります)。メッセージの文言は原因ごとに異なります。
直し方:セル番地・シート名・範囲の指定が正しいか、保護されたシートに書き込んでいないかを確かめます。番号だけでは原因が絞れないので、止まった行を見て判断します。
コンパイル時 コンパイル エラー(変数が定義されていません)
エラーになるコード
Option Explicit
Sub Main()
total = 1
End Sub
画面に出るメッセージ(抜粋)
コンパイル エラー: 変数が定義されていません。
何が起きているか:Option Explicit があると、Dim で宣言していない変数を使った時点で実行前に止まります。変数名の打ち間違いを見つけるための仕組みです。
直し方:Dim total As Long のように宣言を追加します。打ち間違いなら正しい変数名に直します。
このツールについて
Excel などの Office アプリの中で動き、表計算や帳票づくりの手作業を自動化するための言語です。
Excel VBA の概要と、同じ5つのお題・出力当てクイズ・よくあるエラー(実行時エラー 9・13・1004 など)。
主な機能
- 概要(誕生・作った人・型・動かし方)と日本での使われ方・研修・資格
- 5つのお題のコード例(C・C++・Java・C#・COBOL の同じお題へ移れる)
- 出力当てクイズ4問(\ と / の割り算・& と + の違いなど)
- よくあるエラー4件(実行時エラーの番号・原因・直し方)
- 出力は手で追って確かめたもの(Excel での実行ではない)・送信ゼロ
よくある質問
Q. このページの出力は Excel で実行したものですか?
A. いいえ。VBA は Excel などの Office の中でしか動かず、このページを作った環境では実行できなかったため、コードを1行ずつ手で追って確かめた出力です。数字は CStr か & で文字にしてから出しているので、数値の前に空白が付く Debug.Print の癖は出ません。
Q. Debug.Print の出力はどこで見られますか?
A. VBE(Alt + F11 で開く画面)のイミディエイト ウィンドウです。表示されていなければ、VBE のメニューの「表示」から開くか、Ctrl + G で出せます。
Q. VBA の資格はありますか?
A. VBAエキスパートがあり、Excel VBA と Access VBA のそれぞれにベーシックとスタンダードがあります。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。