2014-01-31
2014-01-30
ユーザーフォームの作成
フォームの作成
メッセージボックスだけでは「はい」「いいえ」だけしか入力できませんので、自分でデザインできるフォームを使ってみましょう。
するとこのような画面が開きますので、ここを自分でデザインします。
このフォームにはUserForm1という名前がついています。これは変更する必要がないのですが、画面に表示されるタイトルを変更しましょう。
画面の左下のプロパティの中のCaption欄がこのウィンドゥのタイトルですので、ここを「休講診断」に変更します。
すると画面のタイトルが「休講診断」に変更されました。
次にボタンを設置します。
休講診断のウィンドゥをクリックすると、「ツールボックス」が表示されます。
この中の「コマンドボタン」をクリックしてください。
するとボタンが表示されます。表示されている文字の変更もCaptionを書きかえればできます。
ここを「気象情報を確認」に書き換えてください。
次に、「気象情報を確認」をクリックしたときに開く2番目のウィンドゥを用意します。
先ほどと同じように挿入から「ユーザーフォーム」を選びます。
これにはUserForm2という名前がついています。
今度はこのウィンドゥのタイトルを「午前6時」にしてください。
次に、単に文字を表示する「ラベル」を入れます。
ツールボックスからラベルを選んでください。
UserForm2にラベルを置いて、Captionを「警報は発表されていますか?」に書き換えます。
さらに、先ほど同様にボタンを二つ置いて「はい」「いいえ」にします。
これらのボタンをクリックして、左側のプロパティのところを見てください。
CommandButton1というのがこのボタンの名前、CommandButtonというのがこのボタンの種類です。
マクロの用意
二つのFormを用意出来たので、「気象情報を確認」をクリックしたらUserForm2が表示されるようにします。
「気象情報を確認」のボタンをダブルクリックすると、マクロを書く部分が表示されます。
ここに
UserForm2.Show
Unload Me
と書きます。
最初のUserForm2.Showは、UserForm2を表示しなさい、という意味で、
次のUnload Meは自分自身(UserForm1)の表示を止めなさい、という意味です。
最後に、UserForm1を表示するマクロを書いて、実行してみましょう。
来週末までの課題
前回までのIF文を使った課題と同じ、以下の休講判断を、このフォームの組み合わせで作ってください。UserForm3というフォームを作って「全ての授業休講」いうラベルと「はい」というボタンを置きます。そして先ほど作ったUserForm2で「はい」のボタンを押したらUserForm3が表示されるようにします。
UserForm4というフォームを作って「気象情報・交通機関の運行」というラベルと「確認」というボタンを置きます。そしてUserForm2で「いいえ」のボタンを押したらUserForm4が表示されるようにします。
UserForm5というフォームを作って午前8時40分での警報を確認します。警報がある方のボタンを押したら、先ほど作ったUserForm3が表示されるようにします。

2014-01-28
2014-01-24
2014-01-23
複雑なIF文
次の二つの例題に関して、xやyの値がどんな時に「いただきます」と表示されるのか、
表示される条件が例1と例2でどのように違うのか考えてみてください。
マクロを書いて実行するときにIfとEnd IFの対応が合ってなくてエラーになって、後からEnd Ifを書き足した時に、間違いの原因となります。
例1
If x > 0 Then
Msgbox ("こんにちは")
If y > 0 Then
Msgbox ("ありがとう")
Else
Msgbox ("こんばんは")
End If
Else
Msgbox ("さようなら")
If y > 0 Then
Msgbox ("おはよう")
Else
Msgbox ("いただきます")
End If
End If
例2:
If x > 0 Then
Msgbox ("こんにちは")
If y > 0 Then
Msgbox ("ありがとう")
Else
Msgbox ("こんばんは")
End If
Else
Msgbox ("さようなら")
End If
If y > 0 Then
Msgbox ("おはよう")
Else
Msgbox ("いただきます")
End If
このままでは、書いた私自身でも理解するのが大変難しいです。
そこで、If~Else~End Ifで囲まれた部分を少し右にずらします。
例1
If x > 0 Then
Msgbox ("こんにちは")
If y > 0 Then
Msgbox ("ありがとう")
Else
Msgbox ("こんばんは")
End If
Else
Msgbox ("さようなら")
If y > 0 Then
Msgbox ("おはよう")
Else
Msgbox ("いただきます")
End If
End If
例2:
If x > 0 Then
Msgbox ("こんにちは")
If y > 0 Then
Msgbox ("ありがとう")
Else
Msgbox ("こんばんは")
End If
Else
Msgbox ("さようなら")
End If
If y > 0 Then
Msgbox ("おはよう")
Else
Msgbox ("いただきます")
End If
右にずらすのは人間が読みやすくするためであり、Excelの動作には関係ありません。
IfとEnd IFの対応が合わなくなるのを防ぐには、Ifを書いた時に中身を書く前にElseやEnd Ifを一緒に書いておくのが良いです。
前回の問題の続き
前回の条件分岐は、まず最初に二つに分かれます。
従って、マクロは
If 午前6時に警報は出ているか Then
青の部分
Else
緑の部分
End If
となり、さらに緑の部分が二つに分かれるので、

この部分を詳しく書き足して
If 午前6時に警報は出ているか Then
青の部分
Else
If 午前8時40分に警報は出ているか Then
赤の部分
Else
黄の部分
End If
End If
となります。
このようにIf Then~Else~End Ifの対応に注意しながら、包含関係を考えてください。
課題
前回の課題を完成させて、出来た人は次のフォームの作り方を自習してください。
フォームの作成
メッセージボックスだけでは「はい」「いいえ」だけしか入力できませんので、自分でデザインできるフォームを使ってみましょう。
するとこのような画面が開きますので、ここを自分でデザインします。
このフォームにはUserForm1という名前がついています。これは変更する必要がないのですが、画面に表示されるタイトルを変更しましょう。
画面の左下のプロパティの中のCaption欄がこのウィンドゥのタイトルですので、ここを「休講診断」に変更します。
すると画面のタイトルが「休講診断」に変更されました。
次にボタンを設置します。
休講診断のウィンドゥをクリックすると、「ツールボックス」が表示されます。
この中の「コマンドボタン」をクリックしてください。
するとボタンが表示されます。表示されている文字の変更もCaptionを書きかえればできます。
ここを「気象情報を確認」に書き換えてください。
次に、「気象情報を確認」をクリックしたときに開く2番目のウィンドゥを用意します。
先ほどと同じように挿入から「ユーザーフォーム」を選びます。
これにはUserForm2という名前がついています。
今度はこのウィンドゥのタイトルを「午前6時」にしてください。
次に、単に文字を表示する「ラベル」を入れます。
ツールボックスからラベルを選んでください。
UserForm2にラベルを置いて、Captionを「警報は発表されていますか?」に書き換えます。
さらに、先ほど同様にボタンを二つ置いて「はい」「いいえ」にします。
これらのボタンをクリックして、左側のプロパティのところを見てください。
CommandButton1というのがこのボタンの名前、CommandButtonというのがこのボタンの種類です。
マクロの用意
二つのFormを用意出来たので、「気象情報を確認」をクリックしたらUserForm2が表示されるようにします。
「気象情報を確認」のボタンをダブルクリックすると、マクロを書く部分が表示されます。
ここに
UserForm2.Show
Unload Me
と書きます。
最初のUserForm2.Showは、UserForm2を表示しなさい、という意味で、
次のUnload Meは自分自身(UserForm1)の表示を止めなさい、という意味です。
最後に、UserForm1を表示するマクロを書いて、実行してみましょう。
2014-01-16
対話型プログラム
条件分岐
場合分けのためのIF文は重要ですので、今週もIF文の使い方を中心にします。
InputBox
昨年は1から100までの合計を計算しましたが、マクロを実行する時に、幾つまでの合計を計算するか尋ねるマクロを書いてみましょう。
Sub 対話型合計()
n = InputBox("幾つまでの和を計算しますか")
'ここに1からnまでの合計を計算してwaという変数に代入するプログラムを書いてください
cells(1,1)=wa
End Sub
条件分岐
先ほどのマクロを、正の数が入力された時だけ計算するように書き換えましょう。このような条件判断にはIf文を使います。
If文の書き方は、
If 条件 Then
条件が成り立つときに実行する文
End If
でしたので、
Sub 対話型合計()
n = InputBox("幾つまでの和を計算しますか")
If n > 0 Then
'ここに1からnまでの合計を計算してwaという変数に代入するプログラムを書いてください
cells(1,1)=wa
End If
End Sub
と書きます。
数字の判定
先ほどのInputBoxに、数字以外のものを入れると計算できません。だから、単に0より大きいかどうかだけでなく、数字かどうかも含めて判定しましょう。
nが数字かどうかは
IsNumeric(n)
で判断します。
If文で、二つの条件が共に成り立つことは And で表すので、If文は
If IsNumeric(n) And n > 0 Then
となります。
Else文
条件が成り立たなかった場合に実行する文がある時には
If 条件 Then
条件が成り立つときに実行する文
Else
条件が成り立たなかったときに実行する文
End If
のように書きます。
練習
- 正の数が入力されたらその数までの和を計算して表示する
- 正の数が入力されなかったら、「正の数を入力してください」というメッセージを表示する
メッセージを表示するには
MsgBox ("正の数を入力してください")
と書きます。
MsgBoxの使い方
MsgBox( )の(括弧)の中に" "で囲まれた文字を書くと、その文字が表示されます。例
MsgBox ("正の数を入力してください")
" "なしで変数の名前を書くと、その変数の値が表示されます。
例えば、和を計算するプログラムで
Cells(1, 1) = wa
の代わりに
MsgBox(wa)
と書いてみてください。
MsgBoxによる質問
MsgBoxは、単に文字を表示するだけでなく、OK、キャンセルなど、どのボタンがクリックされたかを知ることも出来ます。試しに
x = MsgBox("あなたはお昼ごはんを食べましたか", 4, "質問")
If x = 6 Then
MsgBox ("午後も元気ですね")
Else
MsgBox ("ちゃんと食べてくださいね")
End If
を実行して、質問に答えてください。
使い方一覧
aとかbの文字は必要に応じて書き換えてください。
x = MsgBox("a", 1, "b")
OKをクリックするとxに1が代入され、キャンセルをクリックするとxに2が代入されます。
x = MsgBox("a", 1, "b")
MsgBox (x)
を実行して、xの値を確かめてください。
他にも、次のようなメッセージボックスがあります。
クリックしたボタンとxに代入される値の関係は次のようになっています。
1 | OK |
2 | キャンセル |
3 | 中止 |
4 | 再試行 |
5 | 無視 |
6 | はい |
7 | いいえ |
練習問題
この流れ図をマクロに書いてください。
2014-01-14
2014-01-10
2014-01-09
行列の計算
冬休みの間にgmailの仕様が変更されたので、ログインした時に次のような画面が表示されると思います。

ここに書かれているように、メールの中に画像を表示するときの安全性が向上したということですので、OKを押してください。
前回の解答
Sub 数えて足す()Dim x() '配列xは、個数を指定せずにおきます。
j = 1
Do While Cells(j + 1, 2) <> ""
j = j + 1
Loop
人数 = j - 1
'人数を数えたので配列を用意して身長のデータを読み込みます。
ReDim x(人数)
For j = 1 To 人数
x(j) = Cells(j + 1, 2)
Next j
'全てのデータを足します。
wa = 0
For j = 1 To 人数
wa = wa + x(j)
Next j
'合計と、人数で割った平均をシートに書き込みます。
Cells(人数 + 3, 1) = "合計"
Cells(人数 + 3, 2) = wa
身長の平均 = wa / 人数
Cells(人数 + 4, 1) = "平均"
Cells(人数 + 4, 2) = 身長の平均
End Sub
行列の計算
Excelには行列の掛け算をしたり、逆行列を求める機能があります。マクロを使って行列の演算をしてみましょう。
行列の準備
次のように行列を入力してください。
エクセルのワークシートのどの部分が行列なのかを指定します。
Sub 行列()
Dim A As Range
Set A = Range(Cells(1, 1), Cells(2, 2))
最初に、Aはワークシートの範囲を指定するものだと宣言して
次にCells(1, 1)からCells(2, 2)までの長方形が行列Aの範囲だと指定します。
演算してみましょう。
行列一つだけで計算できる例として、転置と、行列式を求めてみます。
Dim B As Range
Set B = Range(Cells(4, 1), Cells(5, 2))
B = Application.Transpose(A)
これで、行列Bの場所であるCells(4, 1)からCells(5, 2)までの長方形に行列Aの転置が出力されます。
Cells(7, 1) = Application.MDeterm(A)
これで、行列Aの行列式がCells(7, 1)に出力されます。
行列の掛け算
今度は二つの行列を掛け算した行列を求めましょう。エクセルのシート1とシート2の両方に先ほどの行列を書いてください。
Sub 掛け算()
Dim A As Range, B As Range, C As Range
Set A = Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2))
Set B = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2))
Set C = Range(Sheets(3).Cells(1, 1), Sheets(3).Cells(2, 2))
C = Application.MMult(A, B)
End Sub
これでシート3の行列Cに、行列の積ABが出力されます。
必ず「標準モジュール」にマクロを書いてください。
連立一次方程式
Ax=b
と書けます。
この式に左からAの逆行列を掛けて
x=A-1b
ですから、エクセルを使って計算するのは
Aの逆行列A-1
A-1とbの行列の積
です。
シート1のCells(1, 1)からこの連立一次方程式の係数行列と定数項を並べて

このように代入します。
この中のCells(1, 1)からCells(2, 2)までの長方形を行列A
Cells(1, 3)からCells(2, 3)までの長方形を行列B
シート2のCells(1, 1)からCells(2, 2)までの長方形にAの逆行列を代入するのでここを行列C
シート3のCells(1, 1)からCells(2, 1)までの長方形に、答えの行列行列を代入するのでここを行列D
とします。
Sub renritsu()
Dim A As Range, B As Range, C As Range, D As Range
Set A = Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2))
Set B = Range(Sheets(1).Cells(1, 3), Sheets(1).Cells(2, 3))
Set C = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2))
Set D = Range(Sheets(3).Cells(1, 1), Sheets(3).Cells(2, 1))
C = Application.MInverse(A)
D = Application.MMult(C, B)
End Sub
解けない場合の処理
このような場合に対処するために、逆行列を求める前に行列式を計算して、行列式が0ではない場合だけ連立一次方程式を解くようにしましょう。
場合分けにはIf文を使います。
If 条件 Then
'ここに条件が成立した時に実行する文を書く
Else
'ここに条件が成立しなかった時に実行する文を書く
End If
このように書きます。
条件が成立しなかった時は何も実行しないなら
If 条件 Then
'ここに条件が成立した時に実行する文を書く
End If
練習
ここまでに説明したことを使って、解ける方程式は解く、解けない方程式は「解けません」と表示するマクロを書いてください。解けないと表示するためには
msgbox("解けません")
と書きます。