今、以下のような関数があります。
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が入る…という認識で正しいでしょうか?
(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と向き合っているのですが。
一体何を意味するか…どういう場合に書く必要が生じるのか、お教えいただけますと幸いです。
よろしくお願い致します。
(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 のプログラムは作れますので。
(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 のプログラムは作れますので。
つまりカーソルが外れたときのExitイベントを実行するために「Cancel As Integer」という記述は、必要。省略してはいけない。
ドキュメントに「必須」と記載されているので、書くようにする、と理解しておけば良いと思います。
https://docs.microsoft.com/ja-jp/office/vba/api/access.textbox.exit
ありがとうございます!
(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側の処理に進みます。
戻り値が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 10:53:51https://docs.microsoft.com/ja-jp/office/vba/api/access.textbox.exit
ありがとうございます!
2020/07/14 16:07:26