シートのイベントプロシージャーが
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も見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
土曜の昼、学校帰りの昼メシの思い出
週休2日が当たり前の今では懐かしい思い出ですが、昔は土曜日も午前中まで学校や会社がある「半ドン」で、いつもよりちょっと早く家に帰って食べる昼ご飯が、なんだかちょっと特別に感じたものです。
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
エクセル イベントマクロ Changeイベントを複数作りたい
Access(アクセス)
-
A1セルに入力したら、入力時間をA2セルに自動挿入
Excel(エクセル)
-
特定セルの内容を更新したら、その更新日を自動的に表示する方法について
Excel(エクセル)
-
-
4
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
標準モジュールで 『Sub test(ByVal Target As Range)』は動かない?
Excel(エクセル)
-
7
教えて For Each R In Target
Excel(エクセル)
-
8
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
9
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
10
VBA:結合されたセルに対する「Target」について
Access(アクセス)
-
11
マクロ 実行ボタンを押さずに常に実行
Excel(エクセル)
-
12
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
13
EXCEL VBA 選択範囲をTargetに
会計ソフト・業務用ソフト
-
14
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
15
値を入力後、自動的にアクティブセルが移動するマクロ
Excel(エクセル)
-
16
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
17
あるセルに特定の文字列を打つと、他のセルに決められた文字が自動入力するように
Excel(エクセル)
-
18
Worksheet_Change(ByVal Target As Range)の下に複数範囲
Excel(エクセル)
-
19
Worksheet.Change イベントを他のシートにも反映させる方法?
Visual Basic(VBA)
-
20
エクセルマクロPrivate Subを複数にする方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セルをクリック⇒そのセルに入力...
-
Excel 例A(1+9) のように番地の...
-
EXCEL VBA セルに既に入...
-
Excelでのコメント表示位置
-
excelの特定のセルの隣のセル指...
-
VBAでの結合セルのコピー&ペー...
-
貼り付けで複数セルに貼り付けたい
-
VBAでセルを指定した画像のコピ...
-
Excelで教えてください。 バー...
-
数式を残したまま、別のセルに...
-
エクセルの一つのセルに複数の...
-
エクセル 足して割る
-
Excel2003 の『コメント』の編...
-
エクセル オートフィルタで絞...
-
エクセルで、選択した数字(セル...
-
Office365のExcelで、セル内の...
-
エクセル セルの中に縦線が入っ...
-
(EXCEL)一行おきのCOUNTA
-
LARGE関数 飛び飛びの範囲を指定
-
エクセルで指定したセルのどれ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
貼り付けで複数セルに貼り付けたい
-
Excelで数式内の文字色を一部だ...
-
【エクセル】IF関数 Aまたは...
-
エクセルで指定したセルのどれ...
-
(Excel)数字記入セルの数値の後...
-
エクセルの一つのセルに複数の...
-
セルをクリック⇒そのセルに入力...
-
Excel 例A(1+9) のように番地の...
-
対象セル内(複数)が埋まった...
-
枠に収まらない文字を非表示に...
-
Excelでのコメント表示位置
-
【Excel】 セルの色での判断は...
-
エクセルの書式設定の表示形式...
-
エクセル オートフィルタで絞...
-
エクセル 足して割る
-
エクセルのセルの枠を超えて文...
-
エクセル “13ヶ月”を“1年1ヶ月...
-
EXCEL VBA セルに既に入...
-
Excel2003 の『コメント』の編...
-
数式を残したまま、別のセルに...
おすすめ情報