VBAのif not~then文で条件が成立するかどうかを判定する際に、引数や計算式が何も入っていない場合にエラー文に飛べるのかが疑問です


今、VBAのコードで、疑問に直面しておりまして。
Water関数の中身がしっかり理解できず、質問させていただきます。

コードはこちら
https://gist.github.com/AuroraNorthernQuarter/0eb129a8499fcf2468da70796a4054ae
になります。

前回の、

Access VBAにおけるDo...Loopステートメント内にあるAdd Trueメソッド?につきまして
https://q.hatena.ne.jp/1590393229

という質問で提示させていただいたコードに似ていますが、新たに疑問が生じました。

疑問は4つあります。

(1)if not文から「Water」関数に飛んだのですが。「~でない(nothing)」時にexit_procに飛ぶとは思うのですが。「Waterではない」というのは、どういう条件なのでしょうか?そもそも「Water()」は条件式になってないような…引数も何もないですし。どういう条件を満たした時にexit_procに飛ぶのでしょうか。

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2020/07/08 05:26:07
id:moon-fondu

(2)「clng(format(me.txtdate.value,"yyyymmdd"))」の箇所ですが、clng関数で値を偶数の整数に丸めている https://officedic.com/excel-vba-howto-clng/ というのは判りました。
しかし"yyyymmdd"と、明らかに年月日を指定する形式ですが。
こういう年月日を、整数とか偶数といった尺度で判定するのがすごく違和感がありまして…年月日なので、別に小数点が混じることないでしょうし、偶数とか奇数とかいうのも気にすることでもないでしょうし、不要な気がします。

こういう式は、VBAのプログラムであり得ることなのでしょうか?

(3)「accounting.add true, .fields(0).value & "#" & .fields(1).value」につきまして、前回も質問させていただきましたが。https://q.hatena.ne.jp/1590393229
今回のコードの場合、addメソッドは、1番目として追加するオブジェクトが「true」、2番目で指定しているものが「fields(0).value & "#" & .fields(1).value」という認識で正しいでしょうか。

(4)「if not accounting is nothing then set accounting = nothing」につきまして、これも、

Acceess VBAで行われている処理の中身が把握できません
https://q.hatena.ne.jp/1588900948

にて、1度質問させていただきました。その際、

------------------------
>オブジェクトが代入される変数では、Nothing を代入すると、そのオブジェクトがメモリから解放される
>aquarium is nothingでaquariumがnothingか調べます。それをnotで否定するのでaquariumがnothingで無い、つまりaquariumに何かが設定されているのならnothingを代入して解放するという意味になります。
------------------------

というご回答をいただきました。

しかしNothingを代入したら…何かいいことあるのでしょうか?やる意義が今いちピンときていない状況でして。Nothingを代入する目的をもう少し知れたらなぁと考えています。

たくさん質問してしまい恐れ入りますが、お手隙の時にお力添えいただけますと幸いです。
よろしくお願い致します。

ベストアンサー

id:a-kuma3 No.2

回答回数4865ベストアンサー獲得回数2098

ポイント1000pt

>(1)if not文から「Water」関数に飛んだのですが。「~でない(nothing)」時にexit_procに飛ぶとは思うのですが。「Waterではない」というのは、どういう条件なのでしょうか?

本物の方の関数名がどうなっているのか分かりませんが、Water 関数は、想定通りに動くと True を返します。
期待していないエラーが起きた場合には、False を返します。

「Waterではない」と読んでしまうと訳が分かりませんが、以下のコードと同じことをやっていると思うと、何となく分かりませんか?

success = Water()                   ' きちんと動いたら True
if success then GoTo exit_proc      ' きちんと動いたら、exit_proc に goto



> (2)「clng(format(me.txtdate.value,"yyyymmdd"))」の箇所ですが、clng関数で値を偶数の整数に丸めている
違います。
Clng 関数は、数字っぽい文字列を Long (数字の型) に変換します。

Excel で、表示形式が日付/時刻になっている場合、そのセルには 1900年1月1日 0:00 が 1 で、日が増えると 1 ずつ増える値になっています。
この回答を書いている 2020/7/3 0:00 は、44015 という値です。

それを、format(me.txtdate.value,"yyyymmdd") は、日付っぽい文字列にします。
me.txtdate.value が 44015 であれば、それを "20200703" という文字列に変換します。

Clng は、その文字列 "20200703" を 20200703 という整数に変換します。



> (3)「accounting.add true, .fields(0).value & "#" & .fields(1).value」につきまして、
その認識で合ってます。



> (4)「if not accounting is nothing then set accounting = nothing」につきまして、
オブジェクトの参照を指定して New したり、CreateObject で作ったものは、最後に Nothing を代入する、と覚えておいてください。

「何かいいことあるのでしょうか?」ですが、使っているこちらは細かいことを知らなくても良いけれど、色々な後始末をしてくれている、と思ってください。

ひとつ前の質問で、テキストファイルを扱うのがあったじゃないですか。
あれは、Open で使う準備をして、Close でお終い、というセットになっているのですけれど、それと同じだと思ってください。

他1件のコメントを見る
id:a-kuma3

度々の質問で恐れ入ります。(1)と(3)につきまして再度、お手隙の時に見解をお伺いできたらと思います。

では、まず (1) から。

イミディエイトウィンドウで、Water の値を見るのは止めてください。
却って混乱します。

VB や VBA の Function は、戻り値の指定の仕方が他の言語と比べてかなり特殊だ、と他の質問で回答した記憶があります。
変数と関数の区別が、ぼんやりしているんです。

ご自身が経験したように、関数を呼び出す前にその名前の値を見ると、訳が分からなくなります。


次、(3) です。

想像ですが、その Collection は、値があったという目印のために使ってます。
コードが省略されているところかどこかで、その Collection (accouting) に値があるかどうかを確認しているところがあると思います。

突っ込む値は何でも構わないんです。

accouting.add "a-kuma3", ...

みたいに、変な文字列でも。
思わせぶりな値を入れるよりは、意味が薄い True を入れた方が良いだろう、と思ったのだと思います(書いた人が)。

2020/07/06 21:58:39
id:moon-fondu

ありがとうございます、そうですよね。
イミディエイトウインドウでTrueかFalseよりも、どういう処理が行われるかが大事ですよね。
あまり気にしないようにします(^^;

確認しているところ…探してみます。一部抜粋の質問ですみません💦
値があるという目印ですか、addメソッドでそういう使い方もするんですね。

2020/07/07 09:31:43

その他の回答1件)

id:kaoato No.1

回答回数195ベストアンサー獲得回数76

ポイント700pt

>(1)if not文から「Water」関数に飛んだのですが。

Debug.Print Water()
if not Water() then GoTo exit_proc

上記のようにして、Water()の戻り値をイミディエイトウィンドウに表示させては?


Water()内部でエラーが発生したら、GoTo exit_procが実行される


Water()関数をみると、

Water = false
Water = true

があるけど、これが関数の戻り値の設定をしてる箇所。

関数内部でエラーになると、falseを返す


https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/function-statement


VBAのfunction の戻り値は、関数名に値を代入することで設定する

他3件のコメントを見る
id:kaoato


if not Water() then GoTo exit_proc


ret = Water()
if not ret then GoTo exit_proc

分けて書いても同じ


ret = Water()
Debug.Print ret
if not ret then GoTo exit_proc

2020/07/07 14:03:47
id:moon-fondu

失礼しました。

ret = Water()
if not ret then GoTo exit_proc

は、「if not Water() then GoTo exit_proc」よりもわかりやすいです。
ref、すなわちwater()が処理されなけば、というNot条件のとき、exit_procに行けるんですね。
処理されなけば処理を終えられる。
それが、Water()内部でエラーが発生したときで、処理が完了しなかったときなんですね。

自分はこういう書き方が出来るようになりたいです。

2020/07/07 17:36:03
id:a-kuma3 No.2

回答回数4865ベストアンサー獲得回数2098ここでベストアンサー

ポイント1000pt

>(1)if not文から「Water」関数に飛んだのですが。「~でない(nothing)」時にexit_procに飛ぶとは思うのですが。「Waterではない」というのは、どういう条件なのでしょうか?

本物の方の関数名がどうなっているのか分かりませんが、Water 関数は、想定通りに動くと True を返します。
期待していないエラーが起きた場合には、False を返します。

「Waterではない」と読んでしまうと訳が分かりませんが、以下のコードと同じことをやっていると思うと、何となく分かりませんか?

success = Water()                   ' きちんと動いたら True
if success then GoTo exit_proc      ' きちんと動いたら、exit_proc に goto



> (2)「clng(format(me.txtdate.value,"yyyymmdd"))」の箇所ですが、clng関数で値を偶数の整数に丸めている
違います。
Clng 関数は、数字っぽい文字列を Long (数字の型) に変換します。

Excel で、表示形式が日付/時刻になっている場合、そのセルには 1900年1月1日 0:00 が 1 で、日が増えると 1 ずつ増える値になっています。
この回答を書いている 2020/7/3 0:00 は、44015 という値です。

それを、format(me.txtdate.value,"yyyymmdd") は、日付っぽい文字列にします。
me.txtdate.value が 44015 であれば、それを "20200703" という文字列に変換します。

Clng は、その文字列 "20200703" を 20200703 という整数に変換します。



> (3)「accounting.add true, .fields(0).value & "#" & .fields(1).value」につきまして、
その認識で合ってます。



> (4)「if not accounting is nothing then set accounting = nothing」につきまして、
オブジェクトの参照を指定して New したり、CreateObject で作ったものは、最後に Nothing を代入する、と覚えておいてください。

「何かいいことあるのでしょうか?」ですが、使っているこちらは細かいことを知らなくても良いけれど、色々な後始末をしてくれている、と思ってください。

ひとつ前の質問で、テキストファイルを扱うのがあったじゃないですか。
あれは、Open で使う準備をして、Close でお終い、というセットになっているのですけれど、それと同じだと思ってください。

他1件のコメントを見る
id:a-kuma3

度々の質問で恐れ入ります。(1)と(3)につきまして再度、お手隙の時に見解をお伺いできたらと思います。

では、まず (1) から。

イミディエイトウィンドウで、Water の値を見るのは止めてください。
却って混乱します。

VB や VBA の Function は、戻り値の指定の仕方が他の言語と比べてかなり特殊だ、と他の質問で回答した記憶があります。
変数と関数の区別が、ぼんやりしているんです。

ご自身が経験したように、関数を呼び出す前にその名前の値を見ると、訳が分からなくなります。


次、(3) です。

想像ですが、その Collection は、値があったという目印のために使ってます。
コードが省略されているところかどこかで、その Collection (accouting) に値があるかどうかを確認しているところがあると思います。

突っ込む値は何でも構わないんです。

accouting.add "a-kuma3", ...

みたいに、変な文字列でも。
思わせぶりな値を入れるよりは、意味が薄い True を入れた方が良いだろう、と思ったのだと思います(書いた人が)。

2020/07/06 21:58:39
id:moon-fondu

ありがとうございます、そうですよね。
イミディエイトウインドウでTrueかFalseよりも、どういう処理が行われるかが大事ですよね。
あまり気にしないようにします(^^;

確認しているところ…探してみます。一部抜粋の質問ですみません💦
値があるという目印ですか、addメソッドでそういう使い方もするんですね。

2020/07/07 09:31:43

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません