[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
■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.