3 EXCEL VBA講座

1 とってもルーズなVBA

 プログラムを学び始めていきなり苦しむのが変数の設定段階でエラーが続出することです。
一般的には、変数の型の設定を強制したほうがいいのでしょうが、かなり覚えることが多く面倒です。
VBにはバリアント型という非常に便利な型がありますのでこの型を活用することにします。

バリアント型って何?と思いますが。→型を意識しないで使える便利な型と思って下さい。
特段、処理スピードを求めたり、極めて複雑なプログラムを組むわけではないので、スルーできるところはスルーしていきます。

また、ここでは型設定を強制しない設定で進めていきますので、直感的な記述になります。

プログラムの基本は、

Sub A()



End Sub


です。「A」はプログラム名です。

Sub プログラム()





End Sub

何と日本語名も使えます。

2 超便利なマクロ記録機能


実に素晴らしい機能です。この機能があるおかげでEXCELマクロをいちいち覚える必要がないんです。
極めて基本的な幾つかは覚えた方がいいですが、数多くやっているうちに活用どの高いものは勝手に覚えてしまうでしょう。
私もはっきり言ってマクロは覚える気もありません

では、A1はB1といったセルはどのように翻訳されるか見てみましょう。



マクロ名は勝手についていますが、気にせずに「OK」します。
その後、セルA6に100と入力し、マクロの記録を終了させてください。

モジュールを開くと以下のような記述が見つかります。

Sub Macro1()
'
' Macro1 Macro
'

'
Range("A6").Select
ActiveCell.FormulaR1C1 = "100"
Range("A7").Select
End Sub



これが、記録されたマクロです。
では、A6セルの100を消去してマクロを実行してみましょう。

3 マクロの実行
 マクロを簡易的に実行するには、sub~end subの中のどこかにカーソルを置いた状態で以下のプレーボタンを押します。




下のようなダイアログが出た場合には、Module1を選んで実行してください。


すると、A6セルに100が入力されました。
素晴らしい威力です。このマクロ記録機能は今後もずっと使いますので覚えておきましょう。


4 マクロを読み解いてみましょう。

① Range("A6").Select 
② ActiveCell.FormulaR1C1 = "100"
③ Range("A7").Select

① 範囲(セル)A6を選択します。
② アクティブになったセルに数式を入力する際のコマンドで、ここに100という数式を入力します。
③ セルA7を選択します。

ここの③はなぜあるのかというと、A6に100を入力した後、リターンキーを押したのでA7にカーソルが動いたからです。

少しいじってみましょう。まず、不要な③を削除します。次に”100”の100を10*10に変えてみましょう。

① Range("A6").Select 
② ActiveCell.FormulaR1C1 = "10*10"

あれ?100になりません。これは、実は”「ダブルコーテーション」で括るとその中は文字のかたまりであると判断されます。

②  ActiveCell.FormulaR1C1 = 10 * 10

ダブルコーテーションを取ってみましょう。うまくいきました。

次は、セルB1の値をコピーする方法を考えてみましょう。


① Range("A6").Select
② ActiveCell.Value = Range("B1")

こんな風にしてみます。
※①②の番号は入力してはいけません。

セルB1に200を入れて実行してみてください。無事実行されました。

ここで、①のセルの選択はあくまでの人間が行ったものなので、直接VBAでA6に数字を入れるにはRangeだけでできないか?
と考えます。

① Range("A6")=100

のみを実行してみましょう。できました。これ1行でいいのです。
Range("A6").Value 正確にはこうなります。でもルーズでもやれますよ。(Valueをつけるようにしましょう)

① Range("A1:A100") = 100
このようにしてみましょう。すると、A1~A100までが100で埋められました。

① Range("B1:B100").Value = Range("A1:A100").Value
その後さらにこれを実行してみます。
うまくいきました。「Value」を付けないとうまくいかないので、Valueをつけるように習慣づけましょう。


A1からZ1に異なる数字を入力して以下を実行してみてください。
① Range("A2:Z2").Value = Range("A1:Z1").Value
これもうまくいきます。


Range("A2:Z2").Value = Range("A1:Z1").Value
Range("A3:Z3").Value = Range("A1:Z1").Value
Range("A4:Z4").Value = Range("A1:Z1").Value
Range("A5:Z5").Value = Range("A1:Z1").Value

これもうまくいきますね。ここで次のようにしてみましょう。

Sub Macro1()
Dim A()

A = Range("A1:Z1").Value

Range("A2:Z2").Value = A
Range("A3:Z3").Value = A
Range("A4:Z4").Value = A
Range("A5:Z5").Value = A

End Sub
※文字の色は無関係

A()は大きさを指定しない配列ですが、ここでは意味は無視して同じようにできることに注目しましょう。

では、A1~Z1を第2列から第1000列までコピーするにはどうしたらよいのでしょうか。
ここで、初めてVBAがいきてくるのです。


4 VBAプログラミング

Macao1の名前をコピーと書き換えましょう。



こんな風になります。

これを以下のように書き換えてください。

Sub コピー()
Dim A()

A = Range("A1:Z1").Value

For I = 2 To 1000
    Range("A" & I & ":Z" & I).Value = A
Next

End Sub

実行すると、VBAのすごさがわかります、

英語をみるとなんとなく意味が分かりませんか?
for~to・・・  は~から・・・までの意味ですよね。
つまり、Iの値を2から100まで1ずつ増やしますの意味です。
Next は次への意味で、次とは変数Iに次の値を入れるためにForまで戻りますの意味です。

ここでの最難関は、"A" & I & ":Z" & I ですね。
大変に便利なので用法を覚えましょう。

今 I=2 の時を考えましょう。すると、、"A" & 2 & ":Z" & 2 となります。&記号は文字と変数(数字)をつなぐ記号です。
PC内では、A2:Z2 と解釈されます。これで分かりましたよね?

VBAは高速で大量のデータを扱うことができるのです。

VBAとは、基本的なビジュアルベーシック(VB)の構文とEXCELのマクロを絶妙に組み合わせたものと言えます。

VB構文・・・覚える必要があります。
EXCELマクロ・・・覚える必然はありません。(使って理解していきます)

ですので、VBAではVBを理解しておく必要があるのです。