
シートのイベントプロシージャーが
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
となりますが
(ByVal Target As Range)部分は何なのでしょうか?
何のためにあるのかわかりません。
Private Sub Worksheet_SelectionChange()
End Sub
としたらエラーが返ってきました。
理由を教えてください。
よろしくお願いします。
No.6ベストアンサー
- 回答日時:
こんにちは
>Target=ActiveCell
>と言う認識でよろしいでしょうか?
#5でKenKen_SPさんが説明されていますが、補足です。
セルを一つだけ選択したときには、
Target=ActiveCell
と考えても問題ありません
しかし、複数の範囲を選択したときは、
Target=ActiveCell
はなりません。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
です。
注!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
では
Target=Selection
成り立っていますが、そうでない場合もあります。
Selectionは「選択されている物」という意味です。
そのために、場合によって内容が異なります。
例えば、オートシェイプが選択されているときには、Selectionは選択されているオートシェイプになります。
以下のコードを試してみてください。
上段にTargetのアドレス
中段にActiveCellのアドレス
下段にSelectionのアドレス
が表示されます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address & Chr(13) & ActiveCell.Address & Chr(13) & Selection.Address
End Sub
No.5
- 回答日時:
最初のご回答にあるとおり、単純に変更のあったセルを教えてくれるもの
程度の説明が良い気がします。これは、理屈じゃなくて、
「そのように作られているもの」
と理解した方が良いでしょう。そして、実際に使ってみることです。理屈は
使ってさえいれば、あとからついてきますので。言葉で理解しようとしても
時間がかかるだけです。ただし、
Target ≠ ActiveCell
ですよ。イコールではありません。
ActiveCell はどのような操作であっても必ず1つですよね? 仮に複数の
セルが選択されていたとしても。
対して、例えば A1:C10 の範囲を選択した場合、Target には A1:C10 セル
が参照されてきます。つまり
Target = Range("A1:C10")
ですね。アクティブセルは A1 かもしれない、けど選択されたセルは A1:C10。
A1 ≠ A1:C10
ですから、アクティブセルと同意ではありません。
No.4
- 回答日時:
こんにちは。
最初に、あまり、そのような疑問は持たない方がよいです。聞いても良く分からないと思います。これを理解するために、C言語を勉強する、そうすると別の疑問が出てくる、また、オブジェクト指向の考え方を分からなくてはならない、と堂々めぐりになってしまいます。そういう私も、はっきり言って、このレベルは分かりません。
ただ、私の知っている範囲で初心者とか関係なく回答します。それは、私も初心者の頃があって、誠実に回答してくれない人たちがいました。自分が、分からないとしても、本物かそうでないかぐらいは分かりましたから。
こうしたものは、アプリケーションのクラス(設計図)の中にあるのだと思います。ExcelのCのコードを見たわけではありませんし、イベント・ドリブン型を作るプログラムの勉強をしたことがありません。それと、VBAでは、不安定ですが、まったく違う作り方をするからです。また、イベント・ドリブン型のクラスは、「お仕着せ」ですから、加工できません。
(ByVal Target As Range) 自体は、ByValは、値参照の引数の用語です。変数 Targetは、特に予約語ではないし、任意だけど、ユーザー変数と差別化をし、その変数名をイベント・ドリブン型の変数名として扱います。なお、ユーザーが、このTargetを変数で使うのはルールには外れています。その変数を、相手(アプリケーション)側の変数型を維持せずに、そのまま引数として取り込まないという、意味です。
Private Sub Worksheet_SelectionChange()
本来なら、クラスから、仕組まれてなければ、これはエラーになるはずがありません。エラーになるのは、Worksheet オブジェクトの中に、そういうクラスの仕組みがあるからです。
Private Sub MyWorksheet_SelectionChange() では、エラーが出ません。しかし、
'--------標準モジュール--------------
Public myClass As Class1
Sub Auto_Open()
Set myClass = New Class1
Set myClass.MyWorksheet = ThisWorkbook.Worksheets(1)
End Sub
'---------クラスモジュール(Class1)-------------
Public WithEvents MyWorksheet As Worksheet
Private Sub MyWorksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub
'--------------------------------------------
こうすれば、同じように、MyWorksheet は、イベント・ドリブン型となります。シートに組み込んだからです。Worksheet_SelectionChangeとは別の存在になります。なお、ByVal の部分を、ByRef(参照渡し)に書き換えても、これは、大元のアプリケーション側のクラスの設定ですから、エラーが発生します。理由は、Worksheet のクラスにはそのようなイベント・ドリブン型はないからです。
-------------------------------------
これはエラーが発生します。
Dim Target As Range 'モジュールスコープ
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set Target = Target '外に出せない(変数名を変えればTest1には来る)
Call Test1
End Sub
Sub Test1()
MsgBox Target.Address 'Target は来ていない
End Sub
--------------------------------------
これなら、通ります。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call Test1(Target)
End Sub
Sub Test1(Target As Range) 'Target を引数にする
MsgBox Target.Address
End Sub
--------------------------------------
どういうプログラムで送られているのか、私にはわかりません。
ByVal なのだから、Target のデータ型は、Range 型ではないかもしれないと思うので、
----------------------------------------
エラー発生
Private Sub Worksheet_SelectionChange(ByVal Target As Variant)
Private Sub Worksheet_SelectionChange(Target As Variant)
-----------------------------------------
ByVal というのは、相手から送られてきたデータ型を無視して、こちらの型にあわせるという意味と、相手から送られてきたデータを外に直接出さないということです。
Target は、単なる単語で、予約語でも何でもありませんから、
Target を myRng に換えてみました。
-----------------------------------------
これは通ります。
Sub Worksheet_SelectionChange(ByVal myRng As Range)
MsgBox Time
End Sub
------------------------------------------
これでも、コードが通ります。Private を付けておけば、よそからプロシージャを呼び出されることがありません。
結論としては、(ByVal Target As Range)は、Worksheetオブジェクトに仕組まれたクラスの中に、イベント・ドリブン型のコードがあるもので、Application から送られてきたものを、受け取る規定の引数=レセプタだと思います。
こんな話ではさっぱり分からないと思いますが……。
まずイベントドリブン型がなんだかわからないので調べてみます。
一生懸命回答いただいたのに理解できないくてすいません 汗
ありがとうございます。
No.3
- 回答日時:
こんなの自然にわかると思っていたが。
選択が変わったとき、
(1)変わったという事実も伝えてほしいのはもちろん
(2)どのセルで変わったか教えてほしいものだ
この(2)の役割を果たしてくれるのが ByVal Target As Range
で As Range はRange 易しく言うと内容はセルで知らせますと言うこと。MsgBox Target.Addressを入れてみると、数量的な目に見える形でセルの場所を表示できるようになる。
Private Sub Worksheet_SelectionChange()
End Sub
ここ()内(引数部分という)はユーザーが触るものでない。
この仕組みを作ったのはエクセルシステムでユーザーじゃない。他のイベントでこんな引数を返してほしいなあ、という場合も有るが、普通の技量ではどうしようもない。ユーザーが作るSUB、Functionプロシージァーなら自分で決めるのだから、ニーズによる。
質問者が作ったもので、引数を入れても入れなくても動くようにもかけるが質問者にとってずっと先のニーズだろう。
>ByValは概念的にByRefと対になっているが、VBAの上級に熟練するまでは、自分がプロシージュアーを作る場合のことで、ニーズが少ないだろう。気になるなら、GoogleでByRefで照会して記事を読むこと。
http://homepage1.nifty.com/CavalierLab/lab/vb/by …
など多数。
No.2
- 回答日時:
こんばんは
>(ByVal Target As Range)部分は何なのでしょうか?
例えば、以下のプログラムを試してみてください。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub
Targetには新たに選択させたセル(または範囲)が格納されます。
これによって、選択されたセルによって処理を変えることができます。
例えば
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.Value = "AAA"
End Sub
としておくと、選択したセルにAAAが表示されます。
Target.Row
Target.Column
Target.Address
などを使えば、特定の場所が選択されたときにだけ実行されるプログラムを作成できます。
>Private Sub Worksheet_SelectionChange()
>End Sub
>としたらエラーが返ってきました。
これは、
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
と「ByVal Target As Range」も含めて1つの「決まり文句」だと思ってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) ダブルクリックでセルの色を変える 1 2022/12/24 15:52
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Excel(エクセル) エクセルのイベントプロシージャーでF列の最終行のセルの入力をトリガーにしたいのですが 1 2022/10/14 09:36
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/06/10 11:06
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
特定セルの内容を更新したら、その更新日を自動的に表示する方法について
Excel(エクセル)
-
マクロ 実行ボタンを押さずに常に実行
Excel(エクセル)
-
-
4
標準モジュールで 『Sub test(ByVal Target As Range)』は動かない?
Excel(エクセル)
-
5
教えて For Each R In Target
Excel(エクセル)
-
6
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
7
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
8
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
9
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
10
Excelの条件付き書式設定の太い罫線
Excel(エクセル)
-
11
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
12
A1セルに入力したら、入力時間をA2セルに自動挿入
Excel(エクセル)
-
13
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
14
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
15
データが入力されている隣のセルに当日日付と時刻を入力するExcel VBAプログラム
Visual Basic(VBA)
-
16
Worksheet_Change(ByVal Target As Range)の下に複数範囲
Excel(エクセル)
-
17
エクセルマクロPrivate Subを複数にする方法
Excel(エクセル)
-
18
エクセルファイルを開く時、常に同じシートから開くようにするには?
Windows Vista・XP
-
19
excel:条件付き書式の適用範囲が変わる
Excel(エクセル)
-
20
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
枠に収まらない文字を非表示に...
-
セルをクリック⇒そのセルに入力...
-
(Excel)数字記入セルの数値の後...
-
Excel 例A(1+9) のように番地の...
-
エクセル オートフィルタで絞...
-
エクセルで指定したセルのどれ...
-
貼り付けで複数セルに貼り付けたい
-
excelの特定のセルの隣のセル指...
-
数式を残したまま、別のセルに...
-
エクセルの一つのセルに複数の...
-
対象セル内(複数)が埋まった...
-
Excelでのコメント表示位置
-
複数のセルのいずれかに数字が...
-
Excelで住所を2つ(町名迄と番...
-
EXCEL VBA セルに既に入...
-
エクセルの書式設定の表示形式...
-
【Excel】 セルの色での判断は...
-
EXCELのセルの中の半角カンマの...
-
Excelで数式内の文字色を一部だ...
-
エクセルで、複数の参照範囲を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで指定したセルのどれ...
-
貼り付けで複数セルに貼り付けたい
-
excelの特定のセルの隣のセル指...
-
枠に収まらない文字を非表示に...
-
エクセルの書式設定の表示形式...
-
数式を残したまま、別のセルに...
-
【エクセル】IF関数 Aまたは...
-
セルをクリック⇒そのセルに入力...
-
(Excel)数字記入セルの数値の後...
-
Excelで、「特定のセル」に入力...
-
Excel 例A(1+9) のように番地の...
-
対象セル内(複数)が埋まった...
-
EXCEL VBA セルに既に入...
-
エクセルの一つのセルに複数の...
-
【Excel】 セルの色での判断は...
-
Excelで数式内の文字色を一部だ...
-
エクセルのセルの枠を超えて文...
-
エクセル オートフィルタで絞...
-
Excelでのコメント表示位置
-
連続しないセルから最小値を引...
おすすめ情報