<Exit Subで途中退場する>
こんにちは、三流プログラマーKen3です。 今回は、 Exit Subで途中退場(処理を抜ける)処理を書いてみたいと思います。 (これも、過去のメルマガを直したものだけど) いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. プログラムを書く時、処理の流れを軽く書いてから作る */ 前回までに(飛び飛びですが)、 ・乱数の発生、 ・InputBoxで値を受け取る、 ・If文で判断 などをやりました。 復習を兼ねて、 ユーザーに1.グー2.チョキ3.パーを入力させる。 入力値をチェックし123以外ならエラーを表示してプログラムを抜ける(今回のテーマ) コンピュータの手を乱数で決める。 勝負の結果を判断する。 結果を表示する。 をやってみたいと思います。 プログラムを書く時、頭の中で考えて、いきなり書ける人は少ないと思います。 *ある意味、頭に浮かんじゃえば、あとはできたと同じって感覚もありますが。 私はよく、紙の上に落書きを書くのですが、みなさんは? そこまでしなくっても、先にコメントを書いておくと作成が楽かもしれません。 Sub test() '初期処理 'ユーザーにグ・チ・パを入力させる '入力値の判断、エラーならメッセージを表示させ抜ける 'コンピュータの手を決定 '結果判断と表示 End Sub なんて、軽く書いておきます。 *少しカッコ悪いけど、ダマされたと思って試してみて下さい。 /* * 2.Exit Sub で 処理を抜ける */ さて、ここから本題の、Exit Sub で 処理を抜けるです。 いままでやった、命令を1つ1つ書いていきます。 Sub test2() '初期処理 Dim strNO As String '(*1)値を受け取るため文字型の変数を宣言 'ユーザーにグ・チ・パを入力させる '(*2) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '入力値の判断、エラーならメッセージを表示させ抜ける '(*3)If文で1,2,3以外を判断する If strNO <> "1" And strNO <> "2" And strNO <> "3" Then MsgBox "[" & strNO & "]は不正な入力です" Exit Sub '<--(*4)Exit Subを使用してここでプログラムを抜ける End If 'test表示 MsgBox "strNO = " & strNO 'コンピュータの手を決定 '結果判断と表示 End Sub いきなり、今日のテーマを解説してしまうのですが、 下記の場所、 '(*3)If文で1,2,3以外を判断する If strNO <> "1" And strNO <> "2" And strNO <> "3" Then MsgBox "[" & strNO & "]は不正な入力です" Exit Sub '<--(*4)Exit Subを使用してここでプログラムを抜ける End If ポイントの (*4)Exit Sub この命令で、Sub関数を抜けてしまいます(その後の命令は実行されません) なんか別な言い方無いの?三流君? えっと、強制的な終了のイメージや途中で講座を投げちゃう感じかなぁ。 例)講座/トレーニングが続くのに途中で辞めてしまう。 ・変数の講座 ・If文の講座 ・ ・ ・ ・Exit Sub 後ろに講座(命令)があるのに投げ出して終了(笑うに笑えない(爆)) ・For文の説明 ・Function関数の説明 こんな感じで、後ろに処理が残っているのに、 途中で抜け出したい時に使います。 1でもなく、2でもなく、3でもないときは、 エラーなのでメッセージを表示して、処理を終わらせたかったので、 '(*3)If文で1,2,3以外を判断する If strNO <> "1" And strNO <> "2" And strNO <> "3" Then の <> "1" が、1以外の確認で、 And でつなげて、次の <> "2" <> "3" と条件を判断後、 MsgBox "[" & strNO & "]は不正な入力です" とメッセージを表示 Exit Sub '<--(*4)Exit Subを使用してここでプログラムを抜ける ^^^^^^^^ で関数からバイバイしてたんですね。 Exit Sub も、プログラムの流れの制御だったんですね。 なんとなく、わかりましたか? /* * 3.続きはIf文の嵐で判断しまくり(笑) */ これで、終わってもよかったんだけど、 おまけで進めると、 やっと、ユーザーさんの正しい手(1から3)が入力されたので、 残っている、 'コンピュータの手(1から3でグー・チョキ・パー) と '結果の判断です。 Sub test3() '初期処理 Dim strNO As String '(*1)値を受け取るため文字型の変数を宣言 Dim nCON As Integer '(*5)コンピュータの手1〜3の数値が入る Dim nPC As Integer '(*6)ユーザーさんの手 'ユーザーにグ・チ・パを入力させる '(*2) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '入力値の判断、エラーならメッセージを表示させ抜ける '(*3)If文で1,2,3以外を判断する If strNO <> "1" And strNO <> "2" And strNO <> "3" Then MsgBox "[" & strNO & "]は不正な入力です" Exit Sub '<--(*4)Exit Subを使用してここでプログラムを抜ける End If 'コンピュータの手を決定 Randomize ' 乱数発生ルーチンを初期化します。 nCON = Int((3 * Rnd) + 1) '(*7) 1 から 3 までの乱数を発生させます。 '結果判断と表示 'ユーザーの手を表示する nPC = Val(strNO) '(*8)Val関数で数値型に変換する If nPC = 1 Then MsgBox "あなたの手はグーです" If nPC = 2 Then MsgBox "あなたの手はチョキです" If nPC = 3 Then MsgBox "あなたの手はパーです" 'コンピュータの手を表示する If nCON = 1 Then MsgBox "コンピュータの手はグーです" If nCON = 2 Then MsgBox "コンピュータの手はチョキです" If nCON = 3 Then MsgBox "コンピュータの手はパーです" '結果の判断 '(*9)まず、引き分けを判断 If nPC = nCON Then MsgBox "引き分けです" '(*10)次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー If nPC = 1 And nCON = 2 Then MsgBox "アナタの勝ちです" If nPC = 2 And nCON = 3 Then MsgBox "アナタの勝ちです" If nPC = 3 And nCON = 1 Then MsgBox "アナタの勝ちです" '(*11)コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ If nPC = 1 And nCON = 3 Then MsgBox "私(コンピュータ)の勝ちです" If nPC = 2 And nCON = 1 Then MsgBox "私(コンピュータ)の勝ちです" If nPC = 3 And nCON = 2 Then MsgBox "私(コンピュータ)の勝ちです" End Sub 簡単に続きを解説すると、 (*5)(*6)で Dim nCON As Integer '(*5)コンピュータの手1〜3の数値が入る Dim nPC As Integer '(*6)ユーザーさんの手 と数値型の変数を定義してます。 この変数(nCON,nPC)に、手を入れます。 (*7)で nCON = Int((3 * Rnd) + 1) '(*7) 1 から 3 までの乱数を発生させます。 Rnd関数で乱数を発生させ、コンピュータの手を決めます。 InputBoxで文字が入力されているので、 (*8)で nPC = Val(strNO) '(*8)Val関数で数値型に変換する Val関数を使用して、数値に変換してます。 上のIf文( If strNO <> "1" And strNO <> "2" And strNO <> "3" Then ) で、 データの値がキレイになっているので(不正な値は通らないので、) Val関数で単純に数値に変換してます。 (*9)で、 数値が同じ、手が同じか判断して、引き分けを表示しています。 '(*9)まず、引き分けを判断 If nPC = nCON Then MsgBox "引き分けです" 下記のそのまま判断する書き方もアリだけど、 If nPC = 1 And nCON = 1 Then MsgBox "引き分けです" If nPC = 2 And nCON = 2 Then MsgBox "引き分けです" If nPC = 3 And nCON = 3 Then MsgBox "引き分けです" おいおい、ひねくれてるね三流君は(笑) まぁ、普通に出した手が同じだったらにして、 If nPC = nCON Then を使いました。 で、次は?何? 次はですね、 (*10)で、先に自分の勝ちを判断しています。 '(*10)次に自分が勝ちの手を判断 グーvsチョキ,チョキvsパー,パーvsグー If nPC = 1 And nCON = 2 Then MsgBox "アナタの勝ちです" If nPC = 2 And nCON = 3 Then MsgBox "アナタの勝ちです" If nPC = 3 And nCON = 1 Then MsgBox "アナタの勝ちです" なんかわかりにくいなぁ? なに?この1と2だったらって? えっと1がグー、2がチョキ、3がパーなので、 グー(1) vs チョキ(2), チョキ(2) vs パー(3), パー(3) vs グー(1) を比べてます。 もっと何か別な書き方無いの? はい、次回のネタで書かせてもらいます。(ネタばれたかなぁ?) 次も同様の処理で、しつこくコンピュータの勝ちを調べてます。 '(*11)コンピュータが勝ちか判断 グーvsパー,チョキvsグー,バーvsチョキ If nPC = 1 And nCON = 3 Then MsgBox "私(コンピュータ)の勝ちです" If nPC = 2 And nCON = 1 Then MsgBox "私(コンピュータ)の勝ちです" If nPC = 3 And nCON = 2 Then MsgBox "私(コンピュータ)の勝ちです" グー(1) vs パー(3), チョキ(2) vs グー(1), バー(3) vs チョキ(2) ですね。 やはり三流君らしい汚いプログラムだねぇ、 もっとスッキリいかないの?スッキリと? 期待しないで、待ってるよ。 /* * 4.終わりの挨拶 */ 今回は、 ・Exit Subで途中でプログラムを抜ける でした。 今回のテストサンプルを http://www.ken3.org/vba/lzh/vba019.lzh に保存しました。 解凍してTest019-Book.xlsを開いて、 動かしていろいろと確認(イタズラ)してください。 Alt+F11でVBAのプログラム編集画面に切り替わるので、 メッセージを修正したり、 Select Case文に直してみるとか、 オレならこの書き方だなぁ、、と遊んでください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]