VBAでIf文に入らずに別のFunctionに飛ぶ理由がわかりません


判りにくい質問ですみません、どういうことかといいますと。
今、以下のようなコードがあります。

-----------------
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人10回まで
  • 登録:
  • 終了:2019/12/10 18:24:51
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:moon-fondu

この動きが全く分かりません…なぜ(1)のIf Not文から(2)に飛ぶのでしょうか。(1)で条件を満たさない、If Not(でなければ)であれば、If Not文の中、(1)の「Exit Fuction」に進むか。

もしくはIf Not(でなければ)を満たさないのであれば、(1)のEnd Ifに進むのが、コード通りではないでしょうか。

(1)から(2)に飛ぶ理由をご説明いただけないでしょうか…よろしくお願い致します。

ベストアンサー

id:kaoato No.2

回答回数236ベストアンサー獲得回数86

ポイント1000pt


ご存じだとは思うのですが、

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の次の行に飛びます。

他7件のコメントを見る
id:moon-fondu

ちなみに、いただいたサンプルプログラムなのですが。
Accessの場合、Excel VBAで標準モジュールで実行するみたいに。
フォームとかフォームのボタンとかをクリックしたときのイベントプロシージャとかでなくても。

上記プログラムだけの実行は、できますでしょうか?
その場合、Accessのどの画面から稼働させればよいのでしょうか…度々すみません。
質問は締め切ってしまいましたが、もし気が向きましたらご助言いただけますと幸いです。
よろしくお願い致します<m(__)m>

2019/12/10 18:28:42
id:kaoato

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:49:46

その他の回答1件)

id:rsc96074 No.1

回答回数4497ベストアンサー獲得回数436

ポイント1000pt

 「If Not (通過条件) Then Exit Function」構文では、通過条件を満たさない(Falseの)とき、処理を中止して、If文のあるところを抜けるようになっています。
 ここでは、通過条件はAnimalReportNumberSQL()になっていて、If文中の条件を評価するときに、この関数に飛ばしています。
 この関数は、返値が、Booleanになっていますが、この関数の真の目的は、参照型変数makeSQLを返すことです。これに成功したら、Trueで下に処理を続け,失敗したらFalseで処理を中止しようとしています。

他2件のコメントを見る
id:rsc96074

はじめに、Falseを設定していて、失敗して途中で抜けたら、そのまま、Falseを返して、成功したら、最後に、Trueに設定し直して出ているのではないでしょうか。

2019/12/09 15:00:19
id:moon-fondu

Notがありました!つまりfalseでなければ、exit functionに行くのですね。
最後のTrue設定がAnimalReportNumberSQL = Falseの時のNot False、Trueというわけですね。
ありがとうございます。何となく府に堕ちました(^^;)

2019/12/09 22:08:56
id:kaoato No.2

回答回数236ベストアンサー獲得回数86ここでベストアンサー

ポイント1000pt


ご存じだとは思うのですが、

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の次の行に飛びます。

他7件のコメントを見る
id:moon-fondu

ちなみに、いただいたサンプルプログラムなのですが。
Accessの場合、Excel VBAで標準モジュールで実行するみたいに。
フォームとかフォームのボタンとかをクリックしたときのイベントプロシージャとかでなくても。

上記プログラムだけの実行は、できますでしょうか?
その場合、Accessのどの画面から稼働させればよいのでしょうか…度々すみません。
質問は締め切ってしまいましたが、もし気が向きましたらご助言いただけますと幸いです。
よろしくお願い致します<m(__)m>

2019/12/10 18:28:42
id:kaoato

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:49:46

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません