介護事業者のためのExcelVBA入門講座④~セルを編集してみよう(導入編)~
前回は、VBEを使ったプログラミング方法をご紹介しました。
今回は、ExcelVBAの肝であり、基本の基本であるセルを操作していきましょう。
ExcelVBAは、オブジェクト指向の言語です。
肝であるオブジェクト指向をすっ飛ばして、操作方法だけ覚えてしまっても、今後ほかのプログラミング言語を学びたいときや、VBAをさらに深く学びたいときに応用が利きません。
理解度を上げていくためにも、少し、ここで字数を割いておきたいと思います。
オブジェクト指向とは「ブックや、シート、セルを直感的に操作できる便利な機能」と説明してきました。
この「オブジェクト」について、もう少し詳しく解説しておきたいと思います。
オブジェクトは直すると「物」です。
コンピュータの世界には「抽象的概念」は存在しない
「コンピュータ」の世界には、「物」という概念は存在しません。
というか、「概念」自体が存在しません。
「コンピュータ」からみたら、どんなプログラムも「見分けがつきません」。
今、自分が実行しているのが「見積書作成ツール」なのか「家計簿管理ツール」なのか、コンピュータは「理解できません」。
「コンピュータ」には莫大な量の記憶領域があり、「忘れること」がありません。
さらに、その記憶を、意図的に選択し、呼び出すことができるので、どれだけ大きなプログラムであっても、記憶しているものを順々に実行していくだけでよいのです。
一方、我々人間はどうでしょうか。
人間の「記憶」は流動的であり、脳内のメモリーは機械的に「拡張」することはできません。コンピュータのように、どのような細かいこともすべて覚えていて、また、呼び出したいときに特定の記憶を指定し、呼び出すことはできません。
それを解決するのが、「抽象化」という考え方です。
テーブルの上にある「りんご」を見て、人間は「りんご」だ、と考えます。(至極当たり前ですが)
でも、よく考えると物理的な世界においては、「りんご」には個体差があります。
「りんご1」「りんご2」「りんご3」…「りんごn」…と「区別」できるものです。
ただし、この方法では、世界を理解するのに、非効率です。
「りんご1」と「りんご2」の差を覚えておくのに、おそらく「何万箇所」の特徴を記憶しておく必要がありますから。
なので、我々は、「りんご」とまとめて表現することで、この世の物事を理解しています。
また、さらに「りんご」「みかん」「ぶどう」などをまとめて、その上位概念である「果物」として理解しています。
このように、「物」の共通的な部分を抽出して、分類する機能のことを
「抽象化」
といいます。
我々人間は、「抽象化」された「物」を操作するということに、なじみが深いのです。
「オブジェクト指向」は、誰のためのもの?
「オブジェクト指向」とは、誰のためのものなのか、というと、「プログラマー」=「人間」のため、です。
「オブジェクト」とは、本来、無機質な「プログラム」を抽象化し、「物」のように扱うことで、直感的に物事をあつかう(人間になじみのある思考法)ことができ、またコードを共通化することで「再利用性」を高めることができます。
人間が、別々の「リンゴn」を見ても、「あ、リンゴだ」と思えることと同じですね。
VBAでのオブジェクトの扱い方
VBAでは、以下のような分類があります。まずこれをしっかりと理解しておきましょう。(他のプログラミング言語でも、指し示す用語は変わりますが、構成はほとんど同じです。)
①オブジェクト
ブック、シート、セルなど、「操作の対象」となるもの
②プロパティ
「①オブジェクト」に付随する、情報を指すもの
※例えば、「セル」の「色」や「値」など
③メソッド
オブジェクトが行うことのできる「ふるまい」のことです
上記の分類を理解するために、「人間」というオブジェクトについて考えてみましょう。
オブジェクト:人間
プロパティ:身長、体重、性別、足の長さ、状態(しゃがんでいる、立っている)
メソッド:しゃべる、しゃがむ、立ち上がる、、etc
というようなイメージとなります。
セルを操作してみよう!
さて、やっと本題に入ります。
「セル」を操作していきますが、VBAで、セルは「Range」と定義されています。
この「Range」が、「セル」を示す「オブジェクト」です。
VBEを開いて、標準モジュールに、以下のプログラムを記載し、実行してみてください。
※VBE、標準モジュールについては、第3回目の講座を参照してください。
https://note.mu/teradosh/n/n1c331bc027c9?magazine_key=mf502928709f3
<プログラム>
Sub セルの操作()
Range("A1").Value = 1
End Sub
<実行結果>
「A1」のセルに、「1」という値が入力されましたね。
「Range("A1").Value = 1」を、「分解」してみていきましょう。
「Range」は、セルを指すオブジェクトです。
Rangeの()内には、「セルの位置」を記載します。
A1、B2などと記載し、それをダブルコーテーション("")で括ります。
なお、Rangeは、1つのセルだけではなく、複数のセルを選択できます。
プログラムを「 Range("A2:B2").Value = 1」と書き換えて、再度実行してみてください。
A2とB2に1が入力されましたね。このように、セルは1セル単位と、範囲指定と2種類の指定が可能です。
次の「.Value」ですが、これが「プロパティ」です。その名の通り、セルの「値」を示す「プロパティ」となります。
「.」でつなぐことで、「Range」オブジェクトの、プロパティであることを示します。これは「記法」なので、覚えるしかありません。
次に「=」について説明します。
プログラミングの勘所 「=」
プログラミングの世界では、「=」は、数学の等式→イコールの意味ではありません。
「=」は、「代入演算子」と呼ばれます。
おそらく、どのプログラミング言語においても、この代入演算子の考え方は同じです。ここでばっちり覚えてしまいましょう!
「x = y」
は、「xとyは同じである」ことを指すのではありません。
(等式のように、「同じであること」を示すには「論理演算子」というものを使うのですが、それはまた別の講座でお伝えします。)
「右」(y)の値を、「左」(x)に、「代入する」という意味になります。
もう一度、プログラムを見てみましょう。
「Range("A1").Value = 1」
左(Rangeオブジェクト(位置はA1))の「値」)に、1を代入する
となります。
これで、セルに「1」が入力されるわけですね。
なお、セルの操作は、実は「Cells」という「プロパティ」を使用することがほとんどです。
「繰り返し処理」で、「行」を1ずつ増加させて、セルを参照したりするのですが、その時に、行、列を指定できるCellsのほうが都合がよいのです。
次回は、Cellsプロパティによるオブジェクトの取得方法と、その操作について説明していきたいと思います。
また、今回紹介したRangeも、厳密に言うと、「オブジェクト」そのものではなく、プロパティなんです、、非常にややこしいので、ひとまず今回講義の通り、覚えておいてもらってよいのですが、その辺りも次回説明します。
合わせて、「変数」というプログラミングを学ぶ上で非常に重要な概念についても、触れていきます。
以下は、補足的な説明となります。
【補足】「Value」プロパティは、省略できる
「Range(”A1")=1」と記載しても、同じ結果が得られます。
これは、代入するときは大体、Valueなんだから、Valueなんだよね、とプログラム側が自動的に補完してくれるから、です。
このように、プログラミングでは、省略できる書き方というのがさまざま存在します。都度、覚えていくとよいでしょう。
職業として、プログラマをしているとその現場現場でルールがあったりします。(混乱をさけるため、省略はしないなど)
ただ、我々は、プロのプログラマーではありませんから、「省略できるんだな」ぐらいに思っていればOKだと思います。
私は、明示的に「Value」プロパティを記載するようにしています。「Value」は省略するほど手間でもないから、です。
実は、今回紹介したプログラム
→ 「Range("A1").Value = 1」も、なにかが省略されているのです。
それは、次回以降、説明します。
【補足】「記法」は、覚えるしかない!ただ覚えなくていい!(どっちや)
Rangeの()内のA1、セルの位置を「””」で括る必要があるなど、このような言語毎の記法は、「覚えるしかありません。」
ルール通りに記載しないと、プログラムは動いてくれません。そしてその「ルール」は、プログラミング言語の作成者が「決めた」、ただそれだけです。
我々自身がプログラミング言語を一から作成しない限り、作成者のルールに従うしかありませんからね。
ただ、このルールを厳密にすべて覚える必要はありません。
覚えておいたほうが、もちろんプログラミングのスピードはあがりますが、忘れてしまった場合は、リファレンスサイトなどですぐ調べてしまえば問題ありません。
「言語の仕様を細かく覚えること」が、プログラミング学習の肝ではありません。
どのように書けば、何ができるのか、をまずイメージとして、つかんでください。
細部については、都度調べればよいのです。
まとめ
①オブジェクト指向は、「抽象化」で物を理解している人間のためのもの
②セルは「Range」というオブジェクトで表される
③プログラミング学習の肝は細かい仕様を覚えることではなく、「どのように書けば、何ができるのか」をイメージすること
この記事が気に入ったらサポートをしてみませんか?