VBAの記事でも書こうかと、、

以前からExcel VBAを仕事でちょいちょい使っていましたが、ここ2年ほど、VBAプログラマとして働いています。
VBAでプログラムを組んでいて、これはどうしたらいいのだろうというとき、本が役に立つことも有りますが、大体はネットで検索しないと解決しないことも多いです。
職場によってはインターネットにつながっていなかったりして厳しい時も有りますが、私も多くの記事に助けられました。
そんなわけで私もどなたかのお役に立てればと、これまでに得た知識を皆さんに共有できればと今後もVBAに関する記事を書いていこうかなと思います。

まずは、VBAとかマクロとか便利そうだけど、どう使うの?
というあたりの人がどうしたらいいかから話しましょうか。

そもそもVBAとマクロって違うの?
という疑問があると思います。
VBAとマクロは違うという人やどっちもマクロって言っちゃう人がいますが、私なりの考え方だと、マクロというのは、Excelの「マクロを記録」ボタンとかで作れるものという感じでしょうか。

Excelの操作を覚えてくれて、その後はボタン一つで同じ操作を繰り返してくれるので、それだけでもだいぶ省力化になりますね。

でも、それだけでは上手くいかない場合も有ります。

例えば、データが有る行だけ式を埋めていくとか。
データの最後に合計欄をつけるとか。
データ中の顧客名が変わったら罫線いれるとか。

データの件数が常に同じだったらマクロでもできますが、その時々によってデータの量が違うとマクロでは対応できなくなってきます。
そこでVBAの出番です。

VBAでは条件によって処理を変えるとか、ある一定の回数、あるいはある条件を満たすまで処理を繰り返すという事ができます。

例えば上記の例でいえば、
B列の値×C列の値を求める式をD列に埋めるという処理を、1行目位から1行ずつA列に何かしら値が入っている間繰り返す。
という風にVBAで書いて指示しておけば、データが何行あろうとできるわけです。

これをVBAで書くと


Sub shiki()
Dim row As Integer

row = 1
Do While Cells(row, 1) <> ""
Cells(row, 4).Formula = "=B" & row & "*C" & row
row = row + 1
Loop
End Sub


こうなります。
何かしら手続き型プログラミング言語をやったことのある方ならなんとなくわかりますよね。
そうでない方は一つ一つ説明していかなければなりませんが、すみません、まずは何かしら本を読んでいただいたほうが良いでしょう。

私が今使っている本は

できる大事典 Excel VBA 2016/2013/2010/2007対応 できる大事典シリーズ - 国本温子, 緑川吉行, できるシリーズ編集部
できる大事典 Excel VBA 2016/2013/2010/2007対応 できる大事典シリーズ - 国本温子, 緑川吉行, できるシリーズ編集部

これです。

同じような表紙で、Excel「関数」の本が有ったりしますのでお間違えの無いよう。

結構分厚くて大きくて、紙の本だと4000円以上もするので初めて買う本としてはちょっとビビってしまうかもしれません。
でも、これだと、巻頭にVBAを記述するときにお世話になる、開発環境VBEについての説明や、プログラムの書き方についても記述が有りますので、プログラミングが初めてという方でもなんとかなるのではないかと思います。
(実は、その辺は理解した段階でこの本を買っているので、その部分は読んでいないのでわかりやすいかどうかは分かりませんが、、)

で、開発環境とプログラムの書き方以外に何か書くことあるの?とお思いの方もいらっしゃるでしょう。

ここでいうプログラムの書き方というのは、例えばある条件が成り立つときだけ行う処理を


if 条件 then
条件が成り立った時に行う処理
end if


のように書きますが、こうしたことの事を言っています。

つまり、プログラムの骨組みになる部分ですね。

でも、何かしらプログラミング言語のたしなみのある方なら、この辺はサラっと読めばわかる話で、大事なのはその先なのです。

例えば、セルに色を付けたい。
このセルの文字のフォントを大きくして太字にしたい。

なんていう場合は、セルをどう操作するかという話になります。

そもそもセルというものをプログラム上でどう表現するのか、、

Excel、Accessなどはオブジェクト指向という考え方でできています。

分かりやすいところから言うと、Excelのファイル。
これを開いた状態をWorkbookという種類の「オブジェクト」と呼びます。
例えば、Workbook型のオブジェクトWBのファイル名を知りたいときは

WB.name

と書きます。

Workbookの中にはいくつかのシートが有りますね。
それらは

WB.Worksheets(1)

のように書きます。

更にシートの中にはたくさんのセルが有りますね。
それは

WB.Worksheets(1).Range("A1")

のように書きます。

そして、このファイルの用事はもう済んだので、閉じるという場合は

WB.close

と書きます。

つまり、○○は××からできているというように階層構造になっており、それらが持っている値(例えばセルに入っている値、ファイル名など)やそれらに対する操作(ファイルを開く、閉じるなど)をひとまとめに扱えるようになっていることをオブジェクトと言います。
(だいぶざっくりした説明ですが、、)


2020年7月22日追記
オブジェクト指向についてはこちらにもう少し詳しく書いています。
https://shigesblog.seesaa.net/article/201705article_4.html?1595429815



ExcelのVBAプログラムというと、結局はセルの値や色、罫線を変更する、シートを新たに作る、ファイルをセーブするなどの操作がメインとなりますから、こうしたオブジェクトの構造や使い方をいかに知っているかが高度なプログラムが作れるかどうかという上で大切になるのです。

なので、この手の本はこうしたオブジェクトの解説が主な内容となります。

で、こうした本は辞書のようなものなので、やりたい事に必要な部分だけをつまみ読みして使えばいいのです。
なので分厚くても頭から全部読む必要はないのでご安心ください。

一応用語だけ説明しておくと、オブジェクトが持っている値をプロパティ、操作をメソッドと言います。

あと、Excel VBAで悩んだ時に検索するとよく出てくるのがこの方のWebページ

http://officetanaka.net/excel/vba/tips/

このサイトには何度もお世話になっています。



去年まではExcelだけを扱っていたのですが、今年からAccessも扱うようになり、こちらは触った事すらほとんどないので同じような本を探したのですが、なかなかいい本が見つかりません。

上でご紹介したようなオブジェクトを網羅的に(オブジェクトは本当にたくさんあるのでそれでも全部ではないのですが)記述しているような本が欲しいのですがExcelに比べると本当に本が少ないです。
一応この本を買いましたが、

AccessVBAパーフェクトマスター(Access2019完全対応 / Access2016/2013対応) (Perfect Master) - 宗之, 岩田
AccessVBAパーフェクトマスター(Access2019完全対応 / Access2016/2013対応) (Perfect Master) - 宗之, 岩田

Access VBAを書く上での基礎知識が付いたという程度でしょうか、、
幸い、一から作るというより改造の仕事から始まったので、元のプログラム自体をお手本として直していって、ネットで調べながら知識を身に着けて行ったという感じです。

Access VBAで最初につまづいたのは中身の入っていない項目ですかね。
Excelだとあるセルに値が入っていないかどうかは.valueが””かどうかで判断しますが、Accessでは””だったりNULLだったり、、
nzというAccessの関数を知っておくと便利です。

今回はここまで。

にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

この記事へのコメント

この記事へのトラックバック