[No.15 ExcelからAccessのフォームを開いてみました]
[No.16 ExcelからAccessのモジュールを呼んでみました]
[No.17 Val関数で文字列を数値に変換してみた]
[No.18 文字列を数値に変換、CIntで変換]
[No.19 Exit Subで途中退場する]
www.ken3.org(サイト内)から Google を利用して、

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



No.15 2002/12/05
ExcelからAccessのフォームを開いてみました
[ページTOPへ戻る]

<ExcelからAccessのフォームを開いてみました>

こんにちは、 メルマガ発行中の三流プログラマーKen3です。 今回は、 掲示板に質問もらったので、チョット発行してみます。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. 質問内容 */ http://bbs.melma.com/cgi-bin/forum/m00034126/ に > ExcelVBAについて教えて下さい。 > > ExcelVBAからACCESSのマクロを実行する > しかたってありますか? と 掲示板に質問をいただきました。 今度は、ExcelからAccessを操作かぁ、 少しやってみますか。 /* * 2.試しに、ExcelからAccessのフォームを開く */ いつもの、いきなりサンプルです。 Sub Macro1() Dim objACCESS As Object 'Accessのアプリケーションオブジェクトを作成する Set objACCESS = CreateObject("Access.Application") 'もちろん、次はファイルを開かないとね objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\db97.mdb" ' 指定のフォームを開く、ここでは、テストフォーム objACCESS.DoCmd.OpenForm "テストフォーム", acNormal objACCESS.Visible = True ' Accessを表示ONあたりまえか objACCESS.UserControl = True 'その後、ユーザーに操作させる Set objACCESS = Nothing ' オブジェクト開放、もう私Excelから使用しないから End Sub で、軽く解説に入ると、 Dim objACCESS As Object まぁ、オブジェクトを参照するための変数を定義します。 as Objectがポイントです。 次は、 'Accessのアプリケーションオブジェクトを作成する Set objACCESS = CreateObject("Access.Application") です。 ここでは、 CreateObject("Access.Application") で、アクセスのオブジェクトを作成、操作用の変数に代入してます。 アプリケーションの操作の準備ができたので、 ファイルを開きますか。 'もちろん、次はファイルを開かないとね objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\db97.mdb" ここでは、 Excelブックのパスと同じフォルダーの db97.mdbを開いてます。 C:\data\data.mdbとか固定なら、 objACCESS.OpenCurrentDatabase "C:\data\data.mdb" で、OKです。 *意味ありそうなdb97。mdbとありますが、  ただの、ファイル名です。 次に、フォームを開きます。 ' 指定のフォームを開く、ここでは、テストフォーム objACCESS.DoCmd.OpenForm "テストフォーム", acNormal なんか、見たこと有る? DoCmd.OpenForm ですね。 *DoCmd.〜を次回あたり探らないとなぁ。 objACCESS.Visible = True ' Accessを表示ONあたりまえか objACCESS.UserControl = True 'その後、ユーザーに操作させる ↑こいつがOnになってないと、悲惨な目に(笑) Set objACCESS = Nothing ' オブジェクト開放、もう私Excelから使用しないから ↑もう、操作しないので、変数を解放してます。 実行のテストサンプルを http://www.ken3.org/vba/lzh/vba015.lzh を落して、動かしていろいろとイタズラしてください。 回答すると AccessOpenTEST.xls と db97.mdb があって、 AccessOpenTEST.xlsをExcelから開いて、遊んでみてください。 Excel97とAccess97 OS:Win98環境 Excel2000とAccess2000 OS:Win2000環境 で、動作しました。 /* * 3.試行錯誤の余談(笑) */ objACCESS.UserControl = True 'その後、ユーザーに操作させる これ、無いと(コメントにして遊んでみてください) 面白いよ。 Accessが起動して、チラっとフォームが見えたと思ったら、 すぐに終了してんの(笑) ぜひ、試してください。 下記は、簡単に想像できるけど(私がやられたけど) objACCESS.Visible = True ' Accessを表示ONあたりまえか これ、やってないと、、、 どうなるんだろう?(笑) 自分への怒りのコメント、 ' Accessを表示ONあたりまえか なんですよね。 表示されなくって、面白いですよ。 *逆に使えるかも? /* * 4.終わりの挨拶 */ 今回は、 ExcelからAccessのフォームを開いてみました。 おい、三流作者。 なに? 質問内容はAccessマクロ実行じゃないの? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ あっ、、、次回ですかねぇ(今回のサンプルでわかっちゃった人もいると思うけど) 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.16 2002/12/06
ExcelからAccessのモジュールを呼んでみました
[ページTOPへ戻る]

<ExcelからAccessのモジュールを呼んでみました>

こんにちは、三流プログラマーKen3です。 今回は、前回の続きで(前回の積み残しとも言う(笑)) ExcelからAccessのモジュールを呼んでみました。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. 質問内容 */ http://bbs.melma.com/cgi-bin/forum/m00034126/ に > ExcelVBAについて教えて下さい。 > > ExcelVBAからACCESSのマクロを実行する > しかたってありますか? でした、これを、 In message "[VBAで楽しく No.015] - Excel から Access のフォームを開いてみました", >Sub Macro1() > > Dim objACCESS As Object > > 'Accessのアプリケーションオブジェクトを作成する > Set objACCESS = CreateObject("Access.Application") > > 'もちろん、次はファイルを開かないとね > objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\db97.mdb" > > ' 指定のフォームを開く、ここでは、テストフォーム > objACCESS.DoCmd.OpenForm "テストフォーム", acNormal > > objACCESS.Visible = True ' Accessを表示ONあたりまえか > > objACCESS.UserControl = True 'その後、ユーザーに操作させる > > Set objACCESS = Nothing ' オブジェクト開放、もう私Excelから使用しないから > >End Sub で、テストのフォームを開く、までは、無事にできました。 /* * 2..RUNってのが正解だったんですね。 */ Accessのモジュールに、テスト用のモジュールを追加します。 AccessのMDB モジュールに書く。 Public Sub aaa() MsgBox "AAAが呼ばれましたよ" End Sub Public Sub bbb(n As Integer, strNAME As String) MsgBox "BBBが呼ばれましたよ" MsgBox "n = " & n & " strname = " & strNAME & "です" End Sub 引数が無しと数値・文字列を受け取るパターンを作成しました。 次にExcel側の処理です。 またまた、いきなり回答書くと、 Sub Macro2() 'ExcelからAccessのモジュールを呼ぶ Dim objACCESS As Object 'Accessのアプリケーションオブジェクトを作成する Set objACCESS = CreateObject("Access.Application") 'もちろん、次はファイルを開かないとね objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\db97.mdb" objACCESS.Visible = True ' Accessを表示ONあたりまえか objACCESS.UserControl = True 'その後、ユーザーに操作させる objACCESS.Run "aaa" '*1モジュール名称を文字列で指定する Set objACCESS = Nothing ' オブジェクト開放、もう私Excelから使用しないから End Sub 実は、すごく簡単で、 objACCESS.Run "aaa" '*1モジュール名称を文字列で指定する と .Run "モジュール名" だったんですね。 ポイントは、モジュール名を文字列で渡すことかなぁ。 で、次に気になるのが、パラメーター(引数を渡す方法だよね) Sub Macro3() 'ExcelからAccessのモジュールを引数付きで呼ぶ Dim objACCESS As Object 'Accessのアプリケーションオブジェクトを作成する Set objACCESS = CreateObject("Access.Application") 'もちろん、次はファイルを開かないとね objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\db97.mdb" objACCESS.Visible = True ' Accessを表示ONあたりまえか objACCESS.UserControl = True 'その後、ユーザーに操作させる objACCESS.Run "bbb", 10, "三流" '*2カンマで引数を書く Set objACCESS = Nothing ' オブジェクト開放、もう私Excelから使用しないから End Sub ここも、得に変化無く、 objACCESS.Run "bbb", 10, "三流" '*2カンマで引数を書く と、モジュール名の次に、カンマで区切って引数を書けばOKです。 なんだぁ、、、わかってしまえば簡単でしたね。 今回のテストサンプルを http://www.ken3.org/vba/lzh/vba016.lzh に保存しました。動かしていろいろと確認(イタズラ)してください。 /* * 3.試行錯誤の余談(笑) */ ここまで、たどりつく、道のりは、、、 意外とかかったなぁって自分なりに自己分析。 objACCESS.Call aaa() と想像で.Callなんてやったなぁ(笑) .Run には、ヘルプでたどりつきました。 で、わかった、OK と 勝手に思いこんで、 objACCESS.Run aaa() objACCESS.Run call aaa() なんて、やってましたね。 う〜ん、うまく行かない。 で、 ヤット、ヘルプのサンプルを見て 正解の、 objACCESS.Run "aaa" objACCESS.Run "bbb", 10, "三流" '*2カンマで引数を書く に、やっとたどり着きました。 ヘルプは最後まで見ようね(笑) 下記、おまけのAccessレポートを開くです。 Sub Macro4() 'おまけ、レポートを開く Dim objACCESS As Object 'Accessのアプリケーションオブジェクトを作成する Set objACCESS = CreateObject("Access.Application") 'もちろん、次はファイルを開かないとね objACCESS.OpenCurrentDatabase ActiveWorkbook.Path & "\db97.mdb" ' 指定のレポートを開く、*ただオープンレポートにしただけ objACCESS.DoCmd.OpenReport "テストレポート" '余談ですが、レポートが直ちに印刷されます、紙が損します objACCESS.Visible = True ' Accessを表示ONあたりまえか objACCESS.UserControl = True 'その後、ユーザーに操作させる Set objACCESS = Nothing ' オブジェクト開放、もう私Excelから使用しないから End Sub ポイントは、 .OpenReport "レポート名" です。 もし、ExcelからAccessのレポートを起動したい時は使ってみてください。 /* * 4.終わりの挨拶 */ 今回は、 ExcelからAccessのモジュールを呼んでみました。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.17 2002/12/07
Val関数で文字列を数値に変換してみた
[ページTOPへ戻る]

<Val関数で文字列を数値に変換してみた>

こんにちは、三流プログラマーKen3です。 今回は、 文字列を数値に変換する関数、 Val関数を使ってみたいと思います。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. Val関数で文字列を数値に変換 */ Val関数で文字列を数値に変換なんですが、 何言ってんだコイツと言う前に、 サンプルを。 Sub test() Dim n As Integer n = Val("1000") '(*1) 文字列"1000"を数値に変換 MsgBox n * 25 End Sub (*1) 普通に、 n = val(変換したい文字列)で数値に変換できます。 なんだぁ、簡単ですね。 Sub test2() Dim n As Long Dim strTANKA As String strTANKA = "120000" '12万 n = Val(strTANKA) '(*2)String型を数値に変換 MsgBox n / 250 End Sub (*2)もちろん、固定じゃなく、 n = Val(strTANKA) と 変数を渡し変換することができます。 Sub test3() Dim lngTANKA As Long '単価 Dim lngKAZU As Long '売上数量 Dim lngKINGAKU As Long '金額 Dim strWORK As String '文字列受け取り用 '単価の入力 strWORK = InputBox("単価を入力して下さい") lngTANKA = Val(strWORK) '入力された文字列を数値に変換 '数量の入力 strWORK = InputBox("販売数量を入力して下さい") lngKAZU = Val(strWORK) '入力された文字列を数値に変換 '金額の計算 lngKINGAKU = lngTANKA * lngKAZU '結果の表示 MsgBox "金額は、" & lngKINGAKU & "円です" End Sub こんな感じで、使用することも出来ます。 通常は、フォームで、 単価:999999 (テキストボックス) 数量:999999 (テキストボックス) 計算実行(ボタン) みたいな感じなので、InputBoxは使いませんが、 Valのサンプルなので、ご勘弁を。 /* * 2.あまり関係無いけど、配列変数の復習も兼ねて */ 前回やってた、グー、チョキ、パーの表示処理で、 配列変数と合わせて、 こんな使い方も出来ます。 Sub test4() Dim strNO As String '(*3)値を受け取るため文字型の変数を宣言 Dim strMSG(3) As String '(*4)結果メッセージの配列 0-3の4つ Dim n As Integer '(*5)番号変換用 '(*6)初期処理で使用するメッセージを代入する strMSG(0) = "正しい値を入力して下さいね" strMSG(1) = "グーを出しました" strMSG(2) = "チョキを出しました" strMSG(3) = "パーを出しました" '(*7) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") '(*8)入力値の文字をVal関数を使用して、数値に変換する n = Val(strNO) '(*9)変換された数値をチェックする、 '3以上なら0にする、4とか100とか違う数値が入力された時は0にする If 3 < n Then n = 0 '(*10)変数の値配列のn番目を表示する(strmsg(n)の中身)を表示する MsgBox strMSG(n) End Sub こんな感じにしてみました。 軽く解説すると、 Dim strMSG(3) As String '(*4)結果メッセージの配列 0-3の4つ まず、結果の文字列を配列で用意します。 '(*6)初期処理で使用するメッセージを代入する strMSG(0) = "正しい値を入力して下さいね" strMSG(1) = "グーを出しました" strMSG(2) = "チョキを出しました" strMSG(3) = "パーを出しました" ここで、メッセージを初期化してます。(事前にセットしておきます) '(*8)入力値の文字をVal関数を使用して、数値に変換する n = Val(strNO) で、”1”を1へ”8”なら8へ ふざけたユーザーが”TAKO”と文字列なら0となります。 n = Val("Ken3") とかやると、 数値に変換できないので、nは0となります。 '(*9)変換された数値をチェックする、 '3以上なら0にする、4とか100、123とか違う数値が入力された時は0にする If 3 < n Then n = 0 この処理はなぜ?か? 5とか99とか数字に変換可能なので、 3より上は全てエラーとしたいので0を代入してます。 0にしておくと(タネを仕込んでおくと)、 下の配列のn番目のメッセージ表示で、 0番目のstrMSG(0) = "正しい値を入力して下さいね"が表示されます。 '(*10)変数の値配列のn番目を表示する(strmsg(n)の中身)を表示する MsgBox strMSG(n) でn番目(添字のnって言う人が多いかな)を表示してます。 ポイントは、 事前のメッセージのセットで、 strMSG(0) = "正しい値を入力して下さいね" エラーメッセージの処理かなぁ。 /* * 3.プログラムの穴(欠陥)、テストはしっかりと(笑) */ さて、このグー・チョキ・パー入力プログラム、 動いているように見えるけど、実は穴(欠陥)があります さて、どこでしょうか? なんて、読者参加型のメールマガジンだと、これで1つ発行できるんだけど、 待ちきれないKen3は、自分落しネタで攻めてみます。 問題の場所は、 −2とマイナスの数値を入力された時、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ '(*7) InputBoxで入力してもらう strNO = InputBox("1.グー 2.チョキ 3.パー", "アナタの手を入力で下さい") InputBoxは、当然マイナスの数値、例だと−2も入力可能です。 '(*8)入力値の文字をVal関数を使用して、数値に変換する n = Val(strNO) としたら、nは−2ですよね。 まぁ、普通の流れですよね。 '(*9)変換された数値をチェックする、 '3以上なら0にする、4とか100とか違う数値が入力された時は0にする If 3 < n Then n = 0 3以上なら0にする、 そりゃぁ、100とか、3以上の数が入力されたら、 0にして、エラーメッセージが表示されるけど、 −2の時は、エラーのチェックにひっかからなく、そのまま通ってしまうよ。 で、 '(*10)変数の値配列のn番目を表示する(strmsg(n)の中身)を表示する MsgBox strMSG(n) ここで、strMSGの−2番目を参照しに行くので、 インデックスの有効範囲エラーでプログラムはストップしてしまう。 あらら、−2なんか、入れんなよ、入力メッセージ見てないのかよコイツら。 頭イテ、ユーザーの入力ミスが悪いのかよ? アナタのチェックが中途半端で、 マイナスの値をエラーで判断できなくて、逃してたんでしょ。 パット見、動いていても、いろいろなデータを想定して、テストしないとダメですよ。 いろいろなデータと言えば、 1.5 と入れても 2.5 と入れると、どうなるか、、、、 あっ、2のチョキが表示される。。。 これもなんか変だよね。 /* * 4.終わりの挨拶 */ 今回は、 Val関数で文字列を数値に変換 と テストをしっかりしないと、バグ発生しますよ(ユーザーのせいにするな) を書いてみました。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.18 2002/12/08
文字列を数値に変換、CIntで変換
[ページTOPへ戻る]

<文字列を数値に変換、CIntで変換>

こんにちは、三流プログラマーKen3です。 前回、文字列から数値の変換でVal関数を使用しました、 今回は、 CInt関数を使ってみたいと思います。 いつものセリフで、そんなたいしたことじゃないので今回もご安心を。 /* * 1. ありがたいご意見メール */ Val関数だと1,234とカンマ付きの文字列が変換できないよ とメールをいただきました。 読者さんからのメール(昔の講座書いてた時のメールを流用) In message "Re: Val関数", A***さん wrote... >Val 関数について > >きっと あとで説明があるのでしょうが、型の変換や、丸めには一筋縄ではいかな >いものがありますね。 > > たとえば test3 で > >> Sub test3() > > 中略 > >> '単価の入力 >> strWORK = InputBox("単価を入力して下さい") >> lngTANKA = Val(strWORK) '入力された文字列を数値に変換 > >123,456 と入力されたら lngTANKA は 123 になってしまいますね。 ---- あれれ、、、 Val関数だと,が付いているとダメみたいですね。 金額系の入力だと、1,234みたいに、入力したい人居ますよね。 また、元データが文字列で3桁区切りのカンマが付いてるとか。 さて、どうしましょう。。。 /* * 2.CInt関数を使ってみました。 */ 何か無いかなぁ、 "1,234"の文字列を"1234"に直してから変換も一つの手だけど、 そんな手間かけたくないしなぁ。 ヘルプを見ると、CIntなんて関数がある。 よし、これを使ってみるか。 Sub test1() '(*1)前準備で変数宣言 Dim strKINGAKU As String '文字列変数の定義 Dim intKINGAKU As Integer 'INT型変数の定義 '(*2)固定値を代入 strKINGAKU = "1,234" 'カンマ付きで千2百3十4円の文字列を代入 '(*3)Val関数で変換、数値表示 intKINGAKU = Val(strKINGAKU) 'strkingakuを数値へ変換する MsgBox "Valで変換すると " & intKINGAKU '(*4)続いて、Cint関数で変換 intKINGAKU = CInt(strKINGAKU) 'strkingakuを数値へ変換する MsgBox "CIntで変換すると " & intKINGAKU End Sub を実行してみます。 (*2)で strKINGAKU = "1,234" と文字列を代入した変数を、(*3)Val(*4)Cintで変換します。 結果は、 (*3)のVal関数は、1と表示され、 (*4)のCint関数は、1234と表示されます。 /* * 3.プログラムの穴(欠陥)、テストはしっかりと(笑) */ さて、いつものテストはしっかりと系ネタ。 CInt覚えましたか?使ってくださいね。 じゃなくって、 もしも入力された文字がXXXだったら、 と想像し、テストしてみると、 Sub test2() '(*1)前準備で変数宣言 Dim strKINGAKU As String '文字列変数の定義 Dim intKINGAKU As Integer 'INT型変数の定義 '(*5)ユーザーから入力を受けつける strKINGAKU = InputBox("金額を入力して下さい") '(*6)続いて、Cint関数で変換 intKINGAKU = CInt(strKINGAKU) 'strkingakuを数値へ変換する MsgBox "CIntで変換すると[ " & intKINGAKU & " ]です" End Sub (*5)でInputBoxを使用して入力します。 次に、 (*6)でCInt関数を使用して、変換します。 上記テストプログラムで、下記のテストを行います。 ア. 1,23 と入力 イ.1,23,4 と入力 ウ.10ABCと入力 エ.XYZ123と入力 オ.何も入力しないでキャンセルを押してみる。 すると? アとイは無事に変換されます が ウ〜オは型変換エラーでプログラムがストップしてしまいます。 さて、さて、、、、 三流君へもう一つのクレーム言っていい? いいよ、軽くね。 カ.120000と(12万と)入力したらどうなるの? あっ、オーバーフローだってさ、、、、 /* * 4.終わりの挨拶 */ 今回は、 Valで数値に変換は、"1,234"などには、使用できない、 CInt関数ってある が、めちゃくちゃな文字を渡すと型変換エラーで止まってしまう。 と 覚えてもらえば、OKです。 今回のテストサンプルを http://www.ken3.org/vba/lzh/vba018.lzh に 保存しました。動かしていろいろと確認(イタズラ)してください。 おっと、忘れてはいけないのが、 テストをしっかりしないと、バグ発生しますよ(ユーザーのせいにするな) でしたね。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.19 2002/12/09
Exit Subで途中退場する
[ページTOPへ戻る]

<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でした。


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

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

カスタム検索
三流君(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系バックナンバー目次へ移動]