広告
お仕事などでお馴染みの表計算ソフト、エクセルに付属しているExcelVBA(エクセルブイビーエー)というプログラミング言語を使って初心者・入門者向けにプログラミングのキホンを解説していきます!
ExcelVBAができるようになれば業務内容によってはボタン一つで大幅な業務効率化ができる他に、普段のエクセルの使い方も段違いにレベルアップする事ができます!
ベテランの方も新人さんも興味のある方はぜひ挑戦してみてください!
(1)上から順番に
(2)条件で分かれ道
(3)繰り返し
3つの基本的なプログラムの仕組みは学びました。次にそれを使いこなす上で便利な機能「配列(はいれつ)」を紹介します。
今までは簡単なプログラムばかりだったので、変数も1つか2つぐらいしか使いませんでした。
でも変数が100個や200個に増えた時に全て別々に名前を付けて、宣言して、値を入れてなど考えると、けっこう大変ですよね!
そんな時に使うのが「配列」です!
今まで学んだ事だとたくさんの変数を使いたい時は
Sub test() Dim suji1 As Integer Dim suji2 As Integer Dim suji3 As Integer Dim suji4 As Integer Dim suji5 As Integer End Sub
のように変数をひとつひとつ用意するだけでした。
しかしこの方法だと人間の目からは「suji」グループの変数が5個あるように見えていてもコンピューターからは別々の名前の変数が5個あるとしか見えていないので一気に変数を処理したりする事ができません。
そこで配列というワザを使ってコンピューターにもわかるように同じグループの変数ですよと教えてあげます。
'12日目 プログラム1 Sub test() Dim suji() As Variant suji = Array(2,4,1,0,3) Worksheets("sheet1").Cells(1,1).Value = "suji(0) = " & suji(0) Worksheets("sheet1").Cells(2,1).Value = "suji(1) = " & suji(1) Worksheets("sheet1").Cells(3,1).Value = "suji(2) = " & suji(2) Worksheets("sheet1").Cells(4,1).Value = "suji(3) = " & suji(3) Worksheets("sheet1").Cells(5,1).Value = "suji(4) = " & suji(4) End Sub
まずは配列を使いますよ!と宣言をします。
Dim suji() As Variant ↓ Dim 配列の名前() As Variant
これで「suji」という名前の配列を使います!という意味になります。
名前の後に()カッコがつくトコロがポイントです。
変数の型は数値でも文字でも使える「Variant」型を使います。
整数型「Integer」も使えますが、配列用の命令の多くが「Variant」型にしか対応してないので「Variant」型を使います。
そして「Array(アレイ)」命令を使って内容を入れていきます。
suji = Array(2,4,1,0,3)
今回は「2,4,1,0,3」という5つの値を入れてみました。
これで「suji」という名前の配列変数が5個使えるようになります。
内容が決まってない時は
suji = Array(0,0,0,0,0)
「0」でも入れておきましょう。
そして使う時は
suji(0)
このように()カッコの中に使いたい順番の番号を書くだけです。
suji = Array(0番目,1番目,2番目・・・)
一番最初は「0番目」から始まりますので注意です。
この番号の事を添え字(そえじ)といいます。
途中で一つだけ内容を変更したい場合は
suji(2) = 152
のようにします。
複数の内容を変更したい場合は「Array」命令を使って
suji = Array(100,200,300,400,500)
のようにします。
ちなみに今のプログラムでは「suji(0)~suji(4)」までが使える範囲になるワケですが、
Worksheets("sheet1").Cells(6,1).Value = "suji(5) = " & suji(5)
のように宣言した範囲の外の関係のない番号を見ようとしたり、書き換えようとした場合は
このようなエラーメッセージがでます。
ExcelVBAの場合はキチンとエラーが出てプログラムが途中で止まってくれますが、プログラミング技術的にあまりよくないエラーなので注意しましょう。
駆け足で説明してしまいましたが、やはり習うより慣れろ!なので配列をどんどん使っていきましょう!
配列にする事によってさきほどの「添え字」を変数にする事ができます。
プログラム1をもっと簡単に書いてみましょう!
'12日目 プログラム2 Option Base 1 Sub test() Dim suji() As Variant Dim count As Integer suji = Array(2,4,1,0,3) For count = 1 To 5 Worksheets("sheet1").Cells(count,1).Value = "suji(" & count & ") = " & suji(count) Next End Sub
配列と「For」命令のよく使われるカタチです!
Option Base 1
まずこちらの命令は配列の添え字の始まりを「1」番目からにしてくれる命令になります。
これを使えばセルの番号と添え字の番号を合わせる事ができます。
そして繰り返し「For」命令の出番です。
For count = 1 To 5 Worksheets("sheet1").Cells(count,1).Value = "suji(" & count & ") = " & suji(count) Next
添え字に変数を使って一気に配列の内容を表示してます!
こうすれば100個、200個あるたくさんのデータも一気に処理することができますね!
「Do While」命令を使った例も見てみましょう。
'12日目 プログラム3 Option Base 1 Sub test() Dim hairetu() As Variant Dim suji As Integer hairetu = Array(2,5,1,8,3,0,7,6,9,4) suji = 1 Do While hairetu(suji) <> 0 Worksheets("sheet1").Cells(suji,1).Value = "hairetu(" & suji & ") = " & hairetu(suji) suji = suji + 1 If suji = 11 Then Exit Do End If Loop End Sub
目的のデータに到達するまで「Do While」命令で繰り返し配列内を調べるプログラムです。
Do While hairetu(suji) <> 0
「hairetu(suji)」の内容が「0」ではない間繰り返しを続けます。
目的のデータがない時に無限ループにならないように
If suji = 11 Exit Do End If
配列の限界点で「Exit Do」命令を入れておくのもポイントです。
'12日目 プログラム4 Option Base 1 Sub test() Dim hairetu() As Variant Dim suji As Integer hairetu = Array("りんご","みかん","ばなな","キウイ","マンゴー") For suji = 1 To 5 Worksheets("sheet1").Cells(suji,1).Value = "hairetu(" & suji & ") = " & hairetu(suji) Next End Sub
もちろん文章も同じように配列に入れる事ができます。
「"」で囲む事に注意です。
例えば「100」個以上の大量の配列を使いたい時などに今のやり方のように
Dim hairetu() As Variant hairetu = Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...0,0,0,0,0,0,0,0)
のように延々と初期化していくのはあまり現実的ではありませんよね。
そんな時は次のように宣言、初期化する事もできます。
'12日目 プログラム5 Sub test() Dim hairetu(1 To 100) As Variant Dim count As Integer For count = 1 To 100 hairetu(count) = count Next MsgBox "hairetu(1) = " & hairetu(1) MsgBox "hairetu(50) = " & hairetu(50) MsgBox "hairetu(100) = " & hairetu(100) End Sub
大量の配列を使いたい時は
Dim 配列の名前(配列の最初 To 配列の最後) As Variant ↓ Dim hairetu(1 To 100) As Variant
のように宣言する事もできます。
これで「hairetu(1)~hairetu(100)」までを宣言した事になります。
そして「For」命令を使って一気に値を入れて初期化をしております。
ちなみに「ExcelVBA」の場合はこの「For」命令などで初期化をしなくても「As Integer」の場合は「0」が「As String またはAs Variant」の場合は空白が勝手に初期値としては入るので初期化の必要がないっちゃあないのですが、他の言語系では値が入っておらず警告される場合もあるので広くプログラミングを知るという意味ではこのような初期化の仕方も知っておいて良いと思います。
広告
続けてちょっと配列をパワーアップさせてエクセルでお馴染みの縦・横にデータがある「表」のデータを一気に扱う方法をご紹介します!
ExcelVBAでは「表」などの二次元のデータを扱うのに大まかに2種類の方法があります。
少し扱い方が異なるのでご注意ください。
では説明するよりまずはやってみます。
'12日目 プログラム6 Option Base 1 Sub test() Dim hairetu1() As Variant Dim hairetu2() As Variant Dim syouhin() As Variant hairetu1 = Array("りんご","みかん","ばなな","キウイ","マンゴー") hairetu2 = Array(100,120,90,200,300) syouhin = Array(hairetu1,hairetu2) Worksheets("sheet1").Cells(1,1).Value = _ "syouhin(1)(1) = " & syouhin(1)(1) Worksheets("sheet1").Cells(2,1).Value = _ "syouhin(2)(1) = " & syouhin(2)(1) Worksheets("sheet1").Cells(3,1).Value = _ "syouhin(1)(4) = " & syouhin(1)(4) Worksheets("sheet1").Cells(4,1).Value = _ "syouhin(2)(4) = " & syouhin(2)(4) End Sub
配列のそれぞれの要素に配列を保存することによって2次元のデータを扱う方法です。
今回は商品名を表す配列、値段を表す配列を別々に作ってそれを一つの配列にまとめる事によって商品一覧表のような配列を作ってみました。
図で表すとこんな感じになります。
添え字も
「1行目1列」→「hairetu(1)(1)」・・・りんご
「1行目2列」→「hairetu(1)(2)」・・・みかん
「2行目3列」→「hairetu(2)(3)」・・・90
のようになります。
表とプログラムを見比べてどこに何が入るのかをゆっくり確認してみてください。
「For」命令を使って今のプログラムを一気に表示してみましょう。
'12日目 プログラム7 Option Base 1 Sub test() Dim hairetu1() As Variant Dim hairetu2() As Variant Dim syouhin() As Variant Dim count1 As Integer Dim count2 As Integer hairetu1 = Array("りんご","みかん","ばなな","キウイ","マンゴー") hairetu2 = Array(100,120,90,200,300) syouhin = Array(hairetu1,hairetu2) For count1 = 1 To 2 For count2 = 1 To 5 Worksheets("sheet1").Cells(count1,count2).Value = syouhin(count1)(count2) Next Next End Sub
「12日目 プログラム6」のデータを「For」命令で一気に表示してみました。
2次元のデータを扱う時は「2重の「For」命令」を使うと便利です。
少し慣れないとややこしいかもしれません。
イメージとしては
1・外側のループで初期化だけしてそのまま内側のループに入る
For count1 = 1 To 2 Next
こちらが外側のループですね。
「count1」の初期化だけしてそのまま内側のループに入ります。
2・内側のループを進める
For count2 = 1 To 5 Worksheets("sheet1").Cells(count1,count2).Value = syouhin(count1)(count2) Next
こちらが内側のループですね。
syouhin(1)(1)→syouhin(1)(2)→syouhin(1)(3)・・・、と内側のループを進めます。
3・内側のループが終わったら外側のループへ
内側のループが終わったら外側のループへ戻ります。
4・外側のループを一つ進めて再び内側のループへ
外側のループを一つ進めて「syouhin(2)(5)」にして内側のループへと入ります。
あとはsyouhin(2)(1)→syouhin(2)(2)→syouhin(2)(3)・・・、と進めるだけですね。
一つ一つ紙に書きながら追っていくとわかりやすいかもしれません。
次は最初から2次元配列を作る方法でExcelVBAにおいて2次元配列と言いますと正確にはこちらの事を言います。
さきほどの「配列の配列」とは少し異なりますのでご注意ください。
それではやってみます。
'12日目 プログラム8 Option Base 1 Sub test() Dim hairetu(2,5) As Variant Dim count1 As Integer Dim count2 As Integer hairetu(1,1) = "りんご" hairetu(1,2) = "みかん" hairetu(1,3) = "ばなな" hairetu(1,4) = "キウイ" hairetu(1,5) = "マンゴー" hairetu(2,1) = 100 hairetu(2,2) = 120 hairetu(2,3) = 90 hairetu(2,4) = 200 hairetu(2,5) = 300 For count1 = 1 To 2 For count2 = 1 To 5 Worksheets("sheet1").Cells(count1,count2).Value = hairetu(count1,count2) Next Next End Sub
さきほどのプログラムを2次元配列で書き換えてみました。
変数名(行の数,列の数)で2次元配列を作る事ができます。
なんか値の入力とかがちょっとめんどくさい感じですよね。
ちなみに普通の配列でも
Dim suji(5) As Variant suji(1) = 2 suji(2) = 4 suji(3) = 1 suji(4) = 0 suji(5) = 3
のように最初に配列の数を決めて一つ一つ初期化する事ができます。(最初に配列の数を決める場合は「Array」命令は使えないので、値を入れる時は一つ一つ入れるか「For」命令などを使って一気に入れます)
この2次元配列はエクセルと連携する事によってパワーをはっきします!
まずはこちらの表をご覧ください。
今からこちらの表のデータを一気に取り込み別のシートへと書き込みたいと思います。
'12日目 プログラム9 Option Base 1 Sub test() Dim syouhin As Variant syouhin = WorksheetFunction.Transpose(Worksheets("sheet1").Range("A1:B10")) Worksheets("sheet1").Cells(1,3) = "syouhin(1,1) = " & syouhin(1,1) Worksheets("sheet1").Cells(2,3) = "syouhin(1,2) = " & syouhin(1,2) Worksheets("sheet1").Cells(3,3) = "syouhin(1,3) = " & syouhin(1,3) Worksheets("sheet2").Range("A1:B10") = WorksheetFunction.Transpose(syouhin) End Sub
「sheet1」
「sheet2」
「sheet1」のデータを2次元配列に保存「sheet2」に表示してみました。(いわゆるコピペとは違うので値のみになります)
少し難しい事をしているのでそのままカタチで覚えてください。
まずは変数の宣言です。
Dim syouhin As Variant
変数の宣言部分は「Variant」にするだけで特に名前の後の()カッコや配列の数など入れなくても大丈夫です。
続いて初期化です。
syouhin = WorksheetFunction.Transpose(Worksheets("sheet1").Range("A1:B10"))
「Range」命令を使ってワークシートの範囲を指定、その範囲をまるごと変数に保存する事ができます。
Worksheets("sheet1").Range("A1:B10")
この部分ですね。
実はこの部分だけでも範囲の保存はできます。
syouhin = Worksheets("sheet1").Range("A1:B10")
ただこの保存の仕方だと「行」と「列」が逆に保存されてしまい使いにくくなるのでそれを防ぐために
WorksheetFunction.Transpose
こちらの命令を使って「行」と「列」を入れ替えてあげます。
これで表がまるごと変数に保存されるのでまとめて計算するなり、値を書き換えるなりできるようになります。
あとは先ほどと逆の手順でエクセルシートにまとめて書き込む事ができます。
Worksheets("sheet2").Range("A1:B10") = WorksheetFunction.Transpose(syouhin)
今回はわかりやすいように別のシートに書き込んでおりますが、もちろん元の場所に上書きもできます。(前の内容は消えてしまうのでご注意ください)
以上ExcelVBAの配列について簡単に紹介させて頂きましたが、配列を扱う機能は他にもさまざまなものがあります。
今回は初心者向け講座なのでこれ以上は割愛させて頂きますので興味ある方は「vba 配列」などのキーワードでインターネット検索してみてください!
次回は事務処理などに便利な文章を扱う命令をいくつかご紹介したいと思います。
広告
Copyright 2016 K.N/petitetech.com