見出し画像

介護事業者のための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」には、「インスタンス化」というオブジェクト指向で大事な作業を行っているのですが、コンピュータのハード的なお話(メモリ)のバックグラウンドが必要となるので、それはまた別の講座でお話しします。

それでは!

この記事が気に入ったらサポートをしてみませんか?