1610085227 Accessでフォームに存在しないコントロールを利用し、実際に存在するテキストボックスに値を書き込む処理が疑問です


前回の質問 https://q.hatena.ne.jp/1607063155 で、ご回答いただいた方に、AテーブルからBテーブルにデータを書き込むシステムのサンプルをいただきました。

そのシステム内のとある処理の動きを、何回も行っていました。

添付ファイルにありますように「InsertSQL + select」ボタンを押して、レコードが挿入されていく処理を見ていました。
「Trucate」ボタンでデータを消して、また「InsertSQL + select」ボタンを押す…を、繰り返しました。

処理を見ていると、

------------
PrintTickCount Me.txtResult2
------------

という1行を通り、呼び出されたPrintTickCount関数内の、

------------
ctl.Value = ctl.Value & Format((Timer - mdblStartTime), "#,##0.00") & "sec." & vbCrLf
------------

を通った後、「InsertSQL + select」下の白枠内に、処理に要した時間の値が記入されていました。
「おおー」と思ったのですが、よくよく考えますと…この1行がよくわかりません。

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2021/01/13 13:35:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:moon-fondu

"ctl"という変数は、前の行で、

Private Sub PrintTickCount(ByRef ctl As Control)

と、引数として定義されています。

しかし、このControl型の変数ctlは、実際のフォーム内には、どこにも存在していないです。

時間が記入されたのは"txtResult2"というテキストボックスでして、ctlという名称のボタンやテキストボックス等は、フォーム内のどこにも見当たりません。

そこで、実際のフォーム内にあるテキストボックス"txtResult2"を指定するように、

-------------

txtResult2.Value = txtResult2.Value & Format((Timer - mdblStartTime), "#,##0.00") & "sec." & vbCrLf

-------------

と変えてみましたところ、このように変えても、秒数をテキストボックス内に記入することができました。

しかし…ctlという存在しないコントロール型の変数を利用して、テキストボックス"txtResult2"に値を入れることができる理由は、わからないままです。

どうしてctlという変数で別名称のテキストボックスへの書き込みが可能なのかにつきまして、ご教授いただけますと幸いです。

利用しているシステムは、

64bit版 https://xfs.jp/N5kxYj

32bit版 https://xfs.jp/3Szyt2

になります。

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

ベストアンサー

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154

ポイント1500pt

プログラム方面の言葉で言うと、「仮引数」という呼び方をします。

Sub sub(a as Variant)
	...
End Sub


Dim b As Variant
Set b = ...
Call sub(b)

Dim c As Variant
Set c = ...
Call sub(c)

サブルーチンは、使いまわしが効くように、処理をまとめたものです。

「何」に対して処理をするのか、は、場合によって変わります。


「何」が変わっても良いように、サブルーチンの定義では、その対象に仮に名前を付けます。

これが「仮引数」です。


そのサブルーチンを使う側では、引数に(型が合ってる、という前提はつきますが)任意の変数を指定します。

サブルーチンでは、呼び出し側の都合は分からないので、仮につけた変数名を対象にして処理を書きます。


そこで、実際のフォーム内にあるテキストボックス"txtResult2"を指定するように、

という辺りは、「変数のスコープ」というキーワードで検索すると、情報が引っかかります。


txtResult2 という変数は、コードのどこでも使える、「グローバルなスコープ」を持った変数です。


PrintTickCount というサブルーチンを、別の変数でも使いたい、という場面が出てきたときには、txtResult2 という記述が邪魔になります。


他の変数でも、同じ処理を使いたい。

そういうときの解決手段が、「仮引数」です。

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

VBAの用法として、何のプロパティ?メソッド?を利用しているのか、知りたいです。

私は、

「Me.txtResult2.Value(PrintTickCount)」

ではないかと思い、記述を変更してみたのですが。

これ、どうしてそうなると思ったのかが、ちょっとぼくには分からないです。

今回の質問ではソースコードが明示されていないので、想像で書きます。

Me.txtResult2.Value(PrintTickCount)

この書き方だと、Me.txtResult2 という(テキストボックスであろう)オブジェクトが持つ、Value という名前のメソッドを、PrintTickCount という変数を引数に指定して呼び出す、という意味になります。

テキストボックスは、Value という名のメソッドは持っていませんし、PrintTickCount は関数名なので、引数の指定が必要で、その指定が無いので、「引数は省略できません」というエラーになります。


「PrintTickCount Me.txtResult2」で、なぜ、テキストボックスに値表示されるのでしょうか。

かっこが省略されているから、先のような書き換えができると思ったのでしょうか。

↑は↓です。

PrintTickCount(Me.txtResult2)

一方、書き換えてみた、の方は↓です。

Me.txtResult2.Value(PrintTickCount)

かっこを省略せずに記述すると、それぞれの記述に互換がなさそうなのが分かるのではないかと思います。

2021/01/12 18:38:52
id:moon-fondu

Me.txtResult2.Value(PrintTickCount) は、値を表示するためのvalueプロパティを利用してみたつもりなのですが…曖昧な理解で書いてしまいすみません(;'∀')

なぜだめなのかという理由をしっかり説明していただきまして、ありがとうございます。覚えておきます( ..)φ

「PrintTickCount(Me.txtResult2)」だったのですね。こちらは、関数に対応する引数が入ってるのがしっかり把握できますね!

ありがとうございます!!

2021/01/13 13:32:12

その他の回答0件)

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154ここでベストアンサー

ポイント1500pt

プログラム方面の言葉で言うと、「仮引数」という呼び方をします。

Sub sub(a as Variant)
	...
End Sub


Dim b As Variant
Set b = ...
Call sub(b)

Dim c As Variant
Set c = ...
Call sub(c)

サブルーチンは、使いまわしが効くように、処理をまとめたものです。

「何」に対して処理をするのか、は、場合によって変わります。


「何」が変わっても良いように、サブルーチンの定義では、その対象に仮に名前を付けます。

これが「仮引数」です。


そのサブルーチンを使う側では、引数に(型が合ってる、という前提はつきますが)任意の変数を指定します。

サブルーチンでは、呼び出し側の都合は分からないので、仮につけた変数名を対象にして処理を書きます。


そこで、実際のフォーム内にあるテキストボックス"txtResult2"を指定するように、

という辺りは、「変数のスコープ」というキーワードで検索すると、情報が引っかかります。


txtResult2 という変数は、コードのどこでも使える、「グローバルなスコープ」を持った変数です。


PrintTickCount というサブルーチンを、別の変数でも使いたい、という場面が出てきたときには、txtResult2 という記述が邪魔になります。


他の変数でも、同じ処理を使いたい。

そういうときの解決手段が、「仮引数」です。

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

VBAの用法として、何のプロパティ?メソッド?を利用しているのか、知りたいです。

私は、

「Me.txtResult2.Value(PrintTickCount)」

ではないかと思い、記述を変更してみたのですが。

これ、どうしてそうなると思ったのかが、ちょっとぼくには分からないです。

今回の質問ではソースコードが明示されていないので、想像で書きます。

Me.txtResult2.Value(PrintTickCount)

この書き方だと、Me.txtResult2 という(テキストボックスであろう)オブジェクトが持つ、Value という名前のメソッドを、PrintTickCount という変数を引数に指定して呼び出す、という意味になります。

テキストボックスは、Value という名のメソッドは持っていませんし、PrintTickCount は関数名なので、引数の指定が必要で、その指定が無いので、「引数は省略できません」というエラーになります。


「PrintTickCount Me.txtResult2」で、なぜ、テキストボックスに値表示されるのでしょうか。

かっこが省略されているから、先のような書き換えができると思ったのでしょうか。

↑は↓です。

PrintTickCount(Me.txtResult2)

一方、書き換えてみた、の方は↓です。

Me.txtResult2.Value(PrintTickCount)

かっこを省略せずに記述すると、それぞれの記述に互換がなさそうなのが分かるのではないかと思います。

2021/01/12 18:38:52
id:moon-fondu

Me.txtResult2.Value(PrintTickCount) は、値を表示するためのvalueプロパティを利用してみたつもりなのですが…曖昧な理解で書いてしまいすみません(;'∀')

なぜだめなのかという理由をしっかり説明していただきまして、ありがとうございます。覚えておきます( ..)φ

「PrintTickCount(Me.txtResult2)」だったのですね。こちらは、関数に対応する引数が入ってるのがしっかり把握できますね!

ありがとうございます!!

2021/01/13 13:32:12

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

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

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

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

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