▼ExcelVBA(マクロ)にできること
ExcelVBA(マクロ)と聞いて「難しいことをするのではないか」と足踏みする人も多いのではないでしょうか。
確かにExcelVBA(マクロ)は到底手作業では、できないような複雑な処理ができます。
しかし、ExcelVBA(マクロ)の真価が発揮されるのは、そういった複雑な処理ではないと考えています。
私は「手作業でできることをミスなく素早く処理すること」にExcelVBA(マクロ)の価値があると思っています。
これからExcelVBA(マクロ)を学ぶ先生方には、「難しいことをする」のではなく「手作業でできていたことをエクセルにやってもらう」という感覚で取り組んでもらいたいと思っています。
ですので、このサイトでは複雑な処理はできるだけ避けつつ、スモールステップで学習を進めていきたいと思います。
はじめのうちは「こんなの手作業や関数で十分だよ」と感じるかと思います。
その通りです。
ExcelVBA(マクロ)にできるのは「手作業でできることをミスなく素早く処理すること」なのです。
(ステップ1)数式を代入してコピーする
エクセルにおいて、数式を代入してコピーする作業は不可欠です。
誰にでも一度は経験があると思います。
(ステップ1)では、そんな誰もが作業したことある処理をExcelVBA(マクロ)やってもらいましょう。
具体的事例として「"1"から"100"までの通し番号を数式で入力すること」を扱います。
※ROW関数を使って通し番号をつける方法は別ページで解説しています。
1-方針
ExcelVBA(マクロ)を使える形式でファイルを保存します。
1-作業
- 新規エクセルファイルを開く
- [F12]キーで「名前を付けて保存」
- 適当なファイル名をつける
- 「ファイルの種類」を『Excel マクロ有効ブック(*.xlsm)』として保存する
1-解説
ExcelVBA(マクロ)を使うためにはファイルの種類を『Excel マクロ有効ブック(*.xlsm)』にしておく必要があります。
せっかくコードを書いても普段使っている「Excelブック(*.xlsx)」のままで保存するとコードが消えてしまいます。
忘れないように、はじめに作業しておきましょう。
2-方針
ExcelVBA(マクロ)のコードを編集する画面を開きます。
2-作業
【Alt,F11】同時押しでVBE(ExcelVBA(マクロ)の編集画面)を起動する
2-結果
別のウインドウが表示される
2-解説
この画面をVBE(Visual Basic Editer)といいます。
普段見慣れているエクセルシートの裏側のようなイメージです。
さらに、元のエクセルシートのウインドウを選択して【Windows,←】同時押し、VBEのウインドウを選択して【Windows,→】同時押しすると、左右に並べて表示することができます。
はじめのうちはこの配置にすることをおすすめします。デュアルモニター環境を構築されて2画面ある方はこの限りではありません。
3-方針
「標準モジュール」を挿入します。
3-作業
上部メニュー[挿入,標準モジュール]順にクリックする
3-結果
「Module1」が表示される
3-解説
標準モジュールとは、ExcelVBA(マクロ)を入力していく1つのシートのようなものです。
「Module1」のほかに「Sheet1」や「ThisWorkbook」にもコードを入力していくことも可能ですが、厳密には使い分けます。
少しずつステップが上がっていき、必要に応じて解説をしていきたいと思います。
4-方針
実際にコードを打っていきます。
4-作業(VBEにて)
- コード"sub 通し番号をつける"を入力
- [Enter]を押す
sub 通し番号をつける
4-結果
1行目と3行目が自動補完される
Sub 通し番号をつける
End Sub
4-解説
1行目は「Sub (マクロの名前)」です。マクロの名前は任意ですが、マクロが増えていったときのために、判別がつきやすい方がいいです。
3行目は「End Sub」の文字通り、このマクロの終わりを表します。
1行目の「Sub (マクロの名前)」と対になっているので自動補完されます。
また、入力時は小文字でも、正しいコードを入力すれば、大文字に自動補完されます。逆に、大文字のままの場合はコードが正しくないので見直しましょう。
5-方針
「"1"から"100"までの通し番号を入力する」コードを打つ
5-作業(VBEにて)
- 2行目に以下コードを打つ
- [↓]を押して選択行をずらす
Sub 通し番号をつける()
cells(2,1)=1
End Sub
5-結果
cells(2,1)がCells(2,1)のように先頭大文字になる
5-解説
左辺:
Cells(*)は「セルズ」と読みます。Excelのセル全体を示します。
Cellsの後に()をつけることで、セル全体Cellsから特定のセルCells(*)を指定できます。
「Cells(2,1)」は「たて2,よこ1にあるセル1つ」を示します。
「たて2,よこ1にあるセル1つ」はシートでいうと「A2セル」です
右辺:
「*** = 1」は「***に1を代入する」ことを示します。
まとめると、
「Cells(2,1)=1」
→「たて2,よこ1にあるセル1つに1を代入する」
→「A2セルに1を代入する」
ことを示しています。
6-方針
ExcelVBA(マクロ)を実行してみます。
6-作業
- コード内の任意行をワンクリックする
- [F8]キーを数回に分けて押す
6-結果
VBEで1~3行目が順に黄塗りになって処理が実行される
6-解説
[F8]を押すと、ステップイン(1行ずつ処理を実行すること)ができます。
シートとVBEを見比べてみてください。
VBEで黄塗りが2行目から3行目に移る瞬間に、シートのA2セルに"1"が入力されています。
コードを打ち、実行させることができました。これで今日からあなたも立派なVBAerです!
ただ「A2セルに"1"を入力する」ような簡単な作業は、手入力した方が早いです。
より処理のレベルをあげていきましょう。
7-方針
"1"を100個のセルに入力していきます。
7-作業(VBEにて)
- Cells(2,1)の直後に「.resize(100,1)」を入力する
- [↓]を押して選択行をずらす
Sub 通し番号をつける()
Cells(2,1).resize(100,1) = 1
End Sub
7-結果
.resize(100,1)が.Resize(100,1)のように先頭大文字になる
7-解説
「Resize」は「サイズ変更する」という意味から「セル範囲を変更すること」ができます
「***.Resize(100,1)」は「***からたて100,よこ1にセル範囲を変更する」処理を示します。
よって、
「Cells(2,1).Resize(100,1) = 1」
→「たて2,よこ1のセルをたて100,よこ1にセル範囲を変更して、1を入力する」
ことを示します。
8-方針
ExcelVBA(マクロ)を実行してみます。
8-作業(VBEにて)
- コード内の任意行をワンクリックする
- [F8]キーを数回に分けて押す
8-結果
A2:A101セル範囲すべてに"1"が入力されている。
8-解説
少し実践的になったでしょうか。101行目までスクロールせずに入力することができました。
9-方針
"1"から"100"までの通し番号をつけましょう。
9-作業(VBEにて)
- 右辺「1」を「"=ROW(A2)-1"」に書き換える
- [↓]を押して選択行をずらす
Sub 通し番号をつける()
Cells(2,1).Resize(100,1) = "=ROW(A2)-1"
End Sub
9-解説
右辺の"=ROW(A2)-1"は通し番号をROW関数で入力するものです。
VBAでは、数式を一括入力することができます。
ただし、数式を入力するときには " (ダブルコーテーション)で前後囲む必要があるので、気をつけてください。
「Cells(2,1).Resize(100,1) = "=ROW(A2)-1" 」
→「たて2,よこ1のセルをたて100,よこ1のセル範囲に変更して、 "=ROW(A2)-1" を代入する」
ことを示します。
10-方針
ExcelVBA(マクロ)を実行してみます。
10-作業
- コード内の任意行をワンクリックする
- [F8]キーを数回に分けて押す
10-結果
A2:A101セルすべてに「=ROW(A***)-1」が入力されている ***は行番号
10-解説
ExcelVBA(マクロ)を活用して「"1"から"100"までの通し番号をつける」ことができました。
はじめにも説明したように、ExcelVBA(マクロ)は難しい処理をしているのではなく「手作業でできることをミスなく素早く処理すること」という感覚が大切です。
実際、手作業でやる場合には下行へコピーしていくときに100を超えてしまったり足りなかったりするミスが生じる可能性があります。
一方、ExcelVBA(マクロ)の場合、100と打っているからには絶対に100セル分数値が入力されます。
これが、ExcelVBA(マクロ)を活用する意義だと考えます。
解説は以上です。
(まとめ)
「数式のコピー」のコード:
Cells(たて,よこ).Resize(たて範囲,よこ範囲) = "=数式"
▼留意点
なお、今回解説したExcelVBA(マクロ)の設定は、現段階での必要最低限のものになります。
その他の設定などは必要なタイミングで追々解説します。
▼次回
今回は、ExcelVBA(マクロ)を活用して、"1"から"100"までの通し番号をつけることを解説しました。
ROW関数を使用しましたが、一般にROW関数は数式として残しておくことは望ましくありません。
並べ替えをしたときに、自動計算されて値が書き換えられてしまい、元の並び順に戻すことができなくなってしまうためです。
そこで、次回は「ExcelVBA(マクロ)を活用して、数式を数値に変換すること」を解説します。
ステップ2-数式を数値に変換する-->