広告
お仕事などでお馴染みの表計算ソフト、エクセルに付属しているExcelVBA(エクセルブイビーエー)というプログラミング言語を使って初心者・入門者向けにプログラミングのキホンを解説していきます!
ExcelVBAができるようになれば業務内容によってはボタン一つで大幅な業務効率化ができる他に、普段のエクセルの使い方も段違いにレベルアップする事ができます!
ベテランの方も新人さんも興味のある方はぜひ挑戦してみてください!
いよいよ14日です!今回は関数について見ていきます!
「MsgBox」命令や「If」命令みたいな「命令」の事を正しくは関数といいます!というのを覚えてますでしょうか?
エクセルの関数と混同しないように「命令」の方が覚えやすいと思い今まで呼んできましたが今回から関数について学び始めますので正しく関数と呼びたいと思います。
このExcelVBA入門で学んでいるような関数の事をvba関数とかって言ったりします。
vba関数に対して、通常のエクセル上で使う関数はワークシート関数などと言って呼び分けております。
そしてこのvba関数を組み合わせて「自分だけのオリジナル関数」を作れるというワケです。
そうすれば同じ作業の繰り返しなんかを「自分だけのオリジナル関数」にまとめて好きな時に使えてとても便利になります!
そんなワケで今回は関数を自分で作ってみましょう!
ExcelVBAでは自作関数を作るのに「Subプロシージャ」と「Functionプロシージャ」という2種類の方法があります。
今回は使い方がシンプルな「Subプロシージャ」について説明していきます。
なにやら難しそうですが、やる事はさきほども言いましたがvba関数などを組み合わせて、一つにまとめるだけです!
さっそく見てみましょう!
'14日 プログラム1 Sub test() MsgBox "Subプロシージャ「my_hello」は「こんにちは」と表示します!" Call my_hello MsgBox "Subプロシージャ「my_hello」を実行しました!" End Sub Sub my_hello() MsgBox "こんにちは!" End Sub
「こんにちは!」とだけ表示する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 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
四角形の面積を計算するプログラムになります。
実行結果を見ると「test」内で実行された計算はうまくいったのに「menseki」内の計算はうまくいっていないようです。
これはとても大事な事ですが、「Subプロシージャ」の中で宣言された変数は同じ名前でも「Subプロシージャ」ごとに別の変数になります。
このような「Subプロシージャ」の中で宣言された変数の事を「ローカル変数」と言います。
では異なる「Subプロシージャ」の間で変数の情報を共有したい場合にはどうしたらよいのか?という事ですが、これにはいくつか方法があります。
その中のひとつが「グローバル変数」になります。
ここらでするどい方はお気づきかもしれませんが、そうです、「Subプロシージャ」の外で変数を宣言するとその変数はすべての「Subプロシージャ」で使える「グローバル変数」となります。
プログラムで確認してみましょう!
'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
「test」内でも「menseki」内でも同じ結果を出す事ができましたね!
ではグローバル変数とローカル変数で同じ名前の変数を宣言した場合はどうでしょう?
こちらもプログラムで確認してみます。
'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
同じ名前の変数「tate・yoko」をグローバル変数とローカル変数として2か所で宣言してみました。
このような場合もそれぞれの変数はまったく別のものになり、グローバル変数よりもローカル変数の方が優先されます。
繰り返しますが
「グローバル変数」・・・全ての場所で使えます。
「ローカル変数」・・・宣言したSubプロシージャの中でだけ使えます。
そしてグローバル変数とローカル変数が同じ名前だった場合は、そのローカル変数を宣言したSubプロシージャ内ではローカル変数が優先されます。
広告
subプロシージャ「my_sub」の中で宣言した変数「suji」にご注目ください!
'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
Subプロシージャ「my_sub」を2回呼び出してます。変数「suji」は2回とも「101」を表示しました。
プログラムをよく読めばあたりまえの話なのですが、関数「my_sub」を呼び出すたびに「my_sub」内のローカル変数「suji」は宣言されて、初期化されます。
これは言い換えると今回の場合ではSubプロシージャ「my_sub」が終わった時点で「my_sub」内のローカル変数「suji」は一度なくなってしまうという事です。
もうめんどくさいので全てグローバル変数にすればいいじゃん!と思った方、いると思います。
もちろん最初はそれでも良いかと思います。
しかしながら、少しマトモ?なプログラムを組み始めればわかるかと思いますが、変数を甘くみてはいけません。
あまりの変数の多さに絶望します。
早いウチからローカル変数とグローバル変数にきちんと分けるクセをつけておく事をオススメします。
では最後に自作関数を組み合わせてみましょう!
'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
このように関数同志を組み合わせてより複雑な関数を作る事もできます!
いろいろと組み合わせて試してみてください!
これにて「ExcelVBAでプログラミング入門」を終了したいと思います!
最後までお付き合いいただいた方は感謝です!
興味ある方はぜひ応用編である
こちらに挑戦してみてください。
このサイトを通して少しでもプログラミングの楽しさを感じていただけたら幸いです!
広告
Copyright 2016 K.N/petitetech.com