前回の質問 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行がよくわかりません。
"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
になります。
よろしくお願い致します。
プログラム方面の言葉で言うと、「仮引数」という呼び方をします。
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 という記述が邪魔になります。
他の変数でも、同じ処理を使いたい。
そういうときの解決手段が、「仮引数」です。
プログラム方面の言葉で言うと、「仮引数」という呼び方をします。
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 という記述が邪魔になります。
他の変数でも、同じ処理を使いたい。
そういうときの解決手段が、「仮引数」です。
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)
かっこを省略せずに記述すると、それぞれの記述に互換がなさそうなのが分かるのではないかと思います。
Me.txtResult2.Value(PrintTickCount) は、値を表示するためのvalueプロパティを利用してみたつもりなのですが…曖昧な理解で書いてしまいすみません(;'∀')
なぜだめなのかという理由をしっかり説明していただきまして、ありがとうございます。覚えておきます( ..)φ
「PrintTickCount(Me.txtResult2)」だったのですね。こちらは、関数に対応する引数が入ってるのがしっかり把握できますね!
ありがとうございます!!
これ、どうしてそうなると思ったのかが、ちょっとぼくには分からないです。
今回の質問ではソースコードが明示されていないので、想像で書きます。
この書き方だと、Me.txtResult2 という(テキストボックスであろう)オブジェクトが持つ、Value という名前のメソッドを、PrintTickCount という変数を引数に指定して呼び出す、という意味になります。
テキストボックスは、Value という名のメソッドは持っていませんし、PrintTickCount は関数名なので、引数の指定が必要で、その指定が無いので、「引数は省略できません」というエラーになります。
かっこが省略されているから、先のような書き換えができると思ったのでしょうか。
↑は↓です。
一方、書き換えてみた、の方は↓です。
かっこを省略せずに記述すると、それぞれの記述に互換がなさそうなのが分かるのではないかと思います。
Me.txtResult2.Value(PrintTickCount) は、値を表示するためのvalueプロパティを利用してみたつもりなのですが…曖昧な理解で書いてしまいすみません(;'∀')
なぜだめなのかという理由をしっかり説明していただきまして、ありがとうございます。覚えておきます( ..)φ
「PrintTickCount(Me.txtResult2)」だったのですね。こちらは、関数に対応する引数が入ってるのがしっかり把握できますね!
ありがとうございます!!