はじめに…
このページは「ExcelVBA教室」です。
Excelを使っていると、「こんなことができたらいいのに…」と思う場面に出くわすことはありませんか?
私もExcelを使っていて、どうしても複数の条件分けをしたかったのですが、関数ではできないことが分かったため、VBAの学習をはじめました。(ただ、その当時関数でやろうとしていた複数条件分けができなかったと思っていただけで、今考えると関数でもできることだったかもしれませんが…)
というわけで、私のVBAに関する知識はけっこう浅くって、いつもうまくいかなくては悩み、試行錯誤の末どうにかなってしまう程度ですので、本当は教室など開けないのかもしれません。
それでも、入門編として楽しんでいただければと思い、特に学校で役立ちそうなプログラムを紹介したいと考えています。
先生方でExcelVBAって何?という疑問もおありかと思いますので、その辺から私の知識の範囲でお話できればと考えています。
ExcelVBAって何?
ExcelVBAというのはExcelに標準で搭載されているもので、Excelを使ったことがある方なら「マクロ」と言った方がそう言えばどっかにそんなボタンがあったなと分かりやすいかもしれません。ExcelVBAというのは「Excel・ビジュアルベーシック・フォー・アプリケーション」の略なのです。つまり、Excelというアプリケーションのためのビジュアルベーシックというわけです。マイクロソフトはこれをExcelだけでなくWordやAccsess、PowerPointにも搭載しています。搭載していますということは、本体がなければ動かないということで、ExcelVBAもExcelがインストールされていなければ動きません。その点がオリジナルのVB(ビジュアルベーシック)と違う点です。
さて、小難しい話はさておいて、やっぱり面白いのが一番。さっそくVBAを体験してみましょう。
もくじ
第1回「メッセージ」を表示してみよう。
第2回「ユーザーフォーム」を使ってみよう。
第3回「テキストボックス」を使ってみよう。
第4回「重複データの削除」に挑戦
第5回「コンボボックス」を使ってみよう。
第6回「変数を使った繰り返し構文」
ご質問・ご要望など、メッセージをお気軽に下のフォームにご記入いただき、送信ボタンでお送りください。管理者はあまり詳しくありませんが、お答えできる範囲でお答えいたします。
また、ここで紹介しているコードにつきましては、細心の注意を払ってはいますが、運用上いかなる損害が起きても責任を負わないものとします。
商用利用もご遠慮ください。
第1回「メッセージ」を表示してみよう。2002/2/18
@まずはじめにエクセルのメニューバーからVisual
Basic Editer(ビジュアルベーシックエディター)を起動します。
下の画像を参考にやってみてください。
A意味はわからなくてもいいので、続いて「標準モジュール」を挿入します。簡単に言うと記述用紙です。
Bすると、次のように「プロジェクト」に「標準モジュール」が追加されます。
右側のマウスポインタがある白い部分に「コード」を記述します。 それを「コーディング」と言います。
Cそこへ次のように記述します。別に日本語の部分の言葉は違う言葉でもOK!
☆面倒な方は、下の黒文字の部分をコピーして貼り付けてください。
Sub メッセージの表示()
'変数の宣言
Dim mymsg As String
mymsg = MsgBox("好きな言葉は「おちゃめ」",
vbQuestion + vbYesNo, "「はい」か「いいえ」をえらんでね!")
If mymsg = vbYes Then
mymsg = MsgBox("やっぱりそうだよね",
vbOKOnly + vbInformation, "あなたもそうなんだ!")
Else
mymsg = MsgBox("残念だなー…",
vbOKOnly + vbInformation, "えー違うの?!")
End If
End Sub
D次にエクセルに戻りボタンを作りたいと思います。このボタンに上で作ったマクロを登録します。
下の図のように「表示」「ツールバー」「フォーム」とたどってください。
E「フォーム」ツールバーの「ボタン」をクリックして、「Sheet」上で適当な大きさに図形を挿入するようにドラッグしてください。
Fすると、次のように「ボタン1」ができ、「マクロの登録」ボックスが自動で開きます。
G次に「メッセージの表示」を選んで、「OK」ボタンをクリックします。
Hすると、ワークシート上に「ボタン1」だけが残ります。
このボタンをクリックし、バックスペースキーなどで文字を消すと、言葉を変えることができます。
ここでは「メッセージ」と入力してみました。
I最後にどこか適当なセルをクリックすると「ボタン」が設置できます。
このボタンは図形などと同じ扱いなので好きな大きさ、場所に移動できます。
Jこのメッセージボタンにマウスを合わせると、標準では手の形になり、
クリックするとメッセージが表示されます。
どうです?できましたか?
あとはいろいろ日本語の言葉を入れ替えて遊んでみましょう。
そうすると、何がどう動いているのかなんとなく分かってきます。
今回はメッセージを条件分けで表示させるようにしています。
If mymsg = vbYes Then
mymsg = MsgBox("やっぱりそうだよね",
vbOKOnly + vbInformation, "あなたもそうなんだ!")
Else
mymsg = MsgBox("残念だなー…",
vbOKOnly + vbInformation, "えー違うの?!")
End If
これは、もし(If)最初のメッセージで「はい」をえらんだら(mymsg
= vbYes)その時は(Then)どうする、
それ以外(Else)ならどうするという意味です。
これを、別のものに変えると、別の動きになります。
次回はそれを解説していきたいと思いますのでお楽しみに!
第2回「ユーザーフォーム」を使ってみよう。
さて、VBAの得意なものと言えば、フォームです。マクロの記録では決してできないので
とっても魅力がありますよね。
でも、何をどうして良いのやら…
やっぱりプロパティのことを知らないと良くわからない。でも横文字ばっかり。
私も詳しいとは言い切れませんが、とりあえずユーザーフォームのCaptionプロパティについて
解説してみたいと思います。
ユーザーフォームを挿入するには、下図を参照してください。
「挿入」→「ユーザーフォーム」をクリックすると、下図のようにUserForm1が表示されます。
UserFom1となっているところには、通常何か文字が入っていますよね。
そこを変えると自分のフォームらしくなりますよ。やってみましょう。
変えるには、下図を見てください。
プロパティのウインドウ(表示されていない場合は「表示」→「プロパティウインドウ」で表示できます)を見ると、
「Caption」という文字が見つかります。その右側の欄をクリックして「UserForm1」となっているところを
別の言葉に書き換えてみましょう。ここでは「テストフォーム」と入力してみました。
すると、「UserForm1」となっていたのが、「テストフォーム」と変更されているのが分かります。
このように「Caption」プロパティを変更することでフォームに表示する文字を変えることができます。
でもこれだけでは何も無いフォームなので、ボタンをひとつつけてみたいと思います。
ボタンを設置するには、「ツールボックス」の中から好みのボタンをフォームにドラッグすることで
設置できます。ここでは「コマンドボタン」をドラッグしてみます。
すると、下図のように図形を扱うのと同じようにボタンが張り付きました。
フォームと同じように「Caption」フロパティを変更し「戻る」としてみます。
でも、これだけではこのボタンにどのような機能を持たせるかという設定がしていません。
それをコーディングしていきましょう。
コマンドボタンをダブルクリックします。すると下図のようになります。
「Private Sub CommandButton1_Click()」というのは、
「コマンドボタンをクリックした時」という意味です。
「End Sub」はコードの終わりの意味です。
この間にプログラムを記述します。
下図のように記述してみましょう。
「Unload UserForm1」というのは、簡単に言えば「×」ボタンと同じ意味です。
次に「標準モジュール」を挿入します。
そして、以下のようにコーディングします。
この意味は、「ユーザーフォーム1を表示」です。「Show」の部分が表示命令になります。
ここまでできたら、いったんシートに戻ります。戻るには
エクセルのマークをクリックします。
続いて、「表示」→「ツールバー」→「フォーム」をクリックします。
「ボタン」をクリックし、
シート上で図を挿入する要領で四角にドラッグします。
すると、「マクロの登録」が表示されます。
「ユーザーフォームの表示」をクリックし「OK」をクリックします。
これで終わりです。
シート上のボタンをクリックすると、「テストフォーム」が表示され、
「戻る」ボタンをクリックすると、「テストフォーム」が消えます。
これで、ユーザーフォームの表示と消すことはできました。
第1回との応用をするとすれば、フォームに設置したコマンドボタンのコーディングに
ひと工夫することです。
このようにすると、「戻る」ボタンをクリックしたときにメッセージが表示され、
間違ってクリックしてしまった場合の対応ができます。
第3回「テキストボックス」を使ってみよう。
それでは、第2回で作ったテストフォームにテキストボックスを設置して、そこに入力した値を
A列のセルに次々に入力していく方法について見てみましょう。
下の図を見てください。テキストボックスをツールボックスから設置します。
やり方は、コマンドボタンの時と同じです。
つづけて、入力用に「Commandbutton2」を設置します。
最初に設置したボタンよりも文字が大きく、太字で、バックの色も赤に変えてあります。
このように変更するには「Font」プロパティーと「BackColor」プロパティーを変更します。
「Caption」プロパティーを変えた時に使ったプロパティウインドウで
「Font」と「BackColor」をそれぞれクリックすると変更できます。
そして、この「Commandbutton2」をダブルクリックして、コードの入力に移ります。
続いて下の図のように入力してください。
Range(”A65536)はA列の一番下のセル番地の意味で、
.End(xlUp)は入力してあるセルの一番下へ上がるという意味、
.Offset(1)は一つ下のセルへ移動するという意味、
.Selectは選ぶという意味になります。
このコードを使うと常に新しいセルにテキストボックスに入力した文字を代入することが
できます。
どうです?A列にどんどん文字が入力できるでしょ!
さて、次回は重複データの削除について解説していこうと思っています。
お楽しみに!
第3回で新しいセルに文字を代入する方法を紹介しましたが、このままだと重複データが
気付かずにいくつも入力されてしまっている場合があります。
そこで、データを入力する際にすでに同じデータがあるかどうか、既存のデータを探し、
あれば削除するコードです。
上のコードでは、いったんデータを並べ替えて重複データを全て削除するようになっています。
ですから、既存のデータが複数ある場合でも削除することができます。
適当に入力しても並べ替えられますので、名簿作りに適しています。
さて、このユーザーフォームをもう少し使いやすくしてみましょう。
連続してデータを入力したい場合もありますよね。
するとこのままでは、テキストボックスにデータが残っています。
そこで、次のコードを続けることでテキストボックスの内容をクリアできます。
そして、フォーカスを動かしてテキストボックスに戻すには次のコードを使います。
全部を入れると、下のようになります。
どうですか、テキストボックスに文字を入力して「入力」ボタンをクリックすると、
テキストボックスがクリアされ、フォーカスが移動し、連続入力ができるようになりましたね。
もっと効率の良いコードもあると思うので、いろいろ試してください。
さて、次回は「コンボボックスを使ってみよう」です。コンボボックスは、テキストを入力することも
できますし、リストから選ぶこともできる便利なツールです。これを使うと一度入力したデータを
リストから選択するようにすることもできます。ご期待ください!
第5回「コンボボックス」を使ってみよう。
お待たせしました。今回はコンボボックスに挑戦です。
前回までに作ったフォームに追加していきましょう。
上の図のように、ツールボックスのコンボボックスをクリックし、
テストフォームに貼り付けます。入力ボタンは横によけておきましょう。
次にこのコンボボックスのリストの場所を指定します。
プロパティーのRowSourceをクリックし、
A1:A20と入力します。
これはA1のセルからA20のセルの内容をリストにするという意味です。
次にコマンドボタンをもうひとつ設置しましょう。
やり方は前回と同じ。
コマンドボタン3となります。
上のようにするには、
プロパティーのCaptionを「追加」にして、
BackColorを変更して、
Fontも大きくして、
ForColorも変更すると、できます。
それではこの「追加」ボタンのコードを入力しましょう。
上のコードを説明します。
まず、変数の宣言をします。
ここではメッセージの変数を設定しています。
次にメッセージに表示する言葉を変数に代入します。
そして、今回の「追加」ボタンのメインコードを記述します。
注目して欲しいのは、「MatchFound」です。これは、「同じものを探す」という意味です。
前回のように並べ替えをしない場合は、これを使うと良いでしょう。
IF構文で条件わけし、もし同じものが見つからなかったら、リストの一番下に追加し、
追加したことをメッセージに表示します。
もし同じものが見つかった場合は、リストに既にある旨、メッセージで表示します。
今回は、コンボボックス1のプロパティのRowSourceをA1:A20としているので、
リスト数は20までとなります。
改良するとすれば、プロパティーを設定せず、
B1のセルにCount関数でリスト数を数えて、
それを変数mykに代入し、
コードで
Combobox1.RowSource= "A1:A" & myk
と記述しします。
下のコードを参照してください。
すると、追加されたリストまで表示するコンボボックスになります。
どうです?できましたか?
テキストボックスと違い、リストから入力できるのがコンボボックスの魅力。
あとは、どのセルにコンボボックスの値を代入するのかをしていしてやればOKです。
第6回「変数を使った繰り返し構文」
さて、今回はコーディングのコツみたいなものをご紹介しましょう。
私自身、繰り返し構文自体は知っていたのですが、それをうまく使いこなせないでいました。
特にコンボボックスを複数設置していて、その値をセルに代入するという操作をさせるのに、
コンボボックス名を変数で扱えることを知らなかったためにとても長いコードを組んでいたのです。
今回はそんな例を紹介します。
@ユーザーフォームにコンボボックス(テキストボックスでも同じです)を10個作ってみてください。
そして、コマンドボタンを一つ作ってください。
そのコマンドボタンをクリックすると10個のコンボボックスの値をセルに代入させるという仕組みを
作ってみたいと思います。ここでは「すべて入力」ボタンとしました。
繰り返し構文を使わないでコーディングすると、下のようになります。
このように同じようなコードを10個並べることになります。
10個ぐらいならいいのですが、これが20個・30個となると
変更するのも大変になります。
そこで、変数と繰り返し構文を使って、同じことができるコードが
下の図です。
変数を二つ用意します。(myiとmyc)
mycは繰り返し構文のカウント用に使います。
myiは今回は行番号とコンボボックス名の変数として使います。
行番号とコンボボックス名が違う数値にしなければならない時は、
例えば、
Cells(myi + 1).value = Controls("ComboBox"
& myi).Value
のようになります。
コンボボックス名で変数を使うには、
Controls("ComboBox" & 変数)
になります。
テキストボックス名で変数を使うには、
Controls("TextBox" & 変数)
になります。
変数myiは繰り返し構文の中で
myi = myi + 1
となっています。
算数ではこんなことはありえませんが、
ここで使われている「=」は「代入する」という意味です。
ですから、「myi」に1ずつ足していくということになります。
今回はユーザーフォームが一つしかないので省略していますが、
複数のユーザーフォームがある場合は、
必ず、明示的に以下のようにしておく必要があります。
UserForm1.Controls("ComboBox"
& 変数)
このようにしておかないと、どのフォームのコンボボックスのことか
コンピュータが判別できません。
いかがですか、この変数と繰り返し構文を使って、コードを単純化し
変更しやすくしておけば、
例えばあとから10個コンボボックスを追加した場合、
最初の例だと追加した分だけ
Cells(行,列).Value = Combobox名.value
が必要になりますが、
変数と繰り返し構文を使った場合、
For myc = 1 To 10
を
For myc = 1 To 20
と変更するだけですみます。
それでは、次回をお楽しみに…!
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します。すべての内容は日本の著作権法及び国際条約によって保護を受けています。
Copyright 2001-2012 H'sFactory. All rights reserved. Never reproduce or
republicate without written permission.