初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel エクセルマクロVBA入門-プログラミング基礎(命令文の書き方)

もう少しだけこの3行のプログラムを見てましょう。

Public Sub Test1()

    Range("A1").Value = "Hello! VBA!"

End Sub


わずか3行です。ですが、これだけでブログ3回も費やせるくらい深いってことですな。逆にこの3行が理解できないなら、この先は絶対に無理ってこった。その為に、こうして時間をかけて解説しています。

オブジェクト(ロボ)の省略


前回やったヤツ。

Application.ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = "Hello! VBA!"

は覚えてますか?これは

エクセルのブックのSheet1の範囲セルA1の値にHello! VBA!を設定する

と翻訳することができました。ドットを「~の」と呼ぶのでしたね。
いかがでしょうか?プログラミングがいかに「言葉」であるか?ということが分かっていただけると思います。

言葉ですから、我々人間もわかりきったことをわざわざ言語化して相手に伝えたりはしませんよね?
コンピューターも同じです。人とコンピューターとのコミュニケーションのためにプログラミング言語はありますから、両方ともわかりきっていることならば省略することができます。

プログラミングは人もエクセルも双方が分かるように書く

ということがとても大切なことで、またプログラミングのエラーを未然に防ぐことになります。

さて、先ほどの文章。

Application.ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = "Hello! VBA!"

を考えてみます。ちゃんと書くとこうなる。と書きましたが、省略するとどうなるでしょうか?

・お互い今起動しているエクセルに対して命令することはわかっています。
・使うブックも決まっています。
・Sheet1のオブジェクトのコードウィンドウに書いています。

これらから、上の文章は

Range("A1").Value = "Hello! VBA!"

と省略できるとわかるわけです。なんでもこう省略できるというわけではありません。あくまでも、基準は

人もエクセルも両方がわかるように書く。

です。ですので、上の文でもちょっとどこのシートかコードだけではわかりにくいな。と人が思ったら。

Sheet1.Range("A1").Value = "Hello! VBA!"

とシートロボから記述してもいいのです。これがとても大切なことです。プログラミングは言語です。相手も自分もちゃんとお互いがわかるように伝えることが大切なのです。

同じ意味でもいろいろな命令文の書き方がある


つまり、別の言い方をすれば、どんな伝え方でも両方がわかればいいのです。Good morningでも、Hi!でも!チャオ!でもいいわけです。したがって、プログラミングも言語ですから、やっぱり、同じ意味でもいろんな言い方があります。
先ほどの文を例にあげますと、

1:Sheet1.Cells(1, 1).Value = "Hello! VBA!"

と書いても同じ意味です。

2:Sheet1.Cells(1, "A").Value = "Hello! VBA!"

と書いても同じです。

3:Range(Sheet1.Cells(1,1), Sheet1.Cells(1,1)).Value = "Hello! VBA!"

と書いても同じです。それぞれちょっとずつ、翻訳すると意味が違います。おはようと、ハーイ!くらいの違いです。(笑)

1:Sheet1のセル1行1列目の値に「Hello! VBA!」を設定する
2:Sheet1のセル1行目A列の値に「Hello! VBA!」を設定する
3:Sheet1の範囲セル1行1列目から1行1列目までの値に「Hello! VBA!」を設定する

となります。結果は全部、A1のセルにHello VBA!が出力されます。

言い方は違いますが、伝わった結果はかわらないということが良くわかると思います。言語としては当たり前ですがプログラミングとなるとそれを忘れてしまい、うぁ!なんか難しい・・・というイメージにとらわれてしまいます。

是非、そういう概念は一度捨てて言葉としてとらえてみればきっと簡単に理解ができると思いますよ?


せっかくですからちょっとオブジェクト(ロボ)という概念から今の言い方について見て見ます。視点を変えてお話しするだけですので混乱しないようにしてくださいね。先ほど書いた4つ。

  • Sheet1.Range("A1").Value = "Hello! VBA!"
  • Sheet1.Cells(1, 1).Value = "Hello! VBA!"
  • Sheet1.Cells(1, "A").Value = "Hello! VBA!"
  • Range(Sheet1.Cells(1,1), Sheet1.Cells(1,1)).Value = "Hello! VBA!"

これらは実は操作しているオブジェクト(ロボ)とその操作がちょっと違います。それぞれ・・・

  • Sheetオブジェクトが親のRangeオブジェクトのValueプロパティを操作
  • Sheetオブジェクトのセルプロパティを操作

の2種類を使っています。どの文(コード)がどのオブジェクト(ロボ)を操作しているか?はわかりますよね?
エクセルはたくさんのオブジェクト(ロボ)で出来ているので、こんなことができるのです。ちょっと便利ですよね。

なぜなら、時と場合によって、行列で指定するセルプロパティを使った方がいい場合や、反対にRangeオブジェクトを使った方が簡単な場合がマクロを組む上ではたくさん存在するからです。

言葉の話に戻せば、時と場合で「おはようございます」がいい場合と「やあ!」がいい場合がありますよね?それと同じことがプログラミングの世界でもありますよ。ということです。

次回は変数のお話です。
以前やってますが、さらにわかりやすく話ができるといいんですが・・・

今日はここまで!