広告

【プログラミング入門】【VBA】14日目(最終日) 関数の使い方

2022.10.10更新

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

お仕事などでお馴染みの表計算ソフト、エクセルに付属しているExcelVBA(エクセルブイビーエー)というプログラミング言語を使って初心者・入門者向けにプログラミングのキホンを解説していきます!

ExcelVBAができるようになれば業務内容によってはボタン一つで大幅な業務効率化ができる他に、普段のエクセルの使い方も段違いにレベルアップする事ができます!

ベテランの方も新人さんも興味のある方はぜひ挑戦してみてください!

関数(かんすう)

いよいよ14日です!今回は関数について見ていきます!

かんすう?

「MsgBox」命令や「If」命令みたいな「命令」の事を正しくは関数といいます!というのを覚えてますでしょうか?

エクセルの関数と混同しないように「命令」の方が覚えやすいと思い今まで呼んできましたが今回から関数について学び始めますので正しく関数と呼びたいと思います。

このExcelVBA入門で学んでいるような関数の事をvba関数とかって言ったりします。

vba関数に対して、通常のエクセル上で使う関数はワークシート関数などと言って呼び分けております。

そしてこのvba関数を組み合わせて「自分だけのオリジナル関数」を作れるというワケです。

そうすれば同じ作業の繰り返しなんかを「自分だけのオリジナル関数」にまとめて好きな時に使えてとても便利になります!

そんなワケで今回は関数を自分で作ってみましょう!

ExcelVBAでは自作関数を作るのに「Subプロシージャ」と「Functionプロシージャ」という2種類の方法があります。

今回は使い方がシンプルな「Subプロシージャ」について説明していきます。

なにやら難しそうですが、やる事はさきほども言いましたがvba関数などを組み合わせて、一つにまとめるだけです!

さっそく見てみましょう!

■14日 プログラム1■


'14日 プログラム1

Sub test()

	MsgBox "Subプロシージャ「my_hello」は「こんにちは」と表示します!"
	
	Call my_hello

	MsgBox "Subプロシージャ「my_hello」を実行しました!"
	
End Sub

Sub my_hello()
	MsgBox "こんにちは!"
End Sub

■実行結果■

VBAにおける関数の基礎「subプロシージャ」の使い方の説明画像1

■説明■

「こんにちは!」とだけ表示するSubプロシージャ「my_hello」を作ってみました。


Sub my_hello()
	MsgBox "こんにちは!"
End Sub

こちらですね!

そういえば「3日目 実行ボタンとプログラムの書き方」にて少し見たような気がしますね。

そうです!

この


Sub Subプロシージャ名()
	
	実行したい関数

End Sub

「Sub ~ End Sub」の間に自分が実行したい関数などをまとめたものが「Subプロシージャ」になります。

「my_hello」というこちらの部分が名前になりますので元からあるvba関数名などとかぶらなければ自分で好きな名前をつけて大丈夫です。

使い方

使う時は


Call my_hello

「Call 使いたい関数名」のように使います。

Callの部分を省略する事もできますが、関数を使います!という事がわかるので書いておいた方が無難です。

一度だけではなく使いたい時にこれを書けば何度でも「my_hello」を実行してくれます。

逆に言うと「Call my_hello」を書かないと永遠に実行されません。

こんなのでいいの?

こんなのでいいの?と思われた方、いると思います。

大丈夫です!

これもりっぱな関数の使い方のひとつです!

もちろんまだ他にも便利な使い方がありますが、今回のプログラム入門では一番キホンの「命令をひとまとめにする」使い方だけを説明させて頂きます。

グローバル変数とローカル変数

変数を宣言する場所によって扱い方が少し異なってきます。

まずはこれまで通りのやり方で変数を宣言して使ってみます。

■14日 プログラム2■


'14日 プログラム2

Sub test()

	Dim tate As Integer
	Dim yoko As Integer

	tate = 10
	yoko = 5

	MsgBox "「test内」縦10×横5の四角形の面積は" & (tate * yoko)

	Call menseki
	
End Sub

Sub menseki()
	MsgBox "「menseki内」縦10×横5の四角形の面積は" & (tate * yoko)
End Sub

■実行結果■

VBAにおける関数の基礎「subプロシージャ」の使い方の説明画像2

■説明■

四角形の面積を計算するプログラムになります。

実行結果を見ると「test」内で実行された計算はうまくいったのに「menseki」内の計算はうまくいっていないようです。

これはとても大事な事ですが、「Subプロシージャ」の中で宣言された変数は同じ名前でも「Subプロシージャ」ごとに別の変数になります。

このような「Subプロシージャ」の中で宣言された変数の事を「ローカル変数」と言います。

では異なる「Subプロシージャ」の間で変数の情報を共有したい場合にはどうしたらよいのか?という事ですが、これにはいくつか方法があります。

その中のひとつが「グローバル変数」になります。

ここらでするどい方はお気づきかもしれませんが、そうです、「Subプロシージャ」の外で変数を宣言するとその変数はすべての「Subプロシージャ」で使える「グローバル変数」となります。

プログラムで確認してみましょう!

■14日 プログラム3■


'14日 プログラム3

Dim tate As Integer
Dim yoko As Integer

Sub test()

	tate = 10
	yoko = 5

	MsgBox "「test内」縦10×横5の四角形の面積は" & (tate * yoko)

	Call menseki
	
End Sub

Sub menseki()
	MsgBox "「menseki内」縦10×横5の四角形の面積は" & (tate * yoko)
End Sub

■実行結果■

VBAにおけるグローバル変数、ローカル変数の使い方の説明画像1

■説明■

「test」内でも「menseki」内でも同じ結果を出す事ができましたね!

同じ名前の変数の場合は?

ではグローバル変数とローカル変数で同じ名前の変数を宣言した場合はどうでしょう?

こちらもプログラムで確認してみます。

■14日 プログラム4■


'14日 プログラム4

Dim tate As Integer
Dim yoko As Integer

Sub test()

	tate = 10
	yoko = 5

	MsgBox "「1回目test内」縦10×横5の四角形の面積は" & (tate * yoko)

	Call menseki

	MsgBox "「2回目test内」縦10×横5の四角形の面積は" & (tate * yoko)
	
End Sub

Sub menseki()
	Dim tate As Integer
	Dim yoko As Integer

	tate = 7
	yoko = 8

	MsgBox "「menseki内」縦7×横8の四角形の面積は" & (tate * yoko)
End Sub

■実行結果■

VBAにおけるグローバル変数、ローカル変数の使い方の説明画像2

■説明■

同じ名前の変数「tate・yoko」をグローバル変数とローカル変数として2か所で宣言してみました。

このような場合もそれぞれの変数はまったく別のものになり、グローバル変数よりもローカル変数の方が優先されます。

繰り返しますが

「グローバル変数」・・・全ての場所で使えます。

「ローカル変数」・・・宣言したSubプロシージャの中でだけ使えます。

そしてグローバル変数とローカル変数が同じ名前だった場合は、そのローカル変数を宣言したSubプロシージャ内ではローカル変数が優先されます。

広告

ローカル変数の注意

subプロシージャ「my_sub」の中で宣言した変数「suji」にご注目ください!

■14日 プログラム5■


'14日 プログラム5

Dim gyou_posi As Integer

Sub test()

	gyou_posi = 1

	Worksheets("sheet1").Cells(gyou_posi,1).value = "「my_subを実行!1回目」"

	gyou_posi = gyou_posi + 1

	Call my_sub

	gyou_posi = gyou_posi + 1

	Worksheets("sheet1").Cells(gyou_posi,1).value = "「my_subを実行!2回目」"

	gyou_posi = gyou_posi + 1

	Call my_sub
	
End Sub

Sub my_sub()
	Dim suji As Integer

	suji = 100
	suji = suji + 1

	Worksheets("sheet1").Cells(gyou_posi,1).value = "suji = " & suji
End Sub

■実行結果■

VBAにおけるグローバル変数、ローカル変数の使い方の説明画像3

■説明■

Subプロシージャ「my_sub」を2回呼び出してます。変数「suji」は2回とも「101」を表示しました。

プログラムをよく読めばあたりまえの話なのですが、関数「my_sub」を呼び出すたびに「my_sub」内のローカル変数「suji」は宣言されて、初期化されます。

これは言い換えると今回の場合ではSubプロシージャ「my_sub」が終わった時点で「my_sub」内のローカル変数「suji」は一度なくなってしまうという事です。

グローバルな変数でいいじゃん!

もうめんどくさいので全てグローバル変数にすればいいじゃん!と思った方、いると思います。

もちろん最初はそれでも良いかと思います。

しかしながら、少しマトモ?なプログラムを組み始めればわかるかと思いますが、変数を甘くみてはいけません。

あまりの変数の多さに絶望します。

早いウチからローカル変数とグローバル変数にきちんと分けるクセをつけておく事をオススメします。

関数を組み合わせる

では最後に自作関数を組み合わせてみましょう!

■14日 プログラム6■


'14日 プログラム6

Sub test()

	Dim suji As Variant

	suji = InputBox("あいさつプログラムです!(1)朝(2)昼(3)晩のどれかを選んでね!")

	Select Case suji
	Case 1
		Call ohayou
	Case 2
		Call konnitiha
	Case 3
		Call konbanha
	Case Else
		MsgBox "全てのCaseに当てはまりません"
	End Select

End Sub

Sub ohayou()
	MsgBox "おはよう!"
End Sub

Sub konnitiha()
	MsgBox "こんにちは!"
End Sub

Sub konbanha()
	MsgBox "こんばんは!"
End Sub

■実行結果■

VBA,関数の組み合わせの説明画像

■説明■

このように関数同志を組み合わせてより複雑な関数を作る事もできます!

いろいろと組み合わせて試してみてください!

お疲れ様です!

これにて「ExcelVBAでプログラミング入門」を終了したいと思います!

最後までお付き合いいただいた方は感謝です!

興味ある方はぜひ応用編である

「ExcelVBAで請求書自動印刷
システム」

こちらに挑戦してみてください。

このサイトを通して少しでもプログラミングの楽しさを感じていただけたら幸いです!

広告

Copyright 2016 K.N/petitetech.com