広告

【プログラミング入門】【VBA】12日目 配列の使い方

2022.10.10更新

ExcelVBAでプログラミング入門のタイトル画像になります

お仕事などでお馴染みの表計算ソフト、エクセルに付属している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■


'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

■実行結果■

VBAにおける配列の使い方の説明画像1

■説明■

まずは配列を使いますよ!と宣言をします。


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)

のように宣言した範囲の外の関係のない番号を見ようとしたり、書き換えようとした場合は

VBAにおける配列の使い方の説明画像2

このようなエラーメッセージがでます。

ExcelVBAの場合はキチンとエラーが出てプログラムが途中で止まってくれますが、プログラミング技術的にあまりよくないエラーなので注意しましょう。

上手に使ってみよう!

駆け足で説明してしまいましたが、やはり習うより慣れろ!なので配列をどんどん使っていきましょう!

配列にする事によってさきほどの「添え字」を変数にする事ができます。

プログラム1をもっと簡単に書いてみましょう!

■12日目 プログラム2■


'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

■実行結果■

VBAにおける配列の使い方の説明画像3

■説明■

配列と「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■


'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

■実行結果■

VBAにおける配列の使い方の説明画像4

■説明■

目的のデータに到達するまで「Do While」命令で繰り返し配列内を調べるプログラムです。


Do While hairetu(suji) <> 0

「hairetu(suji)」の内容が「0」ではない間繰り返しを続けます。

目的のデータがない時に無限ループにならないように


If suji = 11
	Exit Do
End If

配列の限界点で「Exit Do」命令を入れておくのもポイントです。

文章の場合

■12日目 プログラム4■


'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

■実行結果■

VBAにおける配列の使い方の説明画像5

■説明■

もちろん文章も同じように配列に入れる事ができます。

「"」で囲む事に注意です。

大量の配列

例えば「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■


'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

■実行結果■

VBAにおける配列の使い方の説明画像6

■説明■

大量の配列を使いたい時は


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■


'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

■実行結果■

VBAにおける配列の使い方の説明画像7

■説明■

配列のそれぞれの要素に配列を保存することによって2次元のデータを扱う方法です。

今回は商品名を表す配列、値段を表す配列を別々に作ってそれを一つの配列にまとめる事によって商品一覧表のような配列を作ってみました。

図で表すとこんな感じになります。

VBAにおける配列の使い方の説明画像8

添え字も

「1行目1列」→「hairetu(1)(1)」・・・りんご

「1行目2列」→「hairetu(1)(2)」・・・みかん

「2行目3列」→「hairetu(2)(3)」・・・90

のようになります。

表とプログラムを見比べてどこに何が入るのかをゆっくり確認してみてください。

「For」命令を使って今のプログラムを一気に表示してみましょう。

■12日目 プログラム7■


'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

■実行結果■

VBAにおける配列の使い方の説明画像9

■説明■

「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次元配列を作る

次は最初から2次元配列を作る方法でExcelVBAにおいて2次元配列と言いますと正確にはこちらの事を言います。

さきほどの「配列の配列」とは少し異なりますのでご注意ください。

それではやってみます。

■12日目 プログラム8■


'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

■実行結果■

VBAにおける2次元配列の使い方の説明画像1

■説明■

さきほどのプログラムを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次元配列はエクセルと連携する事によってパワーをはっきします!

まずはこちらの表をご覧ください。

VBAにおける2次元配列の使い方の説明画像2

今からこちらの表のデータを一気に取り込み別のシートへと書き込みたいと思います。

■12日目 プログラム9■


'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」

VBAにおける2次元配列の使い方の説明画像3

「sheet2」

VBAにおける2次元配列の使い方の説明画像4

■説明■

「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 配列」などのキーワードでインターネット検索してみてください!

次回は事務処理などに便利な文章を扱う命令をいくつかご紹介したいと思います。

次回

13日目 文字列の操作(文字数、比較、抜き取り、結合、置換)

広告

Copyright 2016 K.N/petitetech.com