• ベストアンサー

標準モジュールで 『Sub test(ByVal Target As Range)』は動かない?

選択されている複数のアドレスが知りたいので 標準モジュールに Sub test(ByVal Target As Range) Debug.Print Target.Address End Sub と書きました。 しかしF5ボタンを押しても何も起こりません。 デバッグ→コンパイルをしてもエラーになりません。 シートのイベントプロシージャーではなく 標準モジュールにした理由は イベント発生時ではなく、任意で起動させたいためです。 ためしに、 Sub test(ByVal Target As Range) Debug.Print Target.Address End Sub の下に、 Sub test2() Call test End Sub と書いたら、 「引数は省略できません。」 というエラーになりました。 何がダメなのかわかりません。 ご教授よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 今回は、初歩的なことですが、段階を経たほうがよいと思います。つまみ食いのようなことをしても、なかなか、VBAもWSHも覚えられないと思います。しかし、今回のように単発では、こちらの書いていることはほとんど分かってもらえないと思います。 今回は、サブルーチンのコードですが、サブルーチンを書くということは、それなりに、その前段階を理解していなくてはなりません。イベント・ドリブン型とは関係がありません。 それと、Target は、予約語ではありませんが、イベント・ドリブン型の引数に使われているものですから、他の語を使ったほうがよいです。それを許していると、自分ですらコードが読めなくなっていくはずです。 今回のようなコードを実際に書くことはありえませんが、ByVal キーワードは、入れるのと入れないのでは違いがありますが、Test1 側で、引数のデータ型が決めてあれば、入れなくても構わないです。Debug.Print としてしまったら、さっぱり、その意味が見えないでしょうけれども……。 F5を押しても、サブルーチンは呼び出さないと動きません。 それに、呼び出す場合は、引数を入れなければなりません。 '------------------------------------------- Sub Test1() Dim c As Range  '←これがあるので、ByVal は不要 For Each c In Range("A1:A10")  Call Test2(c) Next c End Sub 'サブルーチン(Target という名称は使わない) Sub Test2(rng As Range)   Debug.Print rng.Address   'Debug.Print では、良く意味が分からないはずです。   'Range オブジェクトを引数にしたら、いろんな使い方がある End Sub '-------------------------------------------

chdyet
質問者

お礼

基礎をしっかり理解したほうがいいですね。 ご回答ありがとうございます。

その他の回答 (2)

  • syowest
  • ベストアンサー率0% (0/3)
回答No.2

Excel VBA の場合、引数を持つ Sub を作成した場合、F5 を押しても実行はされません。Function をつくり、Cellに値を返させるほうが、作りやすいかと思います。 たとえば、 モジュールに、 Public Function tst(a As Range) tst = a.Address End Function という関数をつくり (ByVal は普通つけません)、 Sheet1 の a1 のセルに、=tst(A3:A6) と入力すると、以下の結果が返ります。 $A$3:$A$6

chdyet
質問者

お礼

”Excel VBA の場合、引数を持つ Sub を作成した場合、F5 を押しても実行はされません。” しっかり覚えます! ご回答ありがとうございます。

  • dr-9
  • ベストアンサー率47% (24/51)
回答No.1

まず質問される時は、回答する側にわかるように書かれると回答し易くなると思いますよ。 恐らくExcelのVBAでの質問ではないかと推測し書かせてもらいますが、標準モジュールにプロシージャを書くこと自体は問題無いです。 >しかしF5ボタンを押しても何も起こりません。 これも推測ですが、標準モジュールのtestプロシージャをそのまま実行した?のではないかと思いますが、testプロシージャの引数のTargetに何も入れていない為、Range.Addressプロパティも何も返せず、イミディエイトウィンドウに何も表示されなかったのではないかと思います。 >デバッグ→コンパイルをしてもエラーになりません。 文法等に問題が無ければエラーは出ません。意図している事のチェックをコンパイルでは行えません。スキルアップしかないと思います。 >イベント発生時ではなく、任意で起動させたいためです。 testプロシージャの引数のTargetに値を入れて呼び出せば良いと思います。 ただ、シートのイベントプロシージャでは、自動的に引数(Target等)に値を入れてくれるので、その辺りを考慮しなければなりません。 具体的にはあえて書きませんが、ヒント・例として、アクティブなワークシートで選択したセルを引数に入れる等記述すれば良いのではないかと思います。

参考URL:
http://www.relief.jp/itnote/
chdyet
質問者

お礼

ありがとうございます。

関連するQ&A