- ベストアンサー
型が一致しない というエラー
Private Sub Worksheet_Change(ByVal Target As Range) If Target = Range("B1") Then Range("B3:B8").Select Selection.ClearContents End If End Sub というコードを書いています。 B3~B8は「数字」という書式です。 型が一致しない13番のエラーが出ます。 原因と対処法を教えてください。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 #2の回答者です。 >セルB1に引き金のキーワードが入ります。 なるほど、意味が分かりました。 キーワードが、例えば、「keyword」なら、以下のようにすればよいです。 And Target.Value = "keyword" Then (流れは、下のコードを参照してくださいょ 一応、Binary 比較ですから、大文字・小文字は別になります。 複数の場合などは、またおっしゃってください。少し、ややこしくなります。 Text 比較の場合は、大文字・小文字は同じになりますが、 And StrComp(Target.Value, "keyword", vbTextCompare) = 0 Then としてあげます。他にも、Like演算子などもありますが、オプション・コンペア・ステートメントが必要になってしまいます。 > Application.EnableEvents = False これを入れないと、新たにイベントが発生してしまいます。 しかし、 >Application.EnableEvents = True 終わった後に、イベントの発生を戻さないと、次回、イベント起動しません。 もちろん、それを無視して、コードが再帰しても、入り口で、弾かれるようなコードをおいておけば、二度目は弾かれるのですが、制御しないままよりも、このような場合、基本的に、EnableEvents でイベントを止めます。これは、ステップ・モードでみれば分かります。 '// Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub 'セル値が複数の場合は除外 If Target.Address = "$B$1" And Target.Value = "keyword" Then '←KeyWord Application.EnableEvents = False 'イベントの中断をしないと、新たにイベントが発生 Range("B3:B8").ClearContents Application.EnableEvents = True End If End Sub '//
その他の回答 (3)
- eden3616
- ベストアンサー率65% (267/405)
No1です >先ず、やりたいことは セルB1に引き金のキーワードが入ります。 それを引き金にセルB3~B8をクリアする、です。 「B1に何か入力されればB3~B8を削除する」だけなら以下で良い気がしますが。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Range("B3:B8").ClearContents End Sub 「B1で入力されたものと一致する値のみをB3~B8から削除する」場合なら以下のような感じです。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long If Target.Address <> "$B$1" Then Exit Sub For i = 3 To 8 With Range("B" & i) If .Value = Range("B1") Then .ClearContents End With Next i End Sub
お礼
早速2度目の回答を頂き、有り難うございました。 よく分かりましたので、今回の回答は読みやすくなりました。 結局は、B1セルに入ったときだけ引き金を引くというイベントは存在しない、 ということですね、了解しました。 また、やることは複雑ではなく、 B1に作業するキーワードが入れば単純に何箇所かのクリアをするだけです。 ということから、 2番目に頂いた回答をそっくり使わせていただきます。 追加でお教えいただいた、 指定内容と同じモノをクリアするというロジックも 今後使わせていただきます。 お手間をお掛けしました。 お世話になりました。
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 イベントが、ループしていますから、再帰して、パラメーターのTarget に、Range("B3:B8")のValue値が格納されて、配列になっているので、それと、B1の値と比較するので、「13:型が一致しない」というエラーが出ます。(意味が分かるでしょうか?) ただ、そのコードの目的が書かれていないので、コードが意味が良く分かりませんが、こちらの類推ですが、たぶん、B1に何かを入れたら、Range("B3:B8").ClearContents したいように思えます。 >If Target = Range("B1") Then まさか、Value値が一致しているということなのでしょうか、イベントで同じセルの比較などはありませんから、セルの場所ということにします。 '// Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 1 Then Exit Sub 'セル値が複数の場合は除外 If Target.Address = "$B$1" Then Application.EnableEvents = False 'イベントの中断 Range("B3:B8").ClearContents Application.EnableEvents = True End If End Sub '//
お礼
早速有り難うございました。 お教えいただいた内容は違いますが、 1番の方と同じことだと理解しました。 何をやりたいかは、ご指摘のとおりです。 頂いた回答で何となく分かりましたが、 考え方が違っていたみたいです。 B1に変更があったときにだけイベントが発生する、と思っていました。 なので、書き込みは1回なので、お教えいただいた、「ループする」とは思っていませんでした。 このチェンジイベントは、シートに対して引き金が引かれるのですね。 なお、1番の方のお礼にも書きましたが、 私の考えのようなイベント引き金は存在しないのでしょうか。 追加で恐縮ですが、お教えいただければ嬉しいです。 宜しくお願いいたします。
補足
お教えいただいたコードがそっくり使えますので、 コピーさせていただきます。 (私のやりたいことにピッタリのイベントが在れば、そちらに変更しますが) 有り難うございました。 なお、再度回答いただけるかも知れませんので、もう少し開けておきます。
- eden3616
- ベストアンサー率65% (267/405)
Range("B3:B8").Select Selection.ClearContents によりシートに変更が加わった後もセル範囲として If Target = Range("B1") Then でB1と比較しているため、型不一致となっているようです。 If Target = Range("B1") Then の手前に If Selection.Count <> 1 Then Exit Sub を追加でどうでしょ。
お礼
早速有り難うございました。 2番の方の回答にも書かれていますが、 何をやりたいかと私の考えが違っていたみたいです。 頂いた回答で何となく分かりました。 先ず、やりたいことは セルB1に引き金のキーワードが入ります。 それを引き金にセルB3~B8をクリアする、です。 そして考え違いは、 B1に書き込まれたら(変更があったら)イベントが発生すると思っていました。 なので、書き込みは1回なので、お教えいただいた、「ループする」とは思っていませんでした。 このチェンジイベントは、シートに対して引き金が引かれるのですね。 よく分かりました。 なお、私の考えのようなイベント引き金は存在しないのでしょうか。 追加で恐縮ですが、お教えいただければ嬉しいです。 宜しくお願いいたします。
お礼
早速2度目の回答を頂き、有り難うございました。 よく分かりました。 結局は、B1セルに入ったときだけ引き金を引くというイベントは存在しない、 ということですね、了解しました。 また、3番のお礼に書きましたが、やることは複雑ではなく、 B1に作業するキーワードが入れば単純に何箇所かのクリアをするだけです。 ということから、 2番目に頂いた回答をそっくり使わせていただきます。 追加でお教えいただいた、 引き金の条件も分かっておりました。 また、イベントのgo,stopも了解です。 お手間をお掛けしました。 お世話になりました。
補足
ベストアンサーですが、 お二方に差し上げたいのですが、一つしか選べません。 恐縮ですが、 そっくり使わせていただいたコードを提供いただいたので、 こちらにさせていただきました。 どうも有り難うございました。