介護事業者のためのExcelVBA入門講座⑤~セルを編集してみよう(実践編)~
(補足を含めると、かなりボリュームのある記事になってしまいました。あとで再編するかもしれませんが、補足の部分はオブジェクト指向についての記述なので、読み飛ばしてもらってもかまいません!)
前回は、「Range」を使用したセルの編集方法について、お伝えしました。
https://note.mu/teradosh/n/n40e4eb717f93
前回のプログラムをもう一度見てみましょう。
「Range("A1").Value = 1」
「Range("A2:B2").Value = 1」
このように、Rangeでは、セルの「範囲」を指定することができます。
普段の介護現場の業務で使うプログラムにおいては、「ひな形」となるようにあらかじめ「シート」を用意しておいて、決まったセルに、集計値などを入力する、というのがほとんどです。
ただし、フォーマットが変更される場合は、往々にしてあります。
変更された際に、「”A2:B2"」など、範囲をしてするより、「行」「列」を指定するほうが、都合がいいのです。
行追加があったら、追加があった行数を足すだけで、プログラムを修正できますからね。
そこで、登場するのが「Cells」というプロパティです。
「Cells」の指定方式
Cellsでの指定方法は、()内に、「行, 列」を、「,」(カンマ)区切りで記載します。
たとえば、Range(”A1")を、Cellsで表すとしたら
「Range("A1")」 → 「Cells(1,1)」
Range(”B2")なら
「Range("B2")」 → 「Cells(2,2)」となります。
変数について
プログラミング言語で重要な、「変数」という概念について、説明したいと思います。
さて、VBEを開いて、以下のプログラムを書いてみましょう!
(はい、「Alt」+「F11」、標準モジュールの挿入、ですね!)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub Sample()
Cells(2, 1).Value = 1
End Sub
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
実行できましたでしょうか?
このように、2行目のセルに、値「1」が入力されたかと思います。
これを、変数を使ったプログラムで、実現したいとおもいます。
変数とは、状態を記憶しておくための「箱」
まず、変数について説明していきます。
変数を覚えるときは、「箱」をイメージすると、非常にわかりやすいです。
今回示したプログラムでは、「行」は「2」と固定となっていますが、行を可変にすることで、応用力のあるプログラムを書くことができます。
「変数」を用意して、プログラム自体を書き換えなくていいようにする、ということが、実務ではよく行われます。
今回は、「行」を表すために、変数「i」を用意します。
じゃあこの「i」という箱に、「1」という数字を入れてみます。
(手書きイラストですみません。。)
これで、箱「i」には、数値の「1」が入っていることになります。
では、コンピュータに、「「i」の値を表示しなさい」、というと、当然、中に入っている「1」を表示します。
さて、次に、今「1」が入っている箱「i」に、数値「2」を入れてみます。
すると、すでに入っていた数値「1」と入れ替わり、箱「i」には、数値の「2」が入ることになります。
もう一度、コンピュータに「「i」の値を表示しなさい」と命令すると、何が表示されると思いますか?
そうです。「2」が表示されます。
このように値を入れる「箱」=「変数」を使うメリットってなんでしょう、というのが、肝なのですが、iが1のとき、iが2のときで
「「i」の値を表示しなさい」
という、命令は、まったく「変わらない」ですよね。
変数がなかったら、1を表示する場合、2を表示する場合、また必要があれば、3を表示する場合、それぞれのパターンに応じて、プログラムを記述する必要があります。
変数を使えば、命令は「「i」の値を表示しなさい」の1行で済みます。
このように、プログラムの記述量を、抑えることができるのが、変数の意義です。プログラムの記述量が少ないということは、改修が必要になったときに、変更箇所が少なくてすみます。
このように、プログラムを単純化して、改修しやすくすることを、「保守性を上げる」と言ったりします。
また、今は変数を「i」と定義しましたが、例えば、「人数」や「商品数」など、意味のある「ラベル」をつけることで、人間がプログラムをみたときに、非常に意味がわかりやすいですよね。
このような配慮のことを「可読性を上げる」などと言ったりします。
(「変数名」というのは、非常に奥が深く、開発の現場でも、うまく運用できていない現場もあるのが実情なのですが。。)
変数のポイントは
・プログラムの記述を少なくすることで、「保守性」を上げることができる
・数値にラベルをつけることで、「可読性」を上げることができる
また、プログラムの記述を少なくするというのは、プログラムが読みやすくなりますから、これも「可読性」を上げることにつながっていますね。
この「保守性」「可読性」というのは、プログラミング言語問わず、重要な概念ですので、ぜひ、覚えておいてください。
変数の宣言方法
さて、イメージをつけたところで、具体的にVBAで変数を使っていきたいと思います。
変数を使うには、以下のような記法を書く必要があります。
※前回の講座でもお話ししましたが、記法は「そういうもの」なので、覚えてしまってくださいね。
「Dim i As integer」
→「Dim 変数名 As 変数の型」となります。
Dimは、「dimension(次元)」を意味します。なぜ「次元」なのかはよくわからないのですが、「定義する」ぐらいの意味合いで覚えておけば間違いないと思います。
これで、「integer」型の変数、「i」が定義できました。
はい、また新ワード、integerがでてきましたね。変数には、プログラミング言語毎に、変数の「型」というものが用意されています。
変数の型
変数の型には、以下のように様々なものがあります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ブール型 Boolean TrueまたはFalse
バイト型 Byte 0~255までの整数
整数型 Integer -32,768~32,767の整数
長整数型 Long -2,147,483,648~2,147,483,647の整数
通貨型 Currency -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807の固定小数点数
単精度浮動小数点数型 Single 負の値:約-3.4×10(38乗)~-1.4×10(-45乗)
正の値:約1.4×10(-45乗)~1.8×10(38乗)
倍精度浮動小数点数型 Double 負の値:約-1.8×10(308乗)~-4.0×10(-324乗)
正の値:約4.9×10(-324乗)~1.8×10(308乗)
日付型 Date 日付:西暦100年1月1日~西暦9999年12月31日
時刻:0:00:00 ~ 23:59:59
文字列型 String 任意の長さの文字列
オブジェクト型 Object オブジェクト
バリアント型 Variant すべてのデータ
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
うわー、、となりますよね。「仕様」とは、得てして複雑なものです。
(少しずつ積み上げていくので、プログラミング言語創立者でさえ、すべて理解はしていないでしょう。(多分))
前回お話したとおり、これらを「覚える」必要はありません。どんな型が用意されており、使い方によって、何が「実現できるか」が、プログラミング学習の肝です。
実務上、とくにセルの行などを扱う場合は、整数の型である「integer」を使えば十分に足ります。
さて、なぜこのような変数の型がさまざまあるかというと、コンピュータが、人間の概念である「数値」を実現するために、様々な手法を使っているから、が答えだと思っています。
コンピュータの内部では、文字だろうが、数字だろうが、すべて「0」「1」で表現しています。
なので、データを扱うとき、「これは文字列です」また「これは整数です」というタグ付けが必要になります。
このように、あるデータ(0と1のみで表現されたもの)から、人間が欲しい情報を導き出すことを、「エンコード」と言います。
今回は、integerなので、この変数は「i」という名前で、型は「整数」ですよ、という宣言していることになります。
変数を使ってプログラミングしてみよう!
さて、実際にプログラムを書いていきますよ。
ーーーーーーーーーー
Sub Sample()
Dim i As Integer
i = 1
Cells(1, 1).Value = i
End Sub
ーーーーーーーーーー
ちなみに「i = 1」の「=」(イコール)については、覚えていますか?
前回の講座でやりましたが、この「=」は、「代入演算子」といい、右の値を、左側に代入する、という意味でしたね。
なので、「i = 1」は、「1」という数値を、左の変数「i」に代入する
という命令になるのです。
ちなみに、VBEには自動補完機能がありますので
「As」のあとに、「i」まで打つと、、
こんな感じで、自動で選択ダイアログがでてきます。
で、実行してみると、、Cells(1,1)に、変数i(=1)が入力されると思います。
次に、プログラムを書き換えてみましょう。
変数を増やします。
ーーーーーーーーーーー
Sub Sample()
Dim 人数 As Integer
Dim 行 As Integer
人数 = 555
行 = 3
Cells(行, 1).Value = 人数
End Sub
ーーーーーーーーーーー
見てお分かりのとおり、(あまり奨励したくはないのですが)、VBAでは、変数名に「日本語」も使えます!なので、自分の作業のためだけ、または、日本語のほうが都合のいい場合には、思い切って変数を日本語にしてしまうのも、ありだと思います。
実行すると
はい、こうなりましたね。
変数は、Cells(行,1)のように、プロパティの中でも使えます!
このように、Cellsプロパティの行数や列数を、変数で変化させながら、自分の好きなところに、値を入力していく、というのは、ExcelVBAの常套テクニックとなります。
また、今まではi=1としていましたが、大きな数字でも、当然扱うことができます。
変数が使えるようになりましたので、次回は、これも変数と並んでプログラミングの肝である「条件分岐」と「ループ処理」を学んでいきたいと思います!
まとめ
・変数とは、値を入れておくための「箱」
・変数を使うことで、、
プログラムの記述量が減り、保守性、可読性があがる
人間がわかりやすいタグをつけることで可読性があがる
・変数は、プロパティ内(Cellsの行、列など)にも使うことができる、これがVBAのプログラミングの常套テクニック!
【補足】またまた、オブジェクト指向について、、、
さて、セルについての操作方法について習得してもらったところですが、私が説明してきた「「Cells」というプロパティ」という説明を聞いて、疑問に思った方はいますか。
あれ、「Range」は、セルを指し示す「オブジェクト」なんじゃなかったっけ、、と疑問に思った方は、かなり鋭いです。
少しややこしくなりますので、わからない方は、この補足以降は、一旦読み飛ばしていただいて構わないのですが、RangeとCellsにまつわる「オブジェクト指向」の話をしておきたいと思います。
Range("A1")、Cells(2,2)は、オブジェクトではない!?
Range("B2")も、Cells(2,2)も、実は、オブジェクトではないんです。。
「Range」と単純に書いた時と、「Range("A1")」、それぞれの「Range」は意味合いが違うのです。
実は、Range(”A1")と書いたときの「Range」は、「プロパティ」なんです。
前回説明したとおり、プロパティは、オブジェクトの情報、属性のことです。
しかし、前回ご紹介した「オブジェクト.プロパティ」という記法に該当していませんよね。
実は省略されているオブジェクトが!
これまで書いていただいていたプログラムの中では、「Range("A1").Value= 1」としていましたが、実は省略記法が使われているのです。
「Application.ActiveWorkbook.ActiveSheet.Range("A1").Value = 1」
「Application.ActiveWorkbook.ActiveSheet.」は、VBAの仕様では、「省略可能」となっているので、書いてなくても自動で「あぁ、書いてないってことは、「ActiveSheet」のことね」とエクセルが自動補完してくれているのです。
省略されている部分を、細かく見ていきましょう。
「Application」とは、最上位のオブジェクトです。「Excel」本体と思っていて問題ないでしょう。
次にActicveWorkbook、ActiveSheetですが、この「Active」は、「今、選択されている」と、理解してください。
たとえば、以下の図では、「A1」が選択されていますよね。
この場合は、「A1」がActive、となります。
「選択されている」のイメージが湧きましたでしょうか。
※通常、プログラムを書く際は、どのシートやセルがActiveか、状況が変わってもプログラムが対応できるよう、「ブック」、「シート」を指定しておくことが多いです。その方法については、また次回以降の講座で説明します。
とりあえず、省略されている場合の、「.Range」、「.Cells」は、「Application.ActiveWorkbook.ActiveSheet」の「プロパティ」である、と理解しておいてください。
なので、単純に「Range("A1").Value = 1」と書いた場合は、今選択されているブックの、選択されているシートの、セル(A1)の、値に1を代入する、というプログラムなのです。
さて、「Range」と単体で書いたときは、オブジェクトの名称を意味するのですが、「Application.ActiveWorkbook.ActiveSheet.Range("A1").Value = 1」に書いてある「.Range("A1")」は、「Range」オブジェクトを取得するための、プロパティなんです。
厳密には、この「.Range("A1")」は、「オブジェクトを取得せよ」という命令的な意味合い=プロパティであり、「Application.ActiveWorkbook.ActiveSheet.Range("A1")」全体が、「Range」オブジェクトを指していることになります。
オブジェクト式
オブジェクトを扱うときに、「Application.ActiveWorkbook.ActiveSheet.Range("A1")」と、いつも、こんな長ったらしい書き方をしないといけないの、、と思いますよね。
確かにそのために省略記法もあるのですが、実務では、ブックやシートを明示的に管理しておくことがほとんどです。
さきほど、説明した「変数」には、「オブジェクト」を入れておく変数も存在するのです。これを「オブジェクト変数」といいます。
ここで、やっと登場するのですが、「Range」オブジェクトを入れておきたいときに使用する変数は、そのまま「Range」型、となります。
これが、オブジェクトの「Range」です。
「変数」の部分で、紹介した「Integer」などの変数と違い、「オブジェクト」をいれておくときには、「Set」という構文を使います。
オブジェクト式
変数を宣言するときは、「Integer」と同様に「Dim」を使います。
Dim R As Range
など、適当に変数名をつけます。
次に、「Set」を使います。
Set R = ThisWorkbook.WorkSheet("Sheet1").Range("A1")
とします。
このように、オブジェクト変数に、一度格納していおくと、長ったらしくプロパティを記載する必要はなく
「R.Value」
と記載すれば
「ThisWorkbook.WorkSheet("Sheet1").Range("A1").Value」
と等価になります。
さて、この「Set」には、「インスタンス化」というオブジェクト指向で大事な作業を行っているのですが、コンピュータのハード的なお話(メモリ)のバックグラウンドが必要となるので、それはまた別の講座でお話しします。
それでは!
この記事が気に入ったらサポートをしてみませんか?