家計簿アプリを、より使いやすく自分仕様に改造していきましょう!
以前の投稿で、家計簿アプリとして最低限の機能を持たせることができました。
(その6までをご確認いただいていない方は、まずは下記まとめをご確認ください。)
ただ、これは本当に最低限の機能しかなく、勘定科目も『固定費』と『変動費』しかないので、
各家庭に合った勘定科目を自由に追加できるように、
このマクロのデコレーションをしていく必要があります。
前回まででダウンロードしてきた明細書を基に、おおよそでリストに記入できるようにしていくマクロが完成しました。
これで家計簿アプリとしては十分な機能を持っていますが、
この家計簿アプリ作成で学んだことを基に他のマクロを作成していくと、
必ずぶち当たる壁があります。
それが【配列】です。
今回の家計簿アプリではその差をほとんど感じられないかもしれませんが、例えば100個のファイルからデータを抽出していくといったマクロを組んでいくと、今回の作り方だとマクロが動き終わるのにかなりの時間がかかってしまいます。
そういった、より大量のデータをより複雑かつ高速に動かすようにするには、最終結果が入力されるまで画面上に表示させない、所謂「バックグラウンドでの操作」をする必要が出てきます。
そのために必要な知識が【配列】なのです。
今回はその【配列】の概念について説明し、次回以降で「その9」で読み込んだファイルデータを、直接Excelシート上に貼り付けるのではなく、配列を介してデータを貼り付けていく方法を説明していこうと思います。
【配列】を使いこなせるようになると、ExcelVBA以外の他のプログラミング言語でも応用が可能になってきますので、プログラミングスキルが大幅に向上します。
頑張って慣れていきましょう!
【本記事の目標】
【配列】について知ろう
簡単なイメージは下記記事に記載していますので、イメージづくりや今回以降の流れの参考に。
また、前回までの記事については下記をご確認ください。
変数とは
配列というのは、大きなくくりでいくと変数に分類されるものです。
そこで、まずは変数について改めて説明していきます。
変数というのは データを入れておくための箱・入れ物 のことです。
数学での変数(x、y)をイメージすると分かりやすいと思います。
例えば、
y=2x+6
という式があったとき、x=3のとき、yはいくらになりますか?
この計算をするとき、『y=2x+6』のxに3を代入して、
y=2×3+6=12
という計算をしてyの値を求めますね。
このとき、『x=3のとき』という文言が無ければ、
y=2x+6
の式のxとyにはまだ何の数値も入っていない空の状態です。
後からxとyに数値を代入できるように、
「x」と「y」という名前を付けた箱が式の中に置かれているだけ
という状態になっています。
そこに「3」というデータを「x」に代入することで、初めて計算することができるようになり、
「y」の値を求めることができます。
上記の例のように、変数というのはそれ自体には意味がなく、中にデータが入って初めて動き出すことができます。
この変数という箱にデータを入れる際、箱に名前を書いていないと、どこに入れていいか分からなくなりますよね。
(y=2x+6 の式に「3」を代入して、と言われても、「どこに?!」となりますよね)
ですので、変数を準備する際は必ず名前を付けて定義し、
またその変数にデータを入れる際は、定義した名前に対してデータを入れていくのです。
要は、変数の定義というのはデータが入る箱を用意して、その箱に名前を書いておく作業なのです。
これが、
・『Dim』を使って変数を定義
・変数名=「データ」 でデータを変数に代入
という一般的なプログラミングでの流れのイメージです。
配列とは
配列のイメージ
変数というのはデータを入れるための箱 ということは分かりました。
じゃあ配列は?
配列は変数の考え方を少し広げて、
1つの箱ではなく、間仕切りのある大きな箱
として考えて、その大きな箱に対して名前を定義します。
そのため、配列の変数にデータを代入するときは、
配列変数の名前だけでなくその中の場所も指定してデータの出し入れをする必要があります。
例えば、間仕切りがある引き出しの中から物を取ってもらうとき、
「リビングにある棚の、上から3番目の引き出しの、手前から2個目、左から3個目に入ってるもの」
みたいな言い方をして、取ってほしいものがある場所を伝えますよね。
ここで、『リビングにある棚』というのが配列の変数名(上記図だと[y])に相当します。
その以降の『上から3番目、手前から2番目、左から3番目』というのが、配列の中の場所を指定する、というイメージです。
これをプログラミング的な書き方をすると、
リビングある棚(3,2,3)
といった表現になります。
また、この例だと3つの場所を指定しましたよね。
このような配列を【3次元配列】と言います。
配列は3次元だけでなく、1次元や2次元、4次元や5次元でも、任意の次元で作ることができます。
(4次元・5次元になってくるとデータ容量が膨大になり、かつプログラミングする側もイメージしづらいので、一般的には1~3次元で作ることが多いです)
ExcelVBAで配列を使う場合は、特に【2次元配列】を使うことが多いです。
これは、Excelのシートがそもそも2次元配列のイメージ通りの形をしているため、
・Excelシート上のデータを全て2次元配列に代入して~
・計算が終わった2次元配列をExcelシートに貼り付けて~
といった操作が非常にやりやすいためです。
長々と説明しましたが、配列をイメージする際に押さえておくべき点は下記3点です。
1.配列は複数のデータを入れるための
『間仕切りのある大きな箱』
2.配列の中のデータを操作するときは、
中の場所を指定する(何番目のデータ?)
3.配列は任意の次元で作ることができるが、
Excelの場合は2次元が一番イメージしやすい。
配列を使ってできること
繰り返し計算が簡単にできる
配列を使ってどんなこと、どんな計算ができるのか?
実は配列を使ったからといってそれほど特別な何かができるわけではありません。
配列の中に入っているのは、通常の変数の場合と同じただのデータですので、
配列の中に入っているデータを使って計算させる場合は、
配列の中の場所を指定してデータを取り出して、通常の変数と同じような計算をしていきます。
じゃあなぜ配列を使うの?というと、繰り返し計算をさせるときに非常に便利だからです。
例えば、下記のような名簿があり、それぞれのBMIを
プログラミングを使って計算しようと思うとどうしますか?
それぞれの身長・体重の変数を、
Dim A-身長 as Double
Dim A-体重 as Double
Dim A-BMI as Double
Dim B-身長 as Double
Dim B-体重 as Double
Dim B-BMI as Double
・・・
という形で定義し、それぞれに上記の値を代入して、
A-BMI=A-体重/(A-身長/100)^2
B-BMI=B-体重/(B-身長/100)^2
・・・
という計算を延々と書いていくと非常に大変ですよね。
もちろん上記のように数えられる程度であれば書けなくはないですが、
これが1000人、10000人といったデータになってくるとほぼ不可能です。
こういった時に、身長のデータと体重のデータをそれぞれ配列変数として
Dim 身長(1 to 6) as Double
Dim 体重(1 to 6) as Double
Dim BMI(1 to 6) as Double
という形で定義し、この配列の中に上記のデータを入れた後、For文を使って
For i = 1 to 6
BMI(i)=体重(i)/(身長(i)/100)^2
Next i
という式を書いてあげれば、それだけでプログラミングが完了してしまうのです。
またこれが人数が増えたとしても、6を1000に変えるだけで1000人のデータであっても対応できるようになります。
Excelの場合、2次元配列はそのまま貼り付けることができる
Excelの場合ですが、2次元配列のデータはExcelシートにそのまま貼り付けることができます。
例えば上記の身長・体重の名簿の例でいくと、
配列を使わない場合のBMIの計算結果は
A-BMI
B-BMI
・・・
とそれぞれの変数に入っていますので、
Thisworkbook.Worksheet(1).Range(“E2”)=A-BMI
Thisworkbook.Worksheet(1).Range(“E3”)=B-BMI
・・・
という感じで、結果の貼り付け作業もそれぞれ書いていく必要があります。
これが配列の場合、BMIの計算結果は
BMI
という配列に入っていますので、
Thisworkbook.Worksheet(1).Range(“E2:E7”)=BMI
という感じに書くだけで、BMIという配列に入っている6個のBMIのデータが一気に貼り付けられるのです。
配列のメリット
上記で説明したように、配列を使うことで繰り返し計算のプログラムが書きやすかったり、データ貼り付けのプログラムが書きやすくなるといったメリットがあります。
ただ、このようなプログラムを書きやすくするメリットだけでなく、
他にも大きなメリットがあります。
その一番のメリットが、プログラムの動作が格段に速くなる という点です。
実はパソコンの中では、人がイメージできないぐらい高速でデータの操作や計算を行っています。
そのため、ExcelVBA等でプログラミングをした場合でも、基本的にはマクロを起動して一瞬で完了してしまいます。
ただ、プログラムの書き方によっては、同じ動きをさせているのにもかかわらず、完了するまでの時間が大幅に変わってしまうときがあります。
それは、画面(ユーザーインターフェース)を操作する動作が頻繁に入ってしまっている場合です。
一般的なプログラムの動作を考えたとき
① データを入力するor読み込む
② 読み込んだデータを計算・操作する
③ 計算・操作した結果を表示する
といった流れになりますが、この中のどこで時間がかかるかというと、
③と①で画面操作が入るため非常に時間がかかり、②については一瞬で終わります。
これは特にExcelの場合は顕著ですので、
①・③の回数をいかに減らすかがExcelVBAマクロの動作を早くするコツになります。
例えば上記の身長・体重名簿の例で、配列を使わないでデータを貼り付ける場合、
1つ1つデータを読み込んで、1つ1つデータを貼り付けていきましたね。
上記の例では6個のデータでしたが、これが10000個のデータになってくると、読み込みと貼り付けで20000回画面を操作することになります。
1回の画面操作が遅いとはいえ0.01秒といったレベルなので、数個のデータであれば問題ありませんが、20000回となってくると、それだけで200秒近い時間がかかってしまうことになります。
これが配列になると、画面内のデータを一括で配列として読み込み、一括で貼り付けるため、データが10000個あったとしても、画面の操作は読み込みと貼り付けの2回だけになり、マクロの動作も一瞬で終わるのです。
配列のデメリット
じゃあ配列を使うデメリットが無いのか、というと、無くはないです。
デメリットの1つは、パソコンのメモリを圧迫してしまう、という点です。
配列は一旦パソコンのメモリ領域に保存されるため、メモリ容量が低いパソコンだとそもそもメモリが足りず動かなくなる可能性があります。
とはいえ最近のパソコンは性能がかなり向上しているので、よっぽど性能が低いパソコンを使って、製造工場等の膨大なデータを一気に操作する、といった状況でなければまず止まることはあり得ないです。
もう1つのデメリットは、理解する難易度が高い、という点です。
そこ?!と思われるかもしれませんが、正直これが一番のデメリットであり、これさえ乗り越えることができれば、何のデメリットも感じない非常に便利なツールに変わります。
なので、最初はとっつきにくいかもしれませんが、諦めずに頑張って理解して使いこなせるようになっていきましょう♪
次の記事へ
コメント