判りにくい質問ですみません、どういうことかといいますと。
今、以下のようなコードがあります。
-----------------
If Not AnimalReportNumberSQL(makeSQL) Then
Exit Function
End If
…(1)
-----------------
Public Function AnimalReportNumberSQL(ByRef makeSQL As String) As Boolean
AnimalReportNumberSQL = False
…
makeSQL=(SQL文のようなものがが10行ぐらい出てきます)
…
AnimalReportNumberSQL = True
Exit Function
…(2)
-----------------
makeSQLというのは「Dim makeSQL As String」と、変数宣言されております。SQLを作るための文字列を入れるための変数のようです。
そして上のコードを実行しまして、一行ずつ見ていくと、なぜか(1)のIf Not文内の「Exit Function」に入らず、またEnd Ifの真下にあるコードにも入らず…。
100行ぐらい下にある、(2)の、
Public Function AnimalReportNumberSQL(ByRef makeSQL As String) As Boolean
というコードに飛ぶのです(SQL文の箇所には、makeSQLに格納すると思われるSQLらしき文字列が10行ぐらい、つらつら並んでおります)。
それで(2)の終わり、「Exit Function」を過ぎると、なぜか(1)のEnd Ifに戻るのです。
この動きが全く分かりません…なぜ(1)のIf Not文から(2)に飛ぶのでしょうか。(1)で条件を満たさない、If Not(でなければ)であれば、If Not文の中、(1)の「Exit Fuction」に進むか。
もしくはIf Not(でなければ)を満たさないのであれば、(1)のEnd Ifに進むのが、コード通りではないでしょうか。
(1)から(2)に飛ぶ理由をご説明いただけないでしょうか…よろしくお願い致します。
■
ご存じだとは思うのですが、
VBAの開発環境では、
・ステップ実行
・ブレイクポイントの設定
ができるはずですので、
実際に、ステップ実行させたら、動作がよくわかるのでは?と思います。
■
>If Not AnimalReportNumberSQL(makeSQL) Then
この1行を実行する場合は、
まず AnimalReportNumberSQL(makeSQL) 部分が実行されるはずです。
AnimalReportNumberSQL()は、ユーザー定義関数だと思われますので、
当然、
Public Function AnimalReportNumberSQL(ByRef makeSQL As String) As Boolean
に飛びます。
で、その関数内で処理が終わったら、
元に戻ってきて、
AnimalReportNumberSQL(makeSQL)の返り値(戻り値)に NOT演算したものを評価して
真なら、 Exit Function
義なら、End Ifの次の行に飛びます。
「If Not (通過条件) Then Exit Function」構文では、通過条件を満たさない(Falseの)とき、処理を中止して、If文のあるところを抜けるようになっています。
ここでは、通過条件はAnimalReportNumberSQL()になっていて、If文中の条件を評価するときに、この関数に飛ばしています。
この関数は、返値が、Booleanになっていますが、この関数の真の目的は、参照型変数makeSQLを返すことです。これに成功したら、Trueで下に処理を続け,失敗したらFalseで処理を中止しようとしています。
はじめに、Falseを設定していて、失敗して途中で抜けたら、そのまま、Falseを返して、成功したら、最後に、Trueに設定し直して出ているのではないでしょうか。
Notがありました!つまりfalseでなければ、exit functionに行くのですね。
最後のTrue設定がAnimalReportNumberSQL = Falseの時のNot False、Trueというわけですね。
ありがとうございます。何となく府に堕ちました(^^;)
■
ご存じだとは思うのですが、
VBAの開発環境では、
・ステップ実行
・ブレイクポイントの設定
ができるはずですので、
実際に、ステップ実行させたら、動作がよくわかるのでは?と思います。
■
>If Not AnimalReportNumberSQL(makeSQL) Then
この1行を実行する場合は、
まず AnimalReportNumberSQL(makeSQL) 部分が実行されるはずです。
AnimalReportNumberSQL()は、ユーザー定義関数だと思われますので、
当然、
Public Function AnimalReportNumberSQL(ByRef makeSQL As String) As Boolean
に飛びます。
で、その関数内で処理が終わったら、
元に戻ってきて、
AnimalReportNumberSQL(makeSQL)の返り値(戻り値)に NOT演算したものを評価して
真なら、 Exit Function
義なら、End Ifの次の行に飛びます。
ちなみに、いただいたサンプルプログラムなのですが。
Accessの場合、Excel VBAで標準モジュールで実行するみたいに。
フォームとかフォームのボタンとかをクリックしたときのイベントプロシージャとかでなくても。
上記プログラムだけの実行は、できますでしょうか?
その場合、Accessのどの画面から稼働させればよいのでしょうか…度々すみません。
質問は締め切ってしまいましたが、もし気が向きましたらご助言いただけますと幸いです。
よろしくお願い致します<m(__)m>
AutoExec マクロは、単に AutoExec という名前が付けられたマクロです。 データベースの起動時、Access で他のマクロや VBA コードが実行される前に、AutoExec マクロが実行されます。
データベースを開いたときに実行されるマクロを作成する - Access
https://support.office.com/ja-jp/article/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E9%96%8B%E3%81%84%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-98ba1508-dcc6-4e0f-9698-a4755e548124
Public Function FncTest(ByRef aa As String) As Boolean
FncTest = False
aa = "123456"
End Function
Public Function Main() As Boolean
aa= "xxx"
bb = FncTest(aa)
Debug.Print aa
Debug.Print bb
End Function
AutoExec マクロを作成して、
そのマクロで、Main()が実行されるように設定すれば
どうでしょうか?
ちなみに、いただいたサンプルプログラムなのですが。
2019/12/10 18:28:42Accessの場合、Excel VBAで標準モジュールで実行するみたいに。
フォームとかフォームのボタンとかをクリックしたときのイベントプロシージャとかでなくても。
上記プログラムだけの実行は、できますでしょうか?
その場合、Accessのどの画面から稼働させればよいのでしょうか…度々すみません。
質問は締め切ってしまいましたが、もし気が向きましたらご助言いただけますと幸いです。
よろしくお願い致します<m(__)m>
データベースを開いたときに実行されるマクロを作成する - Access
2019/12/10 18:49:46https://support.office.com/ja-jp/article/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E9%96%8B%E3%81%84%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-98ba1508-dcc6-4e0f-9698-a4755e548124
Public Function FncTest(ByRef aa As String) As Boolean
FncTest = False
aa = "123456"
End Function
Public Function Main() As Boolean
aa= "xxx"
bb = FncTest(aa)
Debug.Print aa
Debug.Print bb
End Function
AutoExec マクロを作成して、
そのマクロで、Main()が実行されるように設定すれば
どうでしょうか?