
シートのイベントプロシージャーが
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も見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
コンビニでおにぎりを買うときのスタメンはどの具?
コンビニでおにぎりを買うとき、何の具材を選ぶことが多いですか?
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
標準モジュールで 『Sub test(ByVal Target As Range)』は動かない?
Excel(エクセル)
-
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
-
4
特定セルの内容を更新したら、その更新日を自動的に表示する方法について
Excel(エクセル)
-
5
教えて For Each R In Target
Excel(エクセル)
-
6
A1セルに入力したら、入力時間をA2セルに自動挿入
Excel(エクセル)
-
7
マクロ 実行ボタンを押さずに常に実行
Excel(エクセル)
-
8
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
9
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
10
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
11
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
12
Worksheet_Change(ByVal Target As Range)の下に複数範囲
Excel(エクセル)
-
13
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
14
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
15
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
16
値を入力後、自動的にアクティブセルが移動するマクロ
Excel(エクセル)
-
17
エクセルマクロPrivate Subを複数にする方法
Excel(エクセル)
-
18
VBAでファイルを開くときにファイル名でワイルドカードを使用したいです
その他(プログラミング・Web制作)
-
19
Rangeメソッドは失敗しました。globalオブジェクトについて
Excel(エクセル)
-
20
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで指定したセルのどれ...
-
貼り付けで複数セルに貼り付けたい
-
【Excel】 セルの色での判断は...
-
EXCEL VBA セルに既に入...
-
セルをクリック⇒そのセルに入力...
-
excelの特定のセルの隣のセル指...
-
(Excel)数字記入セルの数値の後...
-
エクセルの書式設定の表示形式...
-
Excelでのコメント表示位置
-
枠に収まらない文字を非表示に...
-
エクセルのセルの枠を超えて文...
-
【エクセル】IF関数 Aまたは...
-
エクセル オートフィルタで絞...
-
エクセルの一つのセルに複数の...
-
Excel 例A(1+9) のように番地の...
-
対象セル内(複数)が埋まった...
-
数式を残したまま、別のセルに...
-
Excelで数式内の文字色を一部だ...
-
Excelで住所を2つ(町名迄と番...
-
文字列として"(ダブルコーテー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
貼り付けで複数セルに貼り付けたい
-
エクセルで指定したセルのどれ...
-
excelの特定のセルの隣のセル指...
-
(Excel)数字記入セルの数値の後...
-
セルをクリック⇒そのセルに入力...
-
枠に収まらない文字を非表示に...
-
【エクセル】IF関数 Aまたは...
-
【Excel】 セルの色での判断は...
-
Excelでのコメント表示位置
-
エクセルの一つのセルに複数の...
-
エクセルのセルの枠を超えて文...
-
Excelで数式内の文字色を一部だ...
-
EXCEL VBA セルに既に入...
-
エクセルの書式設定の表示形式...
-
Excel 例A(1+9) のように番地の...
-
数式を残したまま、別のセルに...
-
エクセル オートフィルタで絞...
-
Excelで、「特定のセル」に入力...
-
ハイパーリンクの参照セルのズ...
-
対象セル内(複数)が埋まった...
おすすめ情報