Microsoft Access 掲示板

プロシージャの使い方 / 9

14 コメント
views
4 フォロー
9

まずは基本が理解できていないと、このスレッドの内容の理解は難しいかな。
私の説明もかなり端折ってますので。
すこしでも理解の助けになるように補足説明をしておきます。

まず、引数と何かを理解するようにしましょう。
一言では説明しきれないので「VBA 引数」でWEB検索して研究してみてください。
例えば、下記とか。
【Excel VBA入門】引数とは|エクセル マクロ | Gakushiki

引数がある程度理解出来たら、次はイベントプロシージャの引数ですが、
これは普通のプロシージャの引数とは少し違う働きをします。

例えば、キークリック時の場合は、

Private Sub コンボ_KeyDown(KeyCode As Integer, Shift As Integer)

の KeyCode As Integer, Shift As Integer の部分が引数になりますが、
KeyCode引数にはキーを押したときにどのキーを押したのかの情報が入っています。
Shift引数は、Shiftキー、Ctrlキー、Altキーが押されているかどうかの情報が入ってます。

さらに、この引数に値を代入することで、別のキーが押されたことに変更することもできます。

keyCode = vbKeySpace

とするとどのキーを押してもスペースキーが押されたことになります。そして、

keyCode = 0

とすると何もキーが押されなかったことになると決められています。

イベントにより引数があるものとないものがあります。これは決まっているのでユーザーが勝手に引数をいれることはできません。

他に、例えばフォームを開くときのイベントプロシージャなどのようにCancel引数があるものもあります。
このようなイベントは

Cancel = True

というようにTrueを代入するとイベント自体をキャンセル(なかったことにする)できます。
つまりフォームは開くことができないということになります。

このようにイベントプロシージャの引数は他のプロシージャの引数とはすこし役割が異なります。

次に、引数の値渡し(ByVal)と参照渡し(ByRef)の違いについて理解する必要が出てきます。
これもなかなか難解な概念なので、ここで説明するより「VBA ByVal ByRef」をキーワードに検索して、
いろいろなページで研究してください。

上のhirotonさんの投稿内で、下記のコードがありますが、

Private Sub proKey1(c As Integer)

これは、

Private Sub proKey1(ByRef c As Integer)

と同じコードになります。By〇〇 を省略したときは、ByRef になるというのがVBAの仕様なのです。
つまり、参照渡しをしていることになります。

参照渡しとは、簡単にいうと、変数そのものをそのまま渡しているということです。
いいかえると、一つの変数を別の場所から見たり、触ったりしているということです。
(これで伝わっているかな?)

つまり、下記の「これ」で指し示したものは、全て同じものです。

Private Sub コンボ_KeyDown(KeyCode As Integer, Shift As Integer)
                           ↑これ
    Call proKey1(KeyCode)
                 ↑これ
End Sub

Private Sub proKey1(c As Integer)
                    ↑これ
    Select Case c
    Case 9, 17, 67
        '何もしない
    Case Else
        c = 0
        ↑これ
    End Select
End Sub

つまり、
proKey1内で、

c = 0

としたということは、
コンボ_KeyDown内で、

keyCode = 0

としたことと同じ意味になるということです。

なんか回りくどい説明になりましたが、少しは理解の助けになったでしょうか。

通報 ...
  • 10
    hiroton 2024/03/08 (金) 09:25:49 f7b56@f966d >> 9

    アレです。正直何も分からないままやってしまってもいいんじゃないかなって内容なんですよね。デフォルトがByRefだからとかそういうのも
    VBAの使い始めなんかそのくらい適当でいいと思っているので

    エラーが出ないのが不思議だと何回か指摘していますが、「なんでもかんでもOn Error~していてうまくいっていないのにどこが原因か分からない」と同じ匂いを感じるんですよね。普通にやっていればそもそも動かないってこけているはずなので


    hiroton自身も特別なとは言っていますが、イベントプロシージャの引数は別に他のプロシージャと比較して特別なモノでもないんじゃないですかね。それこそ「記述を省略した参照渡し」なので

    大元の参照元(コントロールのイベント実行)から呼び出されるにあたって、「参照渡し」で引数を定義しているので、このプロシージャ内で操作した結果は元になるイベントの情報をそのまま書き換えている。と、それだけかと
    大元の参照元が隠されているというだけで、プロシージャとしての動きは特別なモノでもないと思います