エクセルにはVBAという開発環境が付属しており、VBAを活用するとエクセル上の作業を自動化したりすることができます。
大手企業では業務ごとに専用ソフトを導入していたり、開発の専門部署があったりしますので、一般の従業員がVBAを使う機会は少ないかもしれませんが、中小企業ではVBAを使うと業務を効率化することができます。
私もそれほど詳しくありませんが、実際に今までいくつかVBAを業務に役立ててきましたので、ここではその経験を分かりやすくお伝えしていきたいと思います。
VBAを始めるにあたって何が大変なのかというと、面白くもない基礎知識を覚えなければいけないということがあります。VBAはプログラミング言語の一種なので、プログラミング未経験の人からすると、最初に覚えなければいけない内容もかなりの量になってしまいます。
やりたいことは明確なのに、すぐにそこに行けないのはもどかしいものです。ですので、ここではなるべく早く使えるようになることを目標にして、細かい部分は省き、必要なことは作りながら覚えればいいという考えで進めたいと思います。
また、VBAなどプログラミングではやりたいことに対して複数の方法が存在するのですが、これもあえて一つの方法を採用してしまおうかと思います。
VBAの実行方法
開発タブ>挿入>ActiveXコントロール>コマンドボタン
追加されたコマンドボタンをダブルクリックします。
VBA用のエディタが表示されたと思います。
表示された
Private Sub CommandButton1_Click()
と
End Sub
の間に処理を記入していくことになります。
もし開発タブが表示されていない場合は、
ファイル>オプション>リボンのユーザー設定
開発にチェックを付けます。
ではどうやってVBAを実行するのか?ですが、開発タブの中にデザインモードというボタンがあり、これが押されている状態では今のようにVBAのエディタが開きます。
デザインモードのボタンをもう一度押すと、デザインモードが押されていない状態になり、その状態でコマンドボタンを押すとVBAが実行されます。
開発中にわざわざボタンを押さずに、素早く実行したい場合は、
Private Sub CommandButton1_Click()
と
End Sub
の間にカーソルがある状態で、VBA用エディタの再生ボタンを押すことで実行できます。
セルに値を入れる
Sheets(“Sheet1”).Cells(1, 1).Value = “1”
セルに値を入れるときはこのように書きます。どのシートなのか、どのセルなのかを指定し、そのセルの中身をValueで指定します。
ちなみ、セルを指定しているのだからわざわざValueは必要ないのでは?と思うかもしれません。(実際なくても動くのですが)なぜValueが必要なのかというと、セルの塗りつぶしなどセルの中身とは関係ない部分を指定することもあるので、中身はValueで操作できるよと覚えておいてください。
細かくみていくと、
Sheets(“シート名”)
でシート名を指定し、
Cells(行, 列)
で何行目の何列目にあるセルなのかを指定し、
Value
で指定したセルの値を操作できるという意味です。
ここでのイコールは代入(入れる)という意味です。つまりSheet1の1行目で1列目のセルに”1″を入れるという意味です。
数値と文字
VBAでは数値だったらそのまま直接(1など)書くことができます。文字だったらダブルクォーテーションで囲う(“1″など)必要があります。でも今回1をダブルクォーテーションで囲ってなかった?と思うかもしれません。
少し難しい話ですが、1と”1″は一般的なプログラミングでは数値の1と文字の1として区別されます。いくつか違いはありますが、数値の1は四則演算できて、文字の1は四則演算できないというような違いがあります。つまり上記では数値ではなく文字の1を代入したということです。
VBAの特徴として、文字の数値(“1″など)でも、どうやら数値として使ってるっぽいなとVBAが判断すると自動で数値として扱ってくれます。
このあたりを正確に理解しようとすると型というものが出てきてしまうので、今は数値と文字の違いはあるけど、VBAはいい具合に判断してくれる程度に理解しておけば大丈夫です。
値のコピー
セルの書式や文字色などもコピーできるのですが、最初は値だけコピーする方法を覚えておけば大丈夫です。Valueを使ってイコールで代入するだけです。
|
Sheets("Sheet1").Cells(1, 1).Value = Sheets("Sheet1").Cells(2, 2).Value |
値の表示(MsgBox)
次はセルの値を表示してみます。
MsgBox Sheets(“Sheet1”).Cells(1, 1).Value
代入ではないのでイコールはありません。代わりにMsgBoxと書かれています。これで指定した値をダイアログで表示することができます。Sheet1の1行目1列目のセルの値が表示されます。
ちなみに
MsgBox “A”
などのように表示する値を直接指定することも可能です。
MsgBoxはデバッグとしても利用されます。例えばプログラムを作っている最中に変数の中身を確認したい場合など頻繁にMsgBoxは利用されます。
|
v = "1" MsgBox v v = "2" MsgBox v |
ループ(For文)
セルの値を1つずつ設定したり取得したりするだけでは手作業と大きな違いはありません。VBAのメリットは多くの処理を自動化できることですが、ループは自動化の基本の一つです。
|
For i = 1 To 10 Sheets("Sheet1").Cells(i, 1).Value = i Next |
これを実行するとA列の1~10行目に1~10の値が入ります。
For 変数 = 開始値 to 終了値
処理
Next
というのが基本です。
現時点では変数というのは入れ物と理解しておけば大丈夫です。名前も自由につけることができ、ここではiとしていますが、counterなどとしても大丈夫です。
変数iには1から10まで順番に代入され、そのたびに処理が実行されるということです。具体的にいうと
変数iが1のとき、
Sheets(“Sheet1”).Cells(1, 1).Value = 1
として処理されます。
変数iが2のとき、
Sheets(“Sheet1”).Cells(2, 1).Value = 2
として処理されます。
このように、iが10になるまで繰り返されていきます。
また、変数は1からの必要はありませんし、処理の中で使わなくても問題ありません。
|
For i = 2 To 3 MsgBox "A" Next |
これだとAが2回表示されるだけです。処理でiは使っていません。ループを2回するだけです。
条件
次に説明するDo-WhileとIfで条件というのがでてきます。条件とは2つの変数あるいは直接の値を指定し、その2つの間に下記の式を書いてそれが満たされた場合、True(処理の実行)となり、満たされない場合、False(処理が実行されない)となります。
条件は
A = B (AとBが同じ)
A <> B (AとBが違う)
A >= B (AがB以上)
A <= B (AがB以下)
A > B (AがBより大きい)
A < B (AがBより小さい)
のような種類があります。
実際AとBには変数か値が入ります。
変数 条件 変数
変数 条件 値
値 条件 変数
値 条件 値
いずれの組み合わせてでも大丈夫です。
条件はOrとAndを使うことで複数同時に使うこともできます。意味はそのまま、Orであればどちらかの条件を満たす、Andであれば両方の条件を満たすという意味になります。
例えば
c = 5 Or r = 5
であれば、cという変数の中に5が入っている状態か、rという変数の中に5が入っている状態のどちらか一方でTrueとなります。
c = 5 And r = 5
であれば、cという変数の中に5が入っている状態であり、rという変数の中にも5が入っている状態ではじめてTrueとなります。
ループ(Do-While文)
Do While 条件
処理
Loop
が基本です。
条件が満たされている間処理をします。
|
i = 1 Do While i <= 3 MsgBox i i = i + 1 Loop |
これで1から3まで表示されます。
同じループでForと何が違うの?と思うかもしれません。実際、同じことをしようと思えばどちらを使ってもできます。
使い分けとして、データ量が固定の範囲をループさせる場合はForを使い、データがどんどん追加されていくようなタイプの範囲をループさせる場合はDo-Whileを使うという感じです。
条件分岐(If文)
ある条件が満たされる場合のみ処理を実行することができます。
If 条件 Then
処理
End If
が基本となります。
|
Sub test() If 5 >= 5 Then MsgBox "Hello" '表示される End If If 5 > 5 Then MsgBox "World" ' 表示されない End If If "5" >= 5 Then MsgBox "!!!" ' 表示される End If End Sub |
このように書くことができます。
既に少し説明しましたが、VBAでは文字と数値をうまい具合に扱ってくれます。一般的なプログラミングでは数値と文字は比較できないので、例えば”5″と5は比較できません。この辺りの特徴は少し意識しておいたほうがいいかもしれません。
If文ではだいたい同時ElseIfやElseも説明されていることが多いですが、とりあえず今の段階では使わなくても大丈夫です。
実用例
ここまでの説明で少し実用的なものを作ってみます。Sheet1のデータに条件を1つ通してSheet2にコピーしてみます。
Sheet1には2列データが入っていて、1列目には名称、2列目には数量を入れてあります。1列目が空白になるまでループし、2列目が0の場合はコピーしないという処理をおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
targetRow = 1 '書き込み対象行 r = 2 Do While Sheets("Sheet1").Cells(r, 1).Value <> "" n = Sheets("Sheet1").Cells(r, 1).Value q = Sheets("Sheet1").Cells(r, 2).Value If q <> "0" Then Sheets("Sheet2").Cells(targetRow, 1).Value = n Sheets("Sheet2").Cells(targetRow, 2).Value = q rr = rr + 1 End If r = r + 1 Loop |
非常に簡単な例ですが、手作業では困難な程度の量になってくると自動化が役に立つと思います。