Excel VBAで社会人から始めるプログラミング

社会人になってからプログラミングを学ぶのであれば、Excel VBAが最もとっつきやすいでしょう。事務作業がある職場であればたいていExcelを使用しますし、プログラミングで作るものがイメージしやすいからです。

僕も社会人になってからExcel VBAでプログラミングスキルを身につけました。ただ、誰かから習ったわけではなく、勤めた先の先輩(元エンジニアだった)が作ったExcel VBAファイルを見てマネしただけです。

僕は大学の単位稼ぎで受けた講義でJavaScriptを使ってプログラミングの基本を学んだことがあり、それがあったから見ず知らずのVBAもすんなり理解することができました。

その基本というのは変数の扱い方と順次・分岐・循環構造の4つのポイントです。これらは30分あれば十分理解できますので、この記事ではその解説をしていきます。

VBAを使う準備

VBAの学習をするには、使用しているExcelに開発タブが表示されている必要があります。初期状態のExcelでは非表示になっています。

ファイルからオプション、リボンのユーザー設定から、開発タブにチェックを入れましょう。

チェックを入れて開発タブが表示されたら、丸で囲っているVisual Basicを開きましょう。

この画面をVBE(Visual Basic Editor)といいます。

メニューの挿入から標準モジュールを選択します。

これでコードを書ける準備ができました。

変数とは中身を変えられるデータの入れ物

プログラミングは「Hello World!」を表示するところから始まりますのでやってみましょう。

VBEに以下のように入力してください。コピペでもいいですよ。

Sub test()
    
    Cells(1, 1) = "Hello World!"
    
End Sub

入力ができたら、丸で囲った再生ボタンを押してください。これでプログラムが動きます。

Excelのウィンドウを見てください。するとR1C1のセルにHello World!の文字が表示されました。

Cells(1, 1)とは、1行目・1列目のセルという意味です。A1と同じ意味ではありますが、VBAを使う上ではR1C1表記で慣れた方がいろいろと都合がいいですよ。

ちなみに、R1C1表示にする場合は、ファイル→オプション→数式から「R1C1参照形式を使用する」にチェックを入れてください。

では次に、以下のように入れてみてください。

Sub test()
    
    a = "Hello World!"
    Cells(2, 1) = a
    
End Sub

Cells(2, 1)、つまり2行目1列目のセルですね。

そしてaというのが出てきました。a = “Hello World!”とし、Cells(2, 1) = aという記述になりました。

これを動かしてみると、

2行目1列目のセルにHello World!が表示されました。

このaが変数というものです。変数とはデータの入れ物で、一部を除いて任意の名前が付けられます。半角英数字であればaでもbでもabsでもOKです。

= は左辺に右辺を代入する

変数の意味はあまり理解できなくても、ここは必ず理解したいのが=(イコール)の意味。

a = “Hello World!” や Cells(2, 1) = a というコードで出てきた =(イコール)は、日常的には「左辺と右辺は等しい」という意味で使います。

しかし、プログラミングにおいては「左辺に右辺を代入する」という意味で使います。

つまり、a = “Hello World! は「a に”Hello World!” を代入する」、Cels(2, 1) = a は「2行目1列目のセルにa(Hello World!)を代入する」という意味になります。

3つの構造

あらゆるプログラミング言語は3つの構造で成り立っています。

順次、循環、分岐の3つです。この3つの構造でプログラミングは動いています。

順次構造

プログラミングは原則として上から下へ順番に読み、遡ることはありません。

「なんだ、そんなことか」と思いがちですが、この基本を理解しているか否かで大きく違います。

Sub test()
    
    a = "Hello World!"
    Cells(3, 1) = a
    MsgBox a
    
    a = "こんにちは!"
    Cells(3, 1) = a
    MsgBox a
    
End Sub

ここで新しいコードが出てきました。MsgBoxはメッセージダイアログを表示するコードです。

任意の内容をメッセージとして表示させることができ、今回は変数aを指定しているので「Hello World!」が表示されました。

このメッセージダイアログの便利な使い方として、これが表示されるとプログラミングを一旦停止させることができるので、その時点での状況や変数の中身を確認するのに使えます。

さて、この時点では変数aはHello World!が、3行目1列目のセルにもHello World!が入っていることが確認できました。

このまま進めると再度メッセージダイアログを表示されるのですが、変数aは「こんにちは!」に、3行目1列目のセルも「こんにちは!」に変わりました。

つまり、上よりも下に記述されているものが最後に残るというわけです。記述する順番によって結果が大きく変わってくるので、地味に注意しないといけません。

循環構造

大量の処理を行うには循環構造は欠かせません。プログラミングの醍醐味といっていいでしょう。

循環構造は、指定された条件を満たすまで処理を繰り返すもので、いわゆるループといわれるものです。

ここではForループを紹介します。

Sub test()
    
    a = "Hello World!"
    For i = 1 To 100  
        Cells(i, 2) = a
    Next
    
End Sub

Forループの書式は、 「For カウンタ = 初期値 To 終了する条件 ~繰り返す処理~ Next」です。

カウンタは変数iを使用します。特に決まりではありませんが、iを使うのが慣例です。iの初期値は1、iが100になったら終了です。i = 1も「iに1を代入する」という意味ですね。

Nextまで処理が終わったらiに1を加算して、同じ処理を繰り返します。

ループの肝はカウンタとなっているiが変数として処理の中で使えることです。処理は「i行目2列目のセルにaを代入する」というものですが、1周目であればiは1なので1行目2列目、2周目であれば2行目2列目、100周目であれば100行目2列目といったように、行や列の番地を変えながら処理を進めることができるのです。

というわけでこれが処理の結果です。途中で切ってますが、1行目から100行目まで変数a、つまりHello World!が入りました。

Forループは特に指定しなければカウンタに1を加算しながら処理を繰り返しますが、Step 2と記述すれば2ずつ加算し、Step -1と記述すれば1ずつ減算するなど、カウンタの操作も指定することができます。

Sub test()
    
    a = "こんにちは!"
    For i = 2 To 100 Step 2
        Cells(i, 3) = a
    Next
    
End Sub

このようにStep 2と指定すると2を加算しながら処理を繰り返します。行番号が偶数のセルに「こんにちは!」が入りました。

分岐構造

分岐構造は条件を提示し、その正否で処理を分岐させます。ExcelにあるIF関数を使ったことがある人ならすぐイメージできると思います。

Sub test()
    
    a = "Hello World!"
    b = "こんにちは!"
    
    For i = 1 To 100
        If i Mod 2 = 0 Then
            Cells(i, 4) = a
        Else
            Cells(i, 4) = b
        End If
    Next
    
End Sub

せっかくなのでForループと組み合わせました。行番号が偶数の時は変数a(Hello World!)、偶数でなければ(つまり奇数)の時は変数b(こんにちは!)を表示します。

「IF 条件式 Then 正の処理 Else 否の処理 End If」と記述します。偶数は2で割った余りが0になるので、 i Mod 2 = 0という条件式となります。Modは割り算の余りを返します。

そういうわけで結果がこちら。見事に行番号が偶数と奇数で処理がわかれてくれました。

IF文の=は「左辺と右辺は等しい」

ここで厄介なのが、If文の条件式の中で使う「=」は「左辺と右辺は等しい」の意味で使います。他の言語では「==」や「===」と重ねることがほとんどです。同じ「=」でも意味が2つあるのがややこしいですね。

正の時はCells(i, 4) = a を返し、否の時はElseの後ろのCells(i, 4) = b を返します。Else以降の否の処理は省略することが可能で、その場合は正の時のみ処理するということになります。

字下げでコードを見やすくする

For i = 1 To 100            'For文ここから
    If i Mod 2 = 0 Then         'If文ここから
        Cells(i, 4) = a
    Else
        Cells(i, 4) = b
    End If                      'If文ここまで
Next                        'For文ここまで

ここでついでに字下げ(インデント)について説明します。コードを見ていると書き出しがへっこんでるところが気になるかと思います。これは「このFor文はここからここまで」「このIf文はここからここまで」という目印をつけるために、中身を1段分字下げしています。

今回みたいに短いコードであればそこまで気になりませんが、コードをどんどん入れ子(ネスト)にしていくと「あれ、今ループの中にいたっけ」とか「まだ分岐が終わってないような」とわからなくなってきます。

そこで字下げをして見やすくする癖をつけておきましょう。字下げはTabキーで行います。

以上を理解すれば学習が捗るかも?

プログラミング素人だった僕が難なくプログラミングの世界に足を踏み出せたのは、以上のことを知っていたからです。

このブログではいくつか自作プログラムを公開しており、パッと見ややこしそうに見えますが、ほとんどが以上の知識でできることを組み合わせているだけです。

特に循環と分岐構造の使い方に慣れてきたら、「あ、この作業は自動化できるかも」と自分でプログラムをつくろうと考える脳になってくるはずです。

ひとまず僕のつくったプログラムを紹介しますね。かなり単純なプログラムですが、循環と分岐のいい練習になるかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です