[No.1 いきなりサンプルじゃぁねぇ、、文句の一つ言いたいよ]
[No.2 AccessからExcel出力]
[No.3 Dir関数でファイルの存在をチェックする]
[No.4 プログラムって?流れって?]

www.ken3.org(サイト内)から Google を利用して、

三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー] [VBA系 TOP] [三流君 TOP]



種類別の解説
[Excel Form作成]
[フォルダーを選択してファイルリストを作成する]
プログラムのお話
[作成時 Ctrl+C Ctrl+Vの前によく考えよう]
[基本設計書/仕様書のお話]
[データの流れを意識する、情報の探し方など]
[関数に汎用性を持たせる、共通に使える関数作り]
[参照設定のお話]
デバックその他
[実行時エラー、あわてないでデバックを押す]
[イミディエイト ウインドウ と Debug.Print]
[情報の探し方(三流君の方法)]
[プロパティ、メソッドを探る方法]
[サンプル 実行方法]


No.1 2002/10/23
いきなりサンプルじゃぁねぇ、、文句の一つ言いたいよ
[ページTOPへ戻る]

<いきなりサンプルじゃぁねぇ、、文句の一つ言いたいよ>

こんにちは、(はじめまして) AB型の変わり者Ken3です。 ^^^^^^^^^^^^^^^^ メルマガの方向性を考えてたら(おいおい、発行申請する時考えとけよ) 質問メールもらったので、第一回目は、これで行こうかなぁ。。。 /* * 1.メルマガ作者の気持ち? */ メルマガ書いてると、今回みたいに、 掲示板への書き込みや、感想のメールもらえることあります。 (*なかには変なメールもあるけどね) ・反応がなければ、さびしい。 ・ほめられれば、舞い上がる。 ・けなされれば、へこむ。  ^^^^^^^^↑私の場合はもっと来い(笑)かなぁ とにかく、購読者からの反応に一喜一憂してるんだよね。 だからメール下さいね。 なんて、前置きは置いといて、 /* * 2.質問内容 */ うれしい、初質問は、放置されているVBA系のHPを見てのものだけど、 http://plaza14.mbn.or.jp/~ken3/mm/index2.html のExcelからDAOを使用するを見たんだと思う。 In message "質問です", >はじめまして > >VBA上からMDBを生成する方法を探していたら >たどり着けました > >参考にさせて頂いています > >質問が2つほどあるんですけども >MDBを作成する時に、主キー(プライマリーキー)を >設定したいのですが、どうすれば良いんでしょうか? >色々やってみたのですが、ダメでした。。。 >もし知っていたら、ご教授ください。 > >2つ目なんですけど >MDBにはオートナンバー型という型がありますが >これはどういう風に宣言するのでしょう? >これも色々やってみたのですが、出来ませんでした。。 > >以上の2つなのですが >ご存知であれば、ご教授お願いします。 /* * 3.いきなりサンプルじゃぁねぇ、、 */ いきなりサンプルからだと、 何言ってんだよコイツ・・・ 質問者との会話ならメールで1対1でしろ と言われそうだけど、まぁゆるしてよ。。。 Sub Create_test4() 'データベースオブジェクトの宣言 Dim DB As Database Dim TB As TableDef ' Dim IDX As Index Dim strMDBNAME As String '作成ファイル名 strMDBNAME = ThisWorkbook.Path & "\New.mdb" 'ブックのパス+new.mdbとする 'ファイルが既にあるかチェックする If Dir(strMDBNAME) <> "" Then Kill strMDBNAME 'ファイルが存在したら削除する End If 'データベースを新規で作成します Set DB = CreateDatabase(strMDBNAME, dbLangJapanese) 'テーブルを作成します と言ってるけど、 'CreateTableDefメソッドを実行しただけ Set TB = DB.CreateTableDef("メル友") '新しい TableDef オブジェクトを作成します 'そのあと、フィールドを作ろうよ TB.Fields.Append TB.CreateField("ID", dbLong) ''Attributes プロパティにdbAutoIncrField を設定し、自動加算にする TB("ID").Attributes = dbAutoIncrField 'その他付帯項目を作成 TB.Fields.Append TB.CreateField("ニックネーム", dbText, 20) TB.Fields.Append TB.CreateField("E-MAIL", dbText, 30) ' さてと、新しく Index オブジェクトを作成します、 Set IDX = TB.CreateIndex("ID") IDX.Fields.Append IDX.CreateField("ID", dbLong) IDX.Primary = True '.Primaryで主キーになるよ TB.Indexes.Append IDX 'インデックスの追加 '結果を書き込むじゃないけど、 DB.TableDefs.Append TB 'ここで初めて追加だよ、これないと、、、 DB.Close '閉じる MsgBox strMDBNAME & "作成終了" End Sub ポイントは、 >MDBを作成する時に、主キー(プライマリーキー)を >設定したいのですが、どうすれば良いんでしょうか? >色々やってみたのですが、ダメでした。。。 >もし知っていたら、ご教授ください。 ' さてと、新しく Index オブジェクトを作成します、 Set IDX = TB.CreateIndex("ID") IDX.Fields.Append IDX.CreateField("ID", dbLong) IDX.Primary = True '.Primaryで主キーになるよ ^^^^^^^^^^^ インデックスオブジェクトの.Primaryってプロパティかなぁ。 >2つ目なんですけど >MDBにはオートナンバー型という型がありますが >これはどういう風に宣言するのでしょう? >これも色々やってみたのですが、出来ませんでした。。 TB.Fields.Append TB.CreateField("ID", dbLong) ''Attributes プロパティにdbAutoIncrField を設定し、自動加算にする TB("ID").Attributes = dbAutoIncrField ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ これもいろいろと埋まってて、 フィールドの、 .Attributes プロパティに dbAutoIncrField を設定するだけみたいです。 私も探してしまった。。。(笑) こんなんで、参考になりましたか? ならないね。 えっ、なんで? そんな結果をだらだら書くよりも、 オレは、アンタがどうやって?どのようにして?何を使って? インデックスオブジェクトの.Primary .Attributes プロパティ だぁ を調べた調べ方が聞きたいよね。 そうですか。 そうだよ、またわかんなくなった時、調べ方教わってたら自分で調べられるけど、 教えてもらってないんだもん、また何かあったら出来る人に聞いちゃうよ。 そっか・・・ まったく、毎日、XXXXXプロパティの使い方は、、なんて送られても困るんだよ。 話が長くなったので、このへんで今回は切ります。 おぃ、逃げるのか? ・・・・・・ /* * 4.ご教授お願いします は なんかキライ */ >以上の2つなのですが >ご存知であれば、ご教授お願いします。 よく目にするんだけど、 ご教授お願いします って言葉なんかキライなんだよね。 あっ、質問者のマナーって言われると何も言えないんだけど、 私は個人的意見として、嫌いかなぁ。 *深い理由無いんだけど、決り文句?な感じがするのと、  質問者に答えてやってる的な人がなんか好みそうな気がして・・ おっと、あまり気にしないで、感想、質問のメール下さいね。 *質問メールはネタにすると発行がラクなので。 /* * 5.終わりの挨拶 */ で、今日は何が言いたかったの? 初回の挨拶です(笑) はじめに、かましとかないと(うそです) まじめに書くと、 回答だけ載せても、あまり読者のタメにならないのかなぁと思った。 バランスを取りながら 次回も気楽に書いていこうと思います。 何か質問などあったら、掲示板に書いてもらえるとうれしいです 三流プログラマーのKen3でした。

No.2 2002/11/14
AccessからExcel出力
[ページTOPへ戻る]

<AccessからExcel出力>

こんにちは、 AB型の変わり者Ken3です。 ^^^^^^^^^^^^^^^^ 今回も、質問もらったので、第2回目は、これで行こう。 /* * 1.廃刊になる予感かぁ、メモメモ */ 下記、チョイヤバメの指摘メール? In message "廃刊になる予感", Tさん wrote... >廃刊になる予感のするメルマガ >★読者投稿をやけに求める >ネタがないので、投稿に頼ろうとする気持ちはよくわかるが --- えっ、廃刊するメルマガにそんな傾向があったとは、 読者ネタに頼り過ぎるってのも危険なんだね。 でも、3回に1回ぐらいは、頼りますよKen3は(笑) *おいおい、それ以上だろって話しは置いといて、 /* * 2.質問内容 */ うれしい、第二回の質問は、 たらさん wrote... >Access2002からExcel出力 > >こんにちは。Access初心者たらです。 > >現在、Access2002にてデータを管理する物を作って、 >仕事で使用しているのですが、 >これまでは、抽出データをレポートに出力するだけでよかったのですが、E >xcelの定型フォーマットへ出力することになりました。 > >Helpでは、「TransferSpreadsheet」 メソッドで出来る様な事は記載されて >いるのですが、決まったフォーマットへデータの埋め込みは >出来そうも有りません。 >どのようにやったら、実現出来るのでしょうか? > >例 > >ID・・・・・・セルB4 >Name・・・・・セルC4 >Address ・・・セルB6 >TEL ・・・・・セルD7 > >こんな感じで、このデータはこのセルといった具合に >出力セルを指定したいのです。 > >どなたか、教えて頂けないでしょうか? >よろしくお願いします。 > Accessのバージョンも2002かぁ、、、 なんて時代遅れの私の感想は、置いといて、 手元にあるのがAccess97とAccess2000 を使ってやってみます。参考にして作ってくださいね。 /* * 3.ボタンウィザードを使って、Excel起動のプロシージャを作成する */ やりたいことは、 >例 > >ID・・・・・・セルB4 >Name・・・・・セルC4 >Address ・・・セルB6 >TEL ・・・・・セルD7 > >こんな感じで、このデータはこのセルといった具合に >出力セルを指定したいのです。 一言で言うと、指定したExcelの定型フォーマットに Accessに表示されているデータを出力(セット)したいみたいですね。 まずは、AccessからExcelの起動ですよね、 これは、簡単で、ウィザードを使ってサンプルを作れます。
コマンドボタンでアプリケーション、 Excelの起動を選択すると、下記のプロシージャを作成してくれます。 'Access97の場合 Private Sub コマンド0_Click() On Error GoTo Err_コマンド0_Click Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property On Error Resume Next oApp.UserControl = True Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub 何も手を加えないで、このボタンを押すとExcelが起動すると思います。 /* * 4.Excelのマクロ記録でファイルを開く動作をして、探る */ これだと、ただ、Excelのアプリケーションが起動しただけジャン。 私は、指定した定型のExcelファイルに値をセットしたいんですよ。。 まぁまぁ、あわてないでね。 次にExcelのマクロ記録でファイルを開く動作を記録します。 ここでは、 TYPE.xlsってファイルが定型ファイルでそれを開くことにします。 新規のExcelファイル作成し、 ツールのマクロ記録を選択します。

ファイルの開くを選択して、 TYPE.xls を開きます。 その後、慌てず騒がずに、マクロ記録の終了を選択します。
次に記録されたマクロをコピーします。 Alt+F11で編集画面が開きます。 (*ツールのマクロからでも行けます)

Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2002/11/14 ユーザー名 : K ' ' Workbooks.Open FileName:="D:\vba002\TYPE.xls" End Sub と記録されています。 なんだぁ、1行しか記録されて無いジャン、しょぼいね。 まぁまぁ、そんなこと言わないで、 Workbooks.Open FileName:="D:\vba002\TYPE.xls" これがExcelでブックを開く命令なんですよ。 そんなもん、 WorkbooksをOpen ファイル名はXXXXってそのまんまでツマラナイね。 /* * 5.頭にオブジェクト変数を付けるだけなんで・・・ */ そんな話しは置いといて、 この命令をAccessで作成したボタンに追加します。 Private Sub コマンド0_Click() On Error GoTo Err_コマンド0_Click Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property On Error Resume Next oApp.UserControl = True '*1↓頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" '^^^^ Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub *1をみると簡単に、、 Excelで記録したマクロの頭に、 oAppと変数を追加しただけです。 実行すると、Excel起動後、 D:\vba002\TYPE.xls の定型ファイルが開きます。 うそ臭いけどホントに開いた。 こんなに簡単ならハヤク教えろよ。 で、次のデータセット方法は?これも簡単なんだろ?ハヤク教えろよ。 /* * 6.Range("A1").Value ="XXXX"でデータをセット */ いっきに行くと、 Private Sub コマンド0_Click() On Error GoTo Err_コマンド0_Click Dim oApp As Object Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property On Error Resume Next oApp.UserControl = True '*1↓頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" '^^^^ '*2 Range("A1").Value ="XXXX" でデータをセットする oApp.Range("B4").Value = Me![ID] oApp.Range("C4").Value = Me![Name] oApp.Range("B6").Value = Me![Address] oApp.Range("D7").Value = Me![TEL] Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub *2のように、 oApp.Range("B4").Value = Me![ID]とやると、 Accessのフォームの値をセルB4にセットできます。 なんか、簡単でしょ。 /* * 7.終わりの挨拶 */ なんとなく手抜きだったけど、どうでしたか? (手抜きなので、エラー処理とか、問題点がいっぱいです) 次回も気楽に書いていこうと思います。 何か質問などあったら、掲示板に書いてもらえるとうれしいです 掲示板 : http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi *質問に回答形式だとネタ考えないでいいので、ラクできます(笑) 三流プログラマーのKen3でした。

No.3 2002/11/18
Dir関数でファイルの存在をチェックする
[ページTOPへ戻る]

<Dir関数でファイルの存在をチェックする>

こんにちは、 AB型の変わり者Ken3です。 ^^^^^^^^^^^^^^^^ 今回は、 Dir関数でファイルの存在をチェック してみたいと思います。 /* * 1.ファイルが存在しないとエラーメッセージが表示される */ 前回、 /vba/backno/vba002.html で、 AccessからExcelを起動して、データをセットするサンプルを書きました。 In message "[VBAで楽しく No.002] - AccessからExcel出力", mag2 ID 0000099159さん wrote... > oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" で、 D:\vba002\TYPE.xls のExcel元ファイルを開いているんだけど このファイルが存在しないと、 当然ながら、エラーメッセージが表示されてしまいます。 まぁ、いいんじゃない?システムのメッセージが出ても。 よくない、よいないよ。。。 /* * 2.dir関数を使用して、ファイルの存在をチェックする */ ファイルが存在するかチェックする方法として、 Dir関数が存在します。 Dir("ファイル名") で見つからなかった時に長さ0の文字列を返してくるので、 If Dir("D:\vba002\TYPE.xls") = "" Then でチェックできます。 Private Sub コマンド0_Click() On Error GoTo Err_コマンド0_Click Dim oApp As Object '*3ファイルの存在をチェックする If Dir("D:\vba002\TYPE.xls") = "" Then MsgBox "D:\vba002\TYPE.xls を 確認して下さい" Exit Sub '途中で抜ける End If Set oApp = CreateObject("Excel.Application") oApp.Visible = True 'Only XL 97 supports UserControl Property oApp.UserControl = True '*1↓頭にCreateObjectで作成した変数を追加しただけ oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" '^^^^ '*2 Range("A1").Value ="XXXX" でデータをセットする oApp.Range("B4").Value = Me![ID] oApp.Range("C4").Value = Me![Name] oApp.Range("B6").Value = Me![Address] oApp.Range("D7").Value = Me![TEL] Exit_コマンド0_Click: Exit Sub Err_コマンド0_Click: MsgBox Err.Description Resume Exit_コマンド0_Click End Sub *3 みたいな感じでファイルの存在をチェックできます。 へぇ〜、よかったね。 でも、 D:\vba002\TYPE.xls 固定なんでしょ? Dドライブの無いマシーンにインストールする時は、 プログラム直さないと動作しないジャン? oApp.Workbooks.Open FileName:="D:\vba002\TYPE.xls" を oApp.Workbooks.Open FileName:="C:\vba002\TYPE.xls" とかにね。 それに、ルートのすぐ下はイヤな感じなので深いフォルダーを作りたいよね。 C:\顧客管理\資料作成\名簿フォーマット.xls とかにしたいし。 そうすると、 "D:\vba002\TYPE.xls" をVBA内から探して、変更するんだぁ。 こんな小さなプログラム内でも3ヶ所もあるよ。 そうですねぇ、、、 /* * 3.Access Dir関数を使ったサンプル */ 固定処理の話と対策は次回にまわして、 (おいおい、またかよ、、、) Dir関数を使ったサンプル を下記に載せます。何かの参考になれば幸いです。 また、 動作するサンプルを http://www.ken3.org/vba/lzh/dir97.lzh からダウンロード可能にしました。使ってみてください。 例)引数でディレクトリとファイル名を受け取り、メモ帳に書き出す。 ---- Public Sub FileListToMeno(strDIR As String, strPATTERN As String) On Error GoTo Err_FileListToMeno Dim MyName As String Dim MyPath As String '¥を付けるか判断する。 If Right(Trim(strDIR), 1) <> "\" Then strDIR = Trim(strDIR) & "\" '\を追加する End If 'ディレクトリが存在するか、チェックする。 If Dir(strDIR) = "" Then MsgBox strDIR & "ディレクトリが見つかりません" Exit Sub End If '検索するパターンを渡す MyPath = Trim(strDIR) & Trim(strPATTERN) MyName = Dir(MyPath, vbNormal) ' 最初のファイル名を返します。 If MyName = "" Then MsgBox "該当ファイルが一件もありません" Exit Sub End If Call Shell("NOTEPAD.EXE", 1) 'メモ帳起動、、、これでいいの? '秀丸を起動するには??どうするの? SendKeys MyPath & " ファイル一覧 " & Date SendKeys "{ENTER}" Do While MyName <> "" ' ループを開始します。 SendKeys MyName 'ファイル名を送信 SendKeys "{ENTER}" MyName = Dir ' 次のファイル名を返します。 Loop Exit_FileListToMeno: Exit Sub Err_FileListToMeno: MsgBox Err.Description Resume Exit_FileListToMeno End Sub ----- 枠外解説・グチ -- SendKeys使っちゃダメでしょ、、 SendKeys使っちゃダメでしょ、、、 えっ、なんで? Shellで簡単に立ち上げて、データ送ろうとしてるけど、 キー操作やその他で、アクティブなウインドウが切り替わったら、 どうするの?、、、 テストだから、いいじゃん、、おおめに見てよ。 その姿を新人さん達が見習ったら、どうするの? はい、、、すみません。。。 /* * 4.終わりの挨拶 */ 今回は、Dir関数のチョットした説明でした。 次回は、Constの説明と起動場所をやってみたいと思います。 何か質問などあったら、掲示板に書いてもらえるとうれしいです 掲示板 : http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi *質問に回答形式だとネタ考えないでいいので、ラクできます(笑) 三流プログラマーのKen3でした。

No.4 2002/11/19
プログラムって?流れって?
[ページTOPへ戻る]

<プログラムって?流れって?>

こんにちは、 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でした。


検索して目的の情報を探す。

目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。

カスタム検索
三流君(site:www.ken3.org) 内を Googleを利用してキーワード する

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

リンクや広告など

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]