[[20200812191622]] 『Intersect使用エラー changeイベント内』(ゆう) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Intersect使用エラー changeイベント内』(ゆう)

ご教授いただければ幸いです。
以下のコード内の『if not〜 nothing then』にエラーが発生します。
実行時エラー424、オブジェクトを指定してください。というメッセージです。
Private Sub Worksheet_Change(ByVal Target As Range)

    'A列に記入された場合
    If Not Intersect(Target, Range("A4:A300")) Is notihng Then
        If Target.Value <> "" Then
            Target.Value = "×"
        End If
    End If
End Sub

よろしくお願いします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 こんばんは ^^
単なるNothingのミスタイプなのでは?
(隠居じーさん) 2020/08/12(水) 19:34

 おはようございます。 ^^
すみません、そんな単純な事だけではなさそぉですね
ミスタイプ時とは。。。エラー内容が違いますね。
あと、このままでは、イベントが暴走するような気が
します。処理前にイベントを止めて、終わりに、戻し
てあげれば、動くのではないでしょうか。m(_ _)m
一例ですが^^;
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge > 1 Then Exit Sub
    'A列に記入された場合
    If Not Intersect(Target, Range("A4:A300")) Is Nothing Then 'notihng Then
        Application.EnableEvents = False
        If Target.Value <> "" Then
            Target.Value = "×"
        End If
        Application.EnableEvents = True
    End If
End Sub
(隠居じーさん) 2020/08/13(木) 07:35

■1
質問とは関係ありませんが、↓と同じ方でしょうか?
[[20200725212801]] 『転記』(ゆう)
そうであれば、新しい質問をするのも結構ですが、別トピックもちゃんと始末を付けた方がよいようにおもいます。(あの状態で話が終わったという整理なのかもしれませんが。)

■2
こちらのトピックの質問についてですが、直接の原因は既に指摘があるとおりタイプミスが原因です。
このようなミスは、変数の宣言を強制するようにしておくことで容易に回避出来ますので、是非ともその設定をすることをお勧めします。

 【参考】
http://officetanaka.net/excel/vba/beginner/06.htm

■3
また、こちらも既に指摘がありますが、提示されたコードはChangeイベントですから、セルの値が【書き換えられた】ときに発生(マクロがスタート)します。
そして、マクロの中でセルの値の【書き換え】を行っています。
この場合、何が起こるか考えてみてください。
 ・
 ・
 ・
例えばA4セルに「あ」と入力した場合

 セルの値を書き換えたことによりChangeイベント発生。
 A4セルは、「A4:A4300」の中にあり、かつ「あ」は「""」でないことからA4セルの値を「✕」に書き換え
      ↓
 セルの値を書き換えたことによりChangeイベント発生。
 A4セルは、「A4:A4300」の中にあり、かつ「✕」は「""」でないことからA4セルの値を「✕」に書き換え
      ↓
 セルの値を書き換えたことによりChangeイベント発生。
 A4セルは、「A4:A4300」の中にあり、かつ「✕」は「""」でないことからA4セルの値を「✕」に書き換え
      ↓
 セルの値を書き換えたことによりChangeイベント発生。
 A4セルは、「A4:A4300」の中にあり、かつ「✕」は「""」でないことからA4セルの値を「✕」に書き換え
      ・
      ・

このように無限連鎖が発生してしまいます。
したがって、こうならないようにするためにセルの値を書き換える前にイベント発生を一時的に無効化する必要があります。

■4
前述のとおりChangeイベントはセルの値が書き換えられたときに発生しますが、書き換えられるセルは1つとは限りません。
例えば範囲をまとめてクリアしたり、セル範囲をコピペしたときには、Targetは複数のセルになります。
そのような場合には、Target.Valueは配列という特殊な状態になりますので↓のように単純に比較は出来なくなります。
(型が一致しないというエラーになる)

 If Target.Value <> "" Then

これを回避するには、隠居じーさんさんが示されたように、【値が変わったセルが1つだけの場合】のみ処理するとか、「セルの値が書き換えられたセル」かつ「A4:A300」に含まれるセルから【一つずつ取り出して】"それぞれ"処理するなどのアプローチが必要です。

■5
以上を踏まえるとこんな感じでもよかったとおもいます。

    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim 処理対象セル As Range
        Dim tmpRNG As Range

        Stop  'ブレークポイントの代わり

        '▼処理対象セルに値が書き換えられたセルのうち、A4:A300に含まれるセルをセットする
        Set 処理対象セル = Intersect(Target, Range("A4:A300"))

        '▼↑の結果セットされたら(Nothingじゃなかったら)処理を行う
        If Not 処理対象セル Is Nothing Then
            Application.EnableEvents = False

            'tmpRNGに1つずつ取り出して処理する
            For Each tmpRNG In 処理対象セル
                If tmpRNG.Value <> "" Then tmpRNG.Value = "×"
            Next

            Application.EnableEvents = True
        End If

    End Sub

(もこな2 ) 2020/08/13(木) 20:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.