<プログラムって?流れって?>
こんにちは、 AB型の変わり者Ken3です。 ^^^^^^^^^^^^^^^^ 今回は、 プログラムの流れ? を軽く書いてみたいと思います。 また、 http://www.ken3.org/vba/lzh/vba004.lzh を解凍すると、038-18.xlsが入っていて、 For文のサンプルを試せます。 興味のある人は試してみてください。 /* * 1.プログラムって?流れって? */ プログラムって言うと、何を思い浮かべますか? 競馬のレーシングプログラム、、、運動会のプログラム、、、など、、、 運動会のプログラムなどは、順番に上から下に進んでいきます。(競馬の出走順も) ・開会式 ・100メートル走 ・玉入れ ・昼休憩 ←あれ、もう昼? ・リレー ・閉会式 ←もう、終わり、、、騎馬戦ないの?...気にしないで、、 開会式から閉会式まで、上から下に、流れていきます。 まぁ、通常は、そんな感じですが、 いつも同じことをするほど、(いつも同じじゃ、使えないでしょ) プログラムは甘くなく、 変数の状態によってやること変えたり、(腹へったから、玉入れ中止、昼にする?) 繰り返したり、流れを組み合わせます。 ア.基本は、上から下に流れます。 運動会のプログラムのように イ.分岐する場合 高校野球などのコールド試合(ルール知らないので、細かい点差、間違ってたら、、) 通常は、1回から9回まで進みます。 1回 2回 ・ ・ 5回 ここで点差が10点以上ならコールドゲームで試合終了 ・ ・ 9回 得点の多いチームの勝ち 同点の場合は延長戦へ 10回 どちらかが、多く得点を取るまで続く ・ ・ 18回 引き分け再試合 など、ある条件(ここでは、イニング回数と得点差ですね) で実行する作業(コールドなのか、、延長なのか、、再試合、、) を判断する。 ウ.繰り返し 分岐と似ているのですが、繰り返し処理で(無限ループもある?) 表現悪いですが、今風のたとえ話で、 ストーカー君が好きな子に start ↓ 付き合ってください ↓ イヤダ ↓ ここで彼女は考える、そろそろ、警察につきだそうか、家族にそうだんするか (10回ぐらい付きまとわれた、、警察に相談-->ストーカー君end逮捕) ↓ startへ戻るを繰り返す... (まったくストーカーってヤツは..頭の中の判断がおかしい、、、なんてね) まぁ、冗談ですが、プログラムは、どんなものでも、 処理の流れ、分岐の繰り返し、組み合わせだと思います。 下記のような順序で基本は上から下へ流れてます。 Sub test() Dim strMOJI As String 'ここで、文字を入れる、、 strMOJI = InputBox("好きな人の名前を入れてください") '入力文字数のチェック If Len(strMOJI) = 0 Then MsgBox "ノリの悪いヤツだなぁ、面白くないなぁ" Exit Sub End If '結果表示 If MsgBox(strMOJI & "さんに告白したの?", vbYesNo) = vbYes Then MsgBox "やりますねぇ" Else MsgBox "がんばってくださいね" End If End Sub ・変数の定義(開会式?)Dim strMOJI As String ・好きな子の名前入力 strMOJI = InputBox("好きな人の名前を入れてください") ・入力文字数判断 If Len(strMOJI) = 0 Then 0文字の時は警告出して関数を抜ける Exit Sub ・結果表示と確認 If MsgBox(strMOJI & "さんに告白したの?",〜 vbYes ... MsgBox "やりますねぇ" vbNo .... MsgBox "がんばってくださいね" ・End Sub(閉会式?) なんか、少し、ズレてる気がするけど、 /* * 2.プログラムって?一直線プログラム */ プログラムには流れがある、、 なんて、偉そうに言いましたが、 基本は、上から下に流れるんですね。 Sub test() MsgBox "プログラムは、上から下に流れます" MsgBox "まんなか、、" MsgBox "今日も一日がんばりましょう" MsgBox "こんな感じです" End Sub 少々うざいですが、こいつを実行するとメッセージが4つ表示されて行きます。 三流君さぁ、だから?なに?って感じなんだけど。 えっと、上から順番に命令を実行しているのがわかったと思います。 なんか、ツマンナイね。 そうですか? Excelでマクロを記録ってあるの、ご存知ですか? 操作を記録して、VBAのコードを自動で作成してくれます。
たとえば、セルのB4に”横浜の金城は、カネシロじゃないよ”と入力し、 太字にすると、下記のように記録されます。
Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2001/2/26 ユーザー名 : K ' Range("B4").Select ActiveCell.FormulaR1C1 = "横浜の金城は、カネシロじゃないよ" Range("B4").Select Selection.Font.Bold = True End Sub なんか、いろいろ記録されていて、よくわかりませんが、操作を記録してくれます。 これも、上から下に決まった処理を行っています。 上から下に流れるだけでは、なんとなくプログラムと言えませんねぇ。 そんな固定処理は無いでしょう。 そうですねぇ、、 まぁ、はじめは一直線プログラムで、 メッセージが表示されて、おっ、なんて嬉しがってくれると。 /* * 3.If文でちょこっと分岐 if n = 1 then 〜 */ いままで、上から下に流れるだけのプログラムをテストで組んでました。 今回は、If文を使って変化をつけてみたいと思います。 まぁ、いきなりIf文とか言われても???だと思います。 前回、Rnd関数を使ってランダムな数値を出力するテストプログラムを作りました。 えっ、もう忘れたって、、、そんなこと言わないで、、、 安心しな三流君、覚えてるよ こんな感じでしょ? Sub test() Dim saikoro As Integer Randomize ' 乱数発生ルーチンを初期化します。 saikoro = Int((6 * Rnd) + 1) ' 1 から 6 までの乱数を発生させます。 MsgBox "サイコロの数は、" & saikoro & "です" End Sub そうですね、ポイントは、 saikoro = Int((6 * Rnd) + 1) ' 1 から 6 までの乱数を発生させます。 で乱数でした。 今回は、1から3の乱数を発生させて、 1の時グー 2の時チョキ 3の時パー と 表示させてみます。 流れは、 ア.変数宣言・初期化などの前準備、 イ.1から3の乱数を発生させる ウ.結果を判断し、1の時グー,2の時チョキ,3の時パーを表示させる となります。 なんか日本語で書くとまっすぐな流れジャン(笑) 下記のような感じになります。 Sub test2() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((3 * Rnd) + 1) '(*1) 1 から 3 までの乱数を発生させます。 '結果を判断し、Msgboxで表示する If n = 1 Then '(*2) nが1か判断する MsgBox "グーを出しました" End If If n = 2 Then MsgBox "チョキを出しました" End If If n = 3 Then MsgBox "パーを出しました" End If End Sub (*1) n = Int((3 * Rnd) + 1) は、OKですね。(事務処理ではあまり使わないけど) (*2) 問題が、初めて出てきたIf文ですね。 HELPを見ると、 式の値に基づいて、条件付きの実行を行うフロー制御ステートメントです。 んっ?なんのこと? まぁまぁ、、、 If文には構文、書き方があって、 今回使用したのは、 if 式 Then 式の評価が正しい時に実行される EndIf のパターンです If n = 1 Then '(*2) nが1か判断する MsgBox "グーを出しました" End If n = 1 か 式を判断します、 式が正しければ、Then と End If の間のプロックを実行します。 プロック?ってなに? えっとですねぇ、 If n = 2 Then MsgBox "チョキを出しました" '(*3) MsgBox "勝てましたか?" '(*3) End If のIf文だと、変数nの値が2の時(*3)の部分が実行されます。 なんか、いろいろ書きましたが、 あまり気にしないで下さい、慣れると思います。 /* * 4.Select Case 文を使ってみた */ 1から3の乱数を発生させて、 1の時グー 2の時チョキ 3の時パー と 表示さるプログラムを書きました。 Sub test2() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((3 * Rnd) + 1) '(*1) 1 から 3 までの乱数を発生させます。 '結果を判断し、Msgboxで表示する If n = 1 Then '(*2) nが1か判断する MsgBox "グーを出しました" End If If n = 2 Then MsgBox "チョキを出しました" End If If n = 3 Then MsgBox "パーを出しました" End If End Sub 流れは、 ア.変数宣言・初期化などの前準備、 イ.1から3の乱数を発生させる(*1) ウ.結果を判断し、1の時グー,2の時チョキ,3の時パーを表示させる(*2) でした。 (*2)のIf文で判断して、結果を表示させてました。 If n = 1 Then '(*2) nが1か判断する MsgBox "グーを出しました" End If で下にまたn=2,n=3のIf文を書いてます。 これ、なんとかなりませんか?三流君? やはり、感じましたか。 条件判断、流れの制御で Select Case ステートメントってのがあります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ Sub test3() Dim n As Integer '値を格納する変数を定義する Randomize ' 乱数発生ルーチンを初期化します。 n = Int((3 * Rnd) + 1) '(*3) 1 から 3 までの乱数を発生させます。 '結果を判断し、Msgboxで表示する Select Case n '(*4)判断にSelect Caseを使用 Case 1 MsgBox "グーを出しました" Case 2 MsgBox "チョキを出しました" Case 3 MsgBox "パーを出しました" MsgBox "パーとか言うなよパーとか、、" End Select End Sub (*4)の場所で使用しました。 書き方は、 Select Case 式 Case 値1 値1の時実行 値1の時実行 Case 値2 値2の時実行 値2の時実行 ・ ・ ・ Case 値Z End Select です、評価したい式、ここでは変数nなので、 Select Case n と記述し、 Case 1 と値を書き、 MsgBox "グーを出しました" 1の時の処理を記述 Case 2 MsgBox "チョキを出しました" Case 3 MsgBox "パーを出しました" MsgBox "パーとか言うなよパーとか、、" End Select なんか、いろいろ書きましたが、 あまり気にしないで下さい、慣れると思います。 /* * 5.ループ処理に挑戦 -- For文で繰り返し */ ループ処理を書いてみようかなぁなんて思ってます、 いままで、上から下に流れる一直線プログラムを作成してきました。 で、次にIf文やSelect case文で分岐を少しやりました。 今回は繰り返し処理のループに挑戦してみたいと思います。 繰り返し 分岐と似ているのですが、繰り返し処理で(無限ループもある?) 表現悪いですが、今風のたとえ話で、 ストーカー君が好きな子に 1.start ↓ 2.付き合ってください ↓ 3.イヤダ ↓ 4.ここで彼女は考える、そろそろ、警察につきだそうか、家族にそうだんするか (10回ぐらい付きまとわれた、、警察に相談-->ストーカー君endの6.逮捕) ↓ 5.start(1)へ戻るを繰り返す... (まったくストーカーってヤツは..頭の中の判断がおかしい、、、なんてね) 6.End 逮捕 なんてループはよくないので止めましょう、じゃなくって、 プログラムにはループ処理があるって話でしょ、 そうでした、いつもの前置きはこれくらいで、 下記、5回「きみが好きだよ」と表示するプログラムです。 Sub test18_1() MsgBox "キミが好きだ" MsgBox "キミが好きだ" MsgBox "キミが好きだ" MsgBox "キミが好きだ" MsgBox "キミが好きだ" End Sub 芸がないですが、動作はします。 ここのボタンを押して、クリックのイベントに書いて、試してみて下さい。 *たぶんプログラムは動作するけど、告白は、失敗します。 この5行縦に並べるのって?なんかイヤですよね。 動くからいいじゃん。 はいはい、そこで、今回、For 〜 Next で繰り返しを書いてみます。 Sub test18_2() Dim n As Integer '(*1)ループのカウンター For n = 1 To 5 '(*2)ループ処理 MsgBox "キミが好きだ" Next n End Sub まず、カウンター変数を宣言します。 Dim n As Integer '(*1)ループのカウンター ここでは、n回まわるの意味でnにしてます。 n,i,j,lとか一文字を好む人と、 cntXXXXと名前をつける人と、いろいろ居ますが、 基本的にはわかりやすくダブらない名称ならOKだと思います。 先輩の書き方に合わせるのも一つの手ですし(いい子ちゃんモード) 話し合いで、規約を作るのもやる気があって○かなぁ。 話は、脱線してしまいましたが(それはそれで続けても面白いのかなぁ?) カウンターの変数を定義後、 For n = 1 To 5 '(*2)ループ処理 MsgBox "キミが好きだ" Next n ここがこんかいの目玉、 For Next ステートメントです。 For カウンター変数 = 初期値 to 終了値 (Step xxカウンターを増減*省略可能) 繰り返し行う処理A 繰り返し行う処理B next カウンター変数 って感じです。 For n = 1 が初期値に1を代入、 For n = 1 To 5 5までnextまでの処理を実行 ここでは、MsgBox "キミが好きだ"を nが1から5まで(5回)繰り返します。 なんか、わかったような、わからないような。 で、なんかボソボソって書いてある Step xxカウンターを増減*省略可能 って何? あっ、これですか、通常省略するとカウンター変数が+1されながら回るんですよ。 だから? えっとですね、 Sub test18_3() Dim n As Integer '(*1)ループのカウンター For n = 1 To 5 '(*2)ループ処理 MsgBox n & "回目" '(*3)カウンターを表示 Next n End Sub みたいにすると、1回目、2回目、3回目、4回目、5回目とメッセージが表示されます。 にいしいろのやのと(2 4 6 8 10) と 表示させたい時は Sub test18_4() Dim n As Integer '(*1)ループのカウンター For n = 2 To 10 Step 2 '(*4)Step 2を指定 MsgBox n 'カウンターを表示 Next n End Sub と n = 2で2からスタート to 10 で10までを指定、 Step 2でカウンターを+2単位で増加させてます。 もちろん、増加の逆でカウンターを減少させることも可能で、 Sub test18_5() Dim n As Integer '(*1)ループのカウンター MsgBox "心の準備はよろしいですか?" For n = 5 To 1 Step -1 '(*5)Step -1を指定 MsgBox n 'カウンターを表示 Next n MsgBox "好きです" End Sub とすると、 5 4 3 2 1 好きです となります。 基本は、こんな感じかなぁ。 おまけで、 Excleのフォントサイズを10から+2単位で220まで変更し、 その後、220から10まで戻してみます。 *速いマシーンだと一瞬かなぁ。 Sub test18_6() Dim n As Integer '(*1)ループのカウンター MsgBox "心の準備はよろしいですか?" Range("A1").Value = "大好き" '文字を代入 '文字サイズを+2単位で大きく For n = 10 To 220 Step 2 'Step +2を指定 Range("A1").Font.Size = n '(*6)サイズをnにする DoEvents Next n '文字サイズを+2単位で減少 For n = 220 To 10 Step -2 'Step -2を指定 Range("A1").Font.Size = n '(*6)サイズをnにする DoEvents Next n MsgBox "終了" End Sub Excelの.Font.Sizeプロパティに値をセットして、 Range("A1").Font.Size = n '(*6)サイズをnにする なんて、遊ぶこともできます。 なんとなく、感じはつかめましたか? /* * 4.終わりの挨拶 */ 今回は、 プログラムの流れを簡単に書いてみました。 軽く読み流しておいてください。 *そのうち慣れてくるので、気にしないで大丈夫ですよ。 また、何か質問などあったら、掲示板に書いてもらえるとうれしいです 三流プログラマーのKen3でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]