Excel VBA 質問スレッド №2065 (解決済)

イベントのTargetの中身(オブジェクトがあるか?)を調べる方法について

投稿者 : Mr.大至急     投稿日時 : 2025/01/05(Sun) 23:46:58     OS : Windows 10     EXCEL : Excel 2019
表題通りなのですが、同一のイベントプロシージャ内でTargetの対象セルが削除されたら、以降のコードでTargetを使ってもエラーになりますが。
エラー判定する方法は別として、それ(Targetの中身)を判定する方法はありますか?
なお、Is Nothingでは判定できないようです。
ご教示いただけますと幸いです。
よろしくお願いい致します。

スポンサーリンク
[返信 1] Re : イベントのTargetの中身(オブジェクトがあるか?)を調べる方法について
投稿者 : サタデー     投稿日時 : 2025/01/06(Mon) 00:45:48
>同一のイベントプロシージャ内でTargetの対象セルが削除されたら、以降のコードでTargetを使ってもエラーになりますが。

意味がよくわからない
こういう事??

Sub abn()
Dim rng As Range
Set rng = Range("A2")
rng.Delete
rng.Value = 10
End Sub

Sub bbn()
Dim rng As Range
Set rng = Range("A2")
adr = rng.Address
rng.Delete
Range(adr).Value = 10
End Sub

[返信 2] Re : イベントのTargetの中身(オブジェクトがあるか?)を調べる方法について
投稿者 : 匿名     投稿日時 : 2025/01/06(Mon) 15:18:32
まずは、エラーの内容をしっかり読むことが必要です。
せっかく「Excel君」がどのような内容のエラーなのかを報告してくれているのに、
全く無視してよいのですか?

どんなエラーが出ているか掲載するのは、
基本だと思いますよ。

[返信 3] Re : イベントのTargetの中身(オブジェクトがあるか?)を調べる方法について
投稿者 : ごんぼほり     投稿日時 : 2025/01/06(Mon) 16:04:13
質問内容が不明確ですよ

イベントプロシジャで削除したなら、削除されてるか確認するまでもないですよね
自分で削除しておいて、削除されているかどうか調べるとか、非効率すぎる
それを必要としている段階で、コードを見直すべきです。

で、ほんとに必要ならば、なければ作るの精神で。
メインのプロシジャから On Error を追い出すという効果しかありませんけど

Sub sample()
    Dim rng As Range
    Set rng = Range("A1")
    rng.Delete xlUp
     
    If RngAlive(rng) Then
       Debug.Print rng.Address
    Else
       Debug.Print "削除されています。"
    End If
End Sub

Function RngAlive(rng As Range) As Boolean
    Dim tmp As Variant
    On Error GoTo NotAlive
       tmp = rng.Value
    On Error GoTo 0
    RngAlive = True
    Exit Function
NotAlive:
    If Err.Number = 424 And Err.Description = "オブジェクトが必要です。" Then
       RngAlive = False
       Exit Function
    End If
    Err.Raise Err.Number, , Err.Description
End Function

[返信 4] Re : イベントのTargetの中身(オブジェクトがあるか?)を調べる方法について
投稿者 : tek     投稿日時 : 2025/01/06(Mon) 21:58:33
On Error Resume Next状態で、Targetのプロパティで判断して(例えばAddressが""以外で)Targetの中身を見ることができます。
なお、On Error Resume Nextの範囲はなるべく小さくしたいので、一旦Targetのプロパティ値を変数に代入することをお勧めします。

[返信 5] Re : イベントのTargetの中身(オブジェクトがあるか?)を調べる方法について
投稿者 : Mr.大至急     投稿日時 : 2025/01/06(Mon) 22:32:39
質問に対して質問を投げ掛ける、変な文脈をつくって読む、のではなくシンプルに質問に答えて頂ければ良かったのですが。
セルにダブルクリックで反応するボタン機能を持たせるのはおかしくないですし、その性質上、どうしても一つのイベントプロシージャに複数の機能を記述せざるを得ません。
そこでふと疑問に思っただけです。
実際は一つの機能おきにExit Subで抜ければ良いだけです。

[返信 6] Re : イベントのTargetの中身(オブジェクトがあるか?)を調べる方法について
投稿者 : 匿名     投稿日時 : 2025/01/06(Mon) 23:37:13
解決済なので読まないかもしれませんが…

>質問に対して質問を投げ掛ける、のではなくシンプルに質問に答えて頂ければ良かったのですが。
質問が曖昧だから、質問に質問を投げかられると思いませんか。
突然「あれどうなった」という質問を投げかけられて、
「あれ」とは何ですか?
と質問することはいけない事ですか?

それに私は、疑問符を付けただけで質問したわけではありません。
事実、エラーの内容を載せてください。
と返しただけです。
エラーの内容を掲載することで、エラーの文書を読むことができ、
そこから解決に導けるからです。

>変な文脈をつくって読む、
どこが???
ほかの方からも「意味がよくわからない」とご指摘されていますよね。
質問が明確ではないので、こちらで推測するしかなかったと思いませんか?

>質問に答えて頂ければ良かったのですが。
質問の回答をしただけでは、あなた自身で解決する力にはなりません。
だから順を追って、まずエラーの内容を掲載してくださいと回答したのです。

【解説詳細】
エラーの内容は、「オブジェクトが必要です」だと思います。
つまり「Targetオブジェクト」が存在していないことになります。
従って、存在しないものの内容など、どうやっても判断しようがないという事です。
>それ(Targetの中身)を判定する方法はありますか?
この部分です。だから、エラーの内容を読むことが重要なのです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub

この「Target」とはRangeオブジェクト型の変数です。
オブジェクト変数は、参照をしているだけです。

例えば
Range("A1").Delete
を実行しても、Excelのシート上からA1セルが消えてなくなる
というわけではありません。
Dim r As Range
Set r = Range("A1")
Debug.Print r.Address
を実行すると、Rangeオブジェクト型変数「r」には、
Range("A1")がメモリ上のどこに格納されているか(参照)を持っているだけになります。
オブジェクトそのものを持っているわけではありません。

したがって、
Dim r As Range
Set r = Range("A1")
Debug.Print r.Address
r.Delete
Debug.Print r.Address
を実行すると、2回目の「Debug.Print r.Address」で
「オブジェクトが必要です」というエラーが出ます。
つまり、「r.Delete」で
「r」というRangeオブジェクト型変数は切り離された
ということです。
したがって、「Address」プロパティを見ようとしても、
どのオブジェクトのAddressプロパティかわかりません。
(「r」というオブジェクトが存在しないので…)
なので、オブジェクトが必要ですというエラーが出るのです。

イベントプロシージャの「Target」も同じです。
ここで、質問にある「それ(Targetの中身)を判定する方法はありますか?」
ですが、「Target」事態がプログラム上切り離されているので、
中身を判定するも何も、
そもそも何(どこ)の中身を確認したいのかわかりません。

【結論】
「Target.Clear」
または、
「Target.ClearContents」
を使えばよいと思います。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-01-25 11:50:19 )
タイトルとURLをコピーしました