課題21・31:検索機能について
(表計算処理編5) ==発展課題==
【VBAについて】
ExcelではWord、Access、PowerPoint、FrontPage、Outlookといった他のマイクロソフト社のアプリケーションと同様に、これらのアプリケーションをより高度に利用するための開発言語であるVBA(Visual
Basic for Applications)を利用できます。
ここでは、VBAを用いた簡単なシステムの開発について説明します。
もちろん、ここで説明している内容は本格的なシステムにはほど遠いものではあります。しかし、(
システム開発を仕事にしている人以外の)一般の人々が、
各自の仕事をできるだけ効率よく行うことを目的として
実際に自分たちで作成し、
自分たちの仕事に利用しているシステムを
どのようにしたら開発できるかということを知るための最初のステップくらいには役立つことと思います。
ここに書かれている内容を学習するためには、これだけで数時間かかるものと思われます。
興味を持った生徒は学内に設置されたフロア・パソコンや自宅のパソコンで授業以外の時間も使って、実習してみることをお勧めします。
ほんの少しでも使えるようになってくると、大変難しく感じられたVBAも、非常に便利なものだと感じられるようになると思います。
さぁ、積極的に『チャレンジ』してみましょう。
【メニューの作成】
1.
まず最初にメニューの作成について説明します。
メニューバーから『ツール(T)』・『マクロ(M)』・『Visual Basic Editor(V)』を選択します。
上記の操作をすると画面は次のようになります。
この画面で、『ユーザーフォームの挿入』というボタンを押します。そうすると、次のようなフォームとツールボックスが表示されます。
始めての場合にはUserForm1が表示されますが、新しいフォームを作成する度に順次、UserForm2、UserForm3、UserForm4・・・・というようになります。
2.
この画面からツールボックスのコマンドボタンをクリックします。
マウスポインタをUserform(UserForm1)上で、ドラッグアンドドロップしてボタンを作成します。
3.
これを次のようにコピーして、
張り付けをすることにより、コマンドボタンを追加していきます。
この操作を繰り返して、最終的にはコマンドボタンを6つ作成します。
4.
どのボタンにも『CommandButton1』と表記されていますが、実際のボタンの名前(オブジェクト名といいます)は、それぞれ別の名前が付いています。
一番右下のボタンのオブジェクト名は『CommandButton6』ですが、フォーム上のボタンの説明(captionプロパティといいます)は『CommandButton1』になっているために、現在はこのように見えます。
ここのcaptionプロパティから順次、変更していきましょう。
現在、『CommandButton6』のボタン(正確には『CommandButton6』オブジェクト)が選択されていると思いますが、そうでない場合にも一番右下のボタン上で右クリックして表示されるメニューから『プロパティ(P)』を選択して下さい。
現在、『CommandButton6』オブジェクトの『Caption』プロパティの値は『CommandButton1』になっていますが、ここを『終 了』に変えてみます。
下の画面は変更後のものです。
同様に、左最上段の『CommandButton1』ボタン(正確には『CommandButton1』オブジェクト)から『CommandButton5』ボタン(正確には『CommandButton5』オブジェクト)の『Caption』プロパティの設定を『CommandButton1』からそれぞれの設定に変えましょう。
全て変更した後の画面は次のようになります。
5.
ツールボックスから『ラベル』(ラベル・コントロールといいます)とかかれたボタンを押します。
そして、フォーム上でドラッグ・アンド・ドロップして、このシステムのタイトルを表示する場所を決めます。
後から変更も可能ですから、気楽に設定してかまいません。
ここで右クリックしてプロパティを選択し、『Label』オブジェクトの『Caption』プロパティを『相性診断システム』に変更します。
6.
上の画面で『ラベル』と『ボタン』以外のフォーム上で、右クリックして表示されるメニューから『プロパティ』を選択して下さい。
『BackColor』の色の部分をダブルクリックして表示されるパレットから好きな色を選択し、フォームの背景色を変えてみます。
同様にして『ラベル』、つまりシステム名を表示している部分の背景色も変更してみましょう。
『フォント』もプロパティの『Font』と書かれている欄の右、つまり、フォント名が設定されている欄をダブルクリックして変更することが可能です。
若干説明を省略しましたが、次のような画面になったことと思います。
7.
今度は『終了』ボタン(CommandButton6)をダブルクリックして下さい。
画面上に次のような表示が出ます。但し、Endは書かれていませんので、『Private Sub CommandButton6_Click()』と『End Sub』間に、下の画面のように『End』と記述して下さい。
これだけの記述で、このシステムが起動している場合、この『終了』ボタンを押すだけでシステムが終了するようになります。
【他のフォームも作成してみよう・1】
フォーム内にテキストを入力するための枠を作成したい場合には、『ツールボックス』上の『テキストボックス』のボタン(テキストボックス・コントロール)を押した後に、フォーム上で、その場所を指定すればよいです。
コマンド・ボタンを貼り付けたときと同様に、フォーム上でドラッグ・アンド・ドロップするだけで簡単にテキストボックスを貼り付けることができます。
【他のフォームも作成してみよう・2】
オプション・ボタンを貼り付けるときには、注意しなければならないことが一つあります。
オプション・ボタンを貼り付ける前にフレームボタンを押して、フレーム枠(フレーム・コントロール)を作成しなければなりません。
その後に、オプション・ボタンを貼り付けることにより、フレーム内のオプション・ボタンのうち、一つだけが選択できるようになります。
【他のフォームも作成してみよう・3】
特に追加説明することはありません。
今までの説明に従って、作成して下さい。
【メイン・メニューのコードを書いてみよう】
作成したメニュー画面(UserForm1)のコマンドボタン上でダブルクリックすると該当するボタンに対するプログラムコードが表示されます。
例えば、CommandButton1をダブルクリックすると『Private Sub CommandButton1_Click()』と『End Sub』というコード(以下、プログラムと表記する)が自動的に作成されます。
このプログラムの意味はコマンドボタン1(CommandButton1:ここでは『入力』というボタン)がクリックされたときに『Private Sub CommandButton1_Click()』と『End Sub』で挟まれた部分に書かれている処理をしなさいということになります。
前述のように、ここまでは自動時に作られますが、そのときに行う処理は自分で書かなければなりません。
下の例に従って、自分で『Private Sub CommandButton1_Click()』と『End Sub』の間にプログラムを書いて下さい。
同様にPrivate Sub CommandButton2_Click()』と『End Sub』~Private Sub CommandButton5_Click()』と『End Sub』にプログラム分を書いて下さい。
Private Sub CommandButton6_Click()』と『End Sub』の間の『End』は記述済みです。
以下のプログラム例では、2行になって表示が乱れているところは基本的に1行として理解して下さい。
Private Sub CommandButton1_Click()
UserForm1.Hide
MsgBox "現バージョンでは入力用の画面を作成していません。直接表を編集し、体裁を整えて下さい。", vbOKOnly
Range("A6").Select
Selection.AutoFilter
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
UserForm2.Show
End Sub
Private Sub CommandButton3_Click()
UserForm1.Hide
UserForm3.Show
End Sub
Private Sub CommandButton4_Click()
UserForm1.Hide
UserForm4.Show
End Sub
Private Sub CommandButton5_Click()
MsgBox "自分で何か処理を考えてみましょう。", vbOKOnly
End Sub
Private Sub CommandButton6_Click()
End
End Sub
<<参考>>
MsgBox "現バージョンでは入力用の画面を作成していません。直接表を編集し、体裁を整えて下さい。", vbOKOnly
””内に書かれた文字列をメッセージボックスで表示します。
『vbOKOnly』はデフォルト値なので、省力可能ですが、メッセージボックスに『OK』というボタンを表示します。
この他にも『vbYesNoCancel』という『はい』、『いいえ』、『キャンセル』というボタンをメッセージボックス中に表示する機能など多数あります。
詳細は各自で調べてみましょう。
Range("A6").Select
””内に記述されたセル範囲を選択状態にしなさいという意味です。
Selection.AutoFilter
基本的には、VBAの中でオートフィルタ機能を使うときに使用するコマンドですが、こここではシステムの制御から外れて、表機能を利用する目的で使用しています。
UserForm1.Hide
表示している『UserForm1』というフォームの表示を『非表示』にしなさいという意味です。
UserForm1.Show
『UserForm1』というフォームを『表示』しなさいという意味です。
【サブ・メニューのコードも書いてみよう】
以下のプログラム例では、2行になって表示が乱れているところは基本的に1行として理解して下さい。
UserForm2のコード例
Private Sub CommandButton1_Click()
Dim jyouken1 As String , jyouken2 As String , jyouken3 As String
, jyouken4 As String
GoTo start
'--------------------------------------------------------------------
' サブルーチン
'--------------------------------------------------------------------
zenkoumoku:
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
MsgBox "このバージョンでは、同時に身長と体重を検索条件にできません。"
TextBox1.SetFocus
Range("A6").Select
Selection.AutoFilter
Return
'--------------------------------------------------------------------
shincyou_ika:
jyouken1 = ">=" & TextBox1.Text
jyouken2 = "<=" & TextBox2.Text
' MsgBox "jyouken1 = " & jyouken1 & "jyouken2 = " & jyouken2
Range("A6").Select
Selection.AutoFilter Field:=3, Criteria1:=jyouken2
Return
'--------------------------------------------------------------------
shincyou_ijyou:
jyouken1 = ">=" & TextBox1.Text
jyouken2 = "<=" & TextBox2.Text
' MsgBox "jyouken1 = " & jyouken1 & "jyouken2 = " & jyouken2
Range("A6").Select
Selection.AutoFilter Field:=3, Criteria1:=jyouken1
Return
'--------------------------------------------------------------------
shincyou_ijyouika:
jyouken1 = ">=" & TextBox1.Text
jyouken2 = "<=" & TextBox2.Text
' MsgBox "jyouken1 = " & jyouken1 & "jyouken2 = " & jyouken2
Range("A6").Select
Selection.AutoFilter Field:=3, Criteria1:=jyouken1,
Operator:=xlAnd, Criteria2:=jyouken2
Return
'--------------------------------------------------------------------
taijyuu_ika:
jyouken3 = ">=" & TextBox3.Text
jyouken4 = "<=" & TextBox4.Text
' MsgBox "jyouken3 = " & jyouken3 & "jyouken4 = " & jyouken4
Range("A6").Select
Selection.AutoFilter Field:=4, Criteria1:=jyouken4
Return
'--------------------------------------------------------------------
taijyuu_ijyou:
jyouken3 = ">=" & TextBox3.Text
jyouken4 = "<=" & TextBox4.Text
' MsgBox "jyouken3 = " & jyouken3 & "jyouken4 = " & jyouken4
Range("A6").Select
Selection.AutoFilter Field:=4, Criteria1:=jyouken3
Return
'--------------------------------------------------------------------
taijyuu_ijyouika:
jyouken3 = ">=" & TextBox3.Text
jyouken4 = "<=" & TextBox4.Text
' MsgBox "jyouken3 = " & jyouken3 & "jyouken4 = " & jyouken4
Range("A6").Select
Selection.AutoFilter Field:=4, Criteria1:=jyouken3,
Operator:=xlAnd, Criteria2:=jyouken4
Return
'--------------------------------------------------------------------
start:
If TextBox1.Text <> "" And TextBox2.Text <> "" And TextBox3.Text
<> "" And TextBox4.Text <> "" Then GoSub zenkoumoku
If TextBox1.Text <> "" And TextBox2.Text <> "" And TextBox3.Text
<> "" And TextBox4.Text = "" Then GoSub zenkoumoku
If TextBox1.Text <> "" And TextBox2.Text <> "" And TextBox3.Text
= "" And TextBox4.Text <> "" Then GoSub zenkoumoku
If TextBox1.Text <> "" And TextBox2.Text = "" And TextBox3.Text
<> "" And TextBox4.Text <> "" Then GoSub zenkoumoku
If TextBox1.Text = "" And TextBox2.Text <> "" And TextBox3.Text
<> "" And TextBox4.Text <> "" Then GoSub zenkoumoku
If TextBox1.Text <> "" And TextBox2.Text <> "" And TextBox3.Text
= "" And TextBox4.Text = "" Then GoSub shincyou_ijyouika
If TextBox1.Text = "" And TextBox2.Text = "" And TextBox3.Text
<> "" And TextBox4.Text <> "" Then GoSub taijyuu_ijyouika
If TextBox1.Text <> "" And TextBox2.Text = "" And TextBox3.Text
= "" And TextBox4.Text = "" Then GoSub shincyou_ijyou
If TextBox1.Text = "" And TextBox2.Text <> "" And TextBox3.Text
= "" And TextBox4.Text = "" Then GoSub shincyou_ika
If TextBox1.Text = "" And TextBox2.Text = "" And TextBox3.Text
<> "" And TextBox4.Text = "" Then GoSub taijyuu_ijyou
If TextBox1.Text = "" And TextBox2.Text = "" And TextBox3.Text =
"" And TextBox4.Text <> "" Then GoSub taijyuu_ika
End Sub
Private Sub CommandButton2_Click()
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox1.SetFocus
Range("A6").Select
Selection.AutoFilter
End Sub
Private Sub CommandButton3_Click()
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
Range("A6").Select
Selection.AutoFilter
UserForm2.Hide
UserForm1.Show
End Sub
<<参考>>
jyouken1 = ">=" & TextBox1.Text
jyouken2 = "<=" & TextBox2.Text
VBAでは文字列は 『&(半角のアンド・マーク)』で連結することができます。
これらの文はjyouken1という文字型変数(文字を入れるための変数)に ">="
という文字列とTextBox1オブジェクトのTextプロパティに設定された値(つまり、テキストボックスで入力した内容)を連結して代入しなさいという意味になります。
zenkoumoku:
shincyou_ika:
shincyou_ijouika:
shincyou_ijyouika:
taijyuu_ika:
taijyuu_ijyou:
taijyuu_ijyouika:
フォーム上のラベルとは全く違うが、これも同じようにラベルといいます。
要するにプログラムで何回も使われる部分をひとまとめにした部分(サブルーチンといいます)の名札にあたるものです。
それぞれのラベル名から『Return』までのひとまとまりをサブルーチンと呼んでいます。
If文の書式は
『If Aという条件 Then Bという実行文』
であり、Aという条件が成立した場合には、Bという実行文を実行しなさい
という意味になります。
該当する条件に一致した場合には『Gosub』という命令文で、それぞれのサブルーチンまで飛び、『Return』文まで来たら元位置の次のところから再度実行することになります。
『zenkoumoku:』 各テキストボックスの全項目に入力されたときに処理される内容です。
『shincyou_ika:』 身長・何cm以下という条件だけを与えたときに処理される内容です。
『shincyou_ijouika:』 身長・何cm以上という条件だけを与えたときに処理される内容です。
『shincyou_ijyouika:』 身長・何cm以上・何cm以下という条件だけを与えたときに処理される内容です。
『taijyuu_ika:』 体重・何Kg以下という条件だけを与えたときに処理される内容です。
『taijyuu_ijyou:』 体重・何Kg以上いう条件だけを与えたときに処理される内容です。
『taijyuu_ijyouika:』 体重・何Kg以上・何Kg以下という条件だけを与えたときに処理される内容です。
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox1オブジェクトのTextプロパティの内容を初期化しています。
以下、同じ意味です。
Range("A6").Select
Selection.AutoFilter
UserForm2.Hide
UserForm1.Show
メインメニューのコードを書いてみようの参考欄で説明済み。
UserForm3のコード例
Private Sub CommandButton1_Click()
Range("A6").Select
If OptionButton1.Value = True Then Selection.AutoFilter
Field:=5, Criteria1:="A"
If OptionButton2.Value = True Then Selection.AutoFilter
Field:=5, Criteria1:="B"
If OptionButton3.Value = True Then Selection.AutoFilter
Field:=5, Criteria1:="O"
If OptionButton4.Value = True Then Selection.AutoFilter
Field:=5, Criteria1:="AB"
End Sub
Private Sub CommandButton2_Click()
OptionButton1.Value = True
Range("A6").Select
Selection.AutoFilter
End Sub
Private Sub CommandButton3_Click()
OptionButton1.Value = True
Range("A6").Select
Selection.AutoFilter
UserForm3.Hide
UserForm1.Show
End Sub
<<参考>>
If OptionButton1.Value = True Then Selection.AutoFilter Field:=5,
Criteria1:="A"
もし、OptionButton1.Value = True(オプションボタン1が選択)されていならば、
Field:=5, つまりE列(『血液型』の列)で
Criteria1:="A"、内容が『A』である行のみを表示しなさいという意味です。
フレーム内(枠で囲まれた内部)のオプションボタンは、どれか一つしか選択されないので、この4つのIF文のうち、どれか一つが実行されます。
If文の書式は
『If Aという条件 Then Bという実行文』
であり、Aという条件が成立した場合には、Bという実行文を実行しなさい
という意味になります。
とりあえず、OptionButton1オブジェクトのValueプロパティの値を『True(真)』にして、これが選択された状態にしています。
Range("A6").Select
Selection.AutoFilter
UserForm3.Hide
UserForm1.Show
メインメニューのコードを書いてみようの参考欄で説明済み。
UserForm4のコード例
Private Sub CommandButton1_Click()
key_word = TextBox1.Text
Range("A6").Select
Selection.AutoFilter Field:=6, Criteria1:=key_word
End Sub
Private Sub CommandButton2_Click()
key_word = ""
TextBox1.Text = ""
TextBox1.SetFocus
Range("A6").Select
Selection.AutoFilter
End Sub
Private Sub CommandButton3_Click()
key_word = ""
TextBox1.Text = ""
Range("A6").Select
Selection.AutoFilter
UserForm4.Hide
UserForm1.Show
End Sub
<<参考>>
key_word = TextBox1.Text
TextBox1.Textの内容(つまり、入力した内容)をkey_wordという変数に入れなさいという意味です。
Selection.AutoFilter Field:=6, Criteria1:=key_word
オートフィルタ機能を用いて、
Field:=6,つまり、F列の中で
Criteria1:=key_wordという条件、つまり、入力したものと全く同じ語句のセルがある行のみを表示しなさいという意味です。
TextBox1.SetFocus
ここでは、TextBox1しかないので、本当は不要ですが、2つ以上TextBoxがある場合には、これでTextBox1がフォースされます。
フォーカスされた項目にカーソルが点滅することになります。
Key_word = ""
TextBox1.Text = ""
key_wordという変数や『TextBox1』オブジェクトの『Text』プロパティの値を初期化しています。
Range("A6").Select
Selection.AutoFilter
UserForm4.Hide
UserForm1.Show>
メインメニューのコードを書いてみようの参考欄で説明済み。
ひとつ前のページへ
Excelの使用方法のページへ
課題一覧2005のページへ
Excel の説明ページへ