VBAにおける2つの引数を持つboolean型の関数と「Cancel As Integer」につきまして

今、以下のような関数があります。
https://gist.github.com/AuroraNorthernQuarter/8e8edeb7fdf3a12b0e15c071432a2a87
この関数は大まかに「リアルタイム情報」というテーブルにデータを挿入しているようですが。
いくつか疑問が生じまして。

(1)Touroku関数の2つの引数「byVal iSta as integer」「byval iNsta as integer」についてなのですが。boolean型にも関わらず、引数が2つあることに違和感を覚えました。
boolean型ならtrueかfalseの2つの結果しかないと思ったのですが。
iStaとiNstaのそれぞれに、trueかfalseが入る…という認識で正しいでしょうか?

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2020/07/14 16:07:57
id:moon-fondu

(2)「Touroku(byval iSta as integer,byval iNsta as integer)」を見て思い出したのですが。
今回の関数への疑問から少し話題が逸れるのですが、VBAのコードでよく「Cancel As Integer」という表現をされることがあると思います。前も質問したかもしれないのですが…該当の質問が見つからず…これが今でも、理解しきれていないです。

「Access VBAパーフェクトマスター」という分厚い本には、Cancelは引数として、

「この引数にTrueを代入すると、コントロールのフォーカスを移す動作をキャンセルすることで、他のコントロールにフォーカスを移すことができない状態にすることができます」

と、説明されておりますが、いまいちピンときていません。

引数としてCancelを利用するのでしたら、今回の例でいうとiStaやiNstaのように、引数に値を代入したり処理を加えたりすると思うのですが。
「Cancel As Integer」という文言が引数になっている場合、"Cancel"という変数に対して、それに対して何かを代入したり処理したり等、何も処理が書かれていたりしないのです。

ですので「Cancel As Integer」を何のために書いているのか、一向にわからないまま、VBAと向き合っているのですが。
一体何を意味するか…どういう場合に書く必要が生じるのか、お教えいただけますと幸いです。

よろしくお願い致します。

ベストアンサー

id:a-kuma3 No.1

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

ポイント1000pt

(1) について。

iStaとiNstaのそれぞれに、trueかfalseが入る…という認識で正しいでしょうか?

その認識で合っています。
関数 Touroku は、以下の四パターンで呼ばれる可能性があります。

x = Touroku(True, True)
x = Touroku(True, False)
x = Touroku(False, True)
x = Touroku(False, False)



(2) について。
イベント処理のときの話ですよね、きっと。
https://docs.microsoft.com/ja-jp/office/vba/api/access.textbox.exit

これは、ドキュメントに書いていることをそのまま飲み込んでください。

名前 必須 / オプション データ型 説明
Cancel 必須 整数型 (Integer) True に設定すると、イベントは取り消されます。




Xxx_Exit の引数 Cancel に、イベントプロシージャ内で True を設定すると、そのイベントはキャンセルされます。
つまり、そのテキストボックスからフォーカスが外れたときに、このイベントプロシージャが呼ばれるのですが、処理が終わって抜けたときに、テキストボックスのフォーカスは、そこに残ったままになります。
例えば、数字以外の入力をさせたくない、とか、別のテキストボックスの数字と足して10以内にしたいとか、強制的にもう一度入力をし直してもらいたいときのような。

イベントをキャンセルする必要が無いときには、引数 Cancel に対して、何も代入する必要はありません。


普通のサブルーチンでは、外から中に値を渡すときに引数が使われます(外に持ち出すときにも利用できます)。
イベントプロシージャは、サブルーチンの特殊な形で、自分で明示的に呼び出すわけではなく、何かのタイミング(イベントが発生した、というような言い方をします)のときに呼び出されます。
自分では呼び出す処理は書いていませんが、どこかに呼び出している人が居るので、その処理毎に引数の個数と型が決まっています。


あと、気持ちが悪いところというと、Integer の引数に Boolean の定数である True を代入するところでしょうか。
VB / VBA では、Boolean は整数に型変換ができます。True は、整数だと -1 です。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/data-types/boolean-data-type

なので、以下のように書いても、True を代入した場合と同じように動きます。

    Cancel = -1

この辺りは、こんなものだ、と覚えておいて良いと思います。
イベントプロシージャを呼び出している側の都合で、最初のふたつの引数の型は Integer と決まってる、ということなのですが、ドキュメントの説明の範囲だけ知っていれば、VBA のプログラムは作れますので。

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

つまりカーソルが外れたときのExitイベントを実行するために「Cancel As Integer」という記述は、必要。省略してはいけない。

ドキュメントに「必須」と記載されているので、書くようにする、と理解しておけば良いと思います。
https://docs.microsoft.com/ja-jp/office/vba/api/access.textbox.exit

2020/07/14 10:53:51
id:moon-fondu

ありがとうございます!

2020/07/14 16:07:26

その他の回答1件)

id:a-kuma3 No.1

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

ポイント1000pt

(1) について。

iStaとiNstaのそれぞれに、trueかfalseが入る…という認識で正しいでしょうか?

その認識で合っています。
関数 Touroku は、以下の四パターンで呼ばれる可能性があります。

x = Touroku(True, True)
x = Touroku(True, False)
x = Touroku(False, True)
x = Touroku(False, False)



(2) について。
イベント処理のときの話ですよね、きっと。
https://docs.microsoft.com/ja-jp/office/vba/api/access.textbox.exit

これは、ドキュメントに書いていることをそのまま飲み込んでください。

名前 必須 / オプション データ型 説明
Cancel 必須 整数型 (Integer) True に設定すると、イベントは取り消されます。




Xxx_Exit の引数 Cancel に、イベントプロシージャ内で True を設定すると、そのイベントはキャンセルされます。
つまり、そのテキストボックスからフォーカスが外れたときに、このイベントプロシージャが呼ばれるのですが、処理が終わって抜けたときに、テキストボックスのフォーカスは、そこに残ったままになります。
例えば、数字以外の入力をさせたくない、とか、別のテキストボックスの数字と足して10以内にしたいとか、強制的にもう一度入力をし直してもらいたいときのような。

イベントをキャンセルする必要が無いときには、引数 Cancel に対して、何も代入する必要はありません。


普通のサブルーチンでは、外から中に値を渡すときに引数が使われます(外に持ち出すときにも利用できます)。
イベントプロシージャは、サブルーチンの特殊な形で、自分で明示的に呼び出すわけではなく、何かのタイミング(イベントが発生した、というような言い方をします)のときに呼び出されます。
自分では呼び出す処理は書いていませんが、どこかに呼び出している人が居るので、その処理毎に引数の個数と型が決まっています。


あと、気持ちが悪いところというと、Integer の引数に Boolean の定数である True を代入するところでしょうか。
VB / VBA では、Boolean は整数に型変換ができます。True は、整数だと -1 です。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/data-types/boolean-data-type

なので、以下のように書いても、True を代入した場合と同じように動きます。

    Cancel = -1

この辺りは、こんなものだ、と覚えておいて良いと思います。
イベントプロシージャを呼び出している側の都合で、最初のふたつの引数の型は Integer と決まってる、ということなのですが、ドキュメントの説明の範囲だけ知っていれば、VBA のプログラムは作れますので。

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

つまりカーソルが外れたときのExitイベントを実行するために「Cancel As Integer」という記述は、必要。省略してはいけない。

ドキュメントに「必須」と記載されているので、書くようにする、と理解しておけば良いと思います。
https://docs.microsoft.com/ja-jp/office/vba/api/access.textbox.exit

2020/07/14 10:53:51
id:moon-fondu

ありがとうございます!

2020/07/14 16:07:26
id:frkw2004 No.2

回答回数194ベストアンサー獲得回数21

ポイント500pt

(1)について
関数の戻り値の型(ここではBoolean)と関数の各引数の型には関係はありません。
この関数はiStaというInteger型とiNstaというInteger型の二つの引数を持つ戻り値がBoolean型の関数である、ということです。
iSta,iNstaの使い方を見ると、「リアルタイム情報」というテーブルに登録する内容なのでテーブルの定義を見た方が正確ですね。
(2)について
Cancel引数はByrefで定義されていたと思います。Byrefで定義された引数は呼び出し元の変数の値も変更されます(参照型の引数)。 Cancel=Trueにしてあげると呼び出し元でもCancel=Trueだから呼び出し元(ここではイベントを発生させるVBAのシステムのことですが)でCancel=True時の処理をするのだろう、ということです。その結果としてフォーカスが移動しない、と。
Boolean型のTrueは-1でFalse=0ですがIf文の内部判定では「TrueかFalseか」ではなく「Falseか、Falseでないか」と判定しています。つまり、
If 1 then
とすると1≠-1だからElseに行くわけではなくて1≠0なのでThen側の処理に進みます。

id:moon-fondu

戻り値がboolean型…なのですね。引数の型と、戻り値の型は、イコールではないということですね。
ありがとうございます。
「テーブルの定義」も確認します。

Cancel引数がbyrefで定義されているというのは、規定のルール的な話なのでしょうか?
「private function Touroku(byval iSta as integer,byval iNsta as integer) as boolean」のように、明確に引数がbyvalかbyrefか記述されている箇所は、cancelについては見当たらず…。

Cancel = Trueの時は、フォーカスが移動しないんですね。
サンプルプログラム探してみます。
フォーカスが移動できない、他のコントロールにカーソルが移動できないというプログラムは見たことがないので。

1はfalseとなる-1ではない、だからthenの処理に行けるんですね。

2020/07/14 09:56:21

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

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

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

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

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