シートのイベントプロシージャーが
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
A1セルに入力したら、入力時間をA2セルに自動挿入
Excel(エクセル)
-
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
-
4
特定セルの内容を更新したら、その更新日を自動的に表示する方法について
Excel(エクセル)
-
5
標準モジュールで 『Sub test(ByVal Target As Range)』は動かない?
Excel(エクセル)
-
6
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
7
EXCEL VBA 選択範囲をTargetに
会計ソフト・業務用ソフト
-
8
値を入力後、自動的にアクティブセルが移動するマクロ
Excel(エクセル)
-
9
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
10
教えて For Each R In Target
Excel(エクセル)
-
11
あるセルに特定の文字列を打つと、他のセルに決められた文字が自動入力するように
Excel(エクセル)
-
12
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
13
Worksheet_Change(ByVal Target As Range)の下に複数範囲
Excel(エクセル)
-
14
Worksheet.Change イベントを他のシートにも反映させる方法?
Visual Basic(VBA)
-
15
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
16
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
17
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
18
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
19
エクセル マクロで セルの範囲を指定する方法
Visual Basic(VBA)
-
20
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
貼り付けで複数セルに貼り付けたい
-
(Excel)数字記入セルの数値の後...
-
Excelで数式内の文字色を一部だ...
-
エクセルの一つのセルに複数の...
-
Excelでのコメント表示位置
-
EXCEL VBA セルに既に入...
-
対象セル内(複数)が埋まった...
-
エクセルでオブジェクトを常に...
-
【Excel】 セルの色での判断は...
-
セルをクリック⇒そのセルに入力...
-
excelの特定のセルの隣のセル指...
-
エクセルの書式設定の表示形式...
-
【エクセル】IF関数 Aまたは...
-
エクセル “13ヶ月”を“1年1ヶ月...
-
エクセル 足して割る
-
Excelで教えてください。 バー...
-
エクセル オートフィルタで絞...
-
エクセルで指定したセルのどれ...
-
セルに特定の色が付いていたら...
-
セルの高さ(行高)を求めるには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
貼り付けで複数セルに貼り付けたい
-
【エクセル】IF関数 Aまたは...
-
Excelで数式内の文字色を一部だ...
-
エクセルで指定したセルのどれ...
-
(Excel)数字記入セルの数値の後...
-
枠に収まらない文字を非表示に...
-
セルをクリック⇒そのセルに入力...
-
Excelでのコメント表示位置
-
対象セル内(複数)が埋まった...
-
【Excel】 セルの色での判断は...
-
エクセル オートフィルタで絞...
-
エクセル “13ヶ月”を“1年1ヶ月...
-
Excel 例A(1+9) のように番地の...
-
エクセルのセルの枠を超えて文...
-
エクセル 足して割る
-
excelの特定のセルの隣のセル指...
-
エクセルの一つのセルに複数の...
-
Excel for Mac使用中ポインタが...
-
エクセルで住所と建物名を分け...
-
EXCEL VBA セルに既に入...
おすすめ情報