アプリ版:「スタンプのみでお礼する」機能のリリースについて

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番のエラーが出ます。

原因と対処法を教えてください。
宜しくお願いします。

A 回答 (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
'//

この回答への補足

ベストアンサーですが、
お二方に差し上げたいのですが、一つしか選べません。

恐縮ですが、
そっくり使わせていただいたコードを提供いただいたので、
こちらにさせていただきました。

どうも有り難うございました。

補足日時:2014/04/21 20:03
    • good
    • 0
この回答へのお礼

早速2度目の回答を頂き、有り難うございました。
よく分かりました。

結局は、B1セルに入ったときだけ引き金を引くというイベントは存在しない、
ということですね、了解しました。

また、3番のお礼に書きましたが、やることは複雑ではなく、
B1に作業するキーワードが入れば単純に何箇所かのクリアをするだけです。
ということから、
2番目に頂いた回答をそっくり使わせていただきます。

追加でお教えいただいた、
引き金の条件も分かっておりました。

また、イベントのgo,stopも了解です。

お手間をお掛けしました。
お世話になりました。

お礼日時:2014/04/21 20:01

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
    • good
    • 0
この回答へのお礼

早速2度目の回答を頂き、有り難うございました。
よく分かりましたので、今回の回答は読みやすくなりました。

結局は、B1セルに入ったときだけ引き金を引くというイベントは存在しない、
ということですね、了解しました。

また、やることは複雑ではなく、
B1に作業するキーワードが入れば単純に何箇所かのクリアをするだけです。
ということから、
2番目に頂いた回答をそっくり使わせていただきます。

追加でお教えいただいた、
指定内容と同じモノをクリアするというロジックも
今後使わせていただきます。

お手間をお掛けしました。
お世話になりました。

お礼日時:2014/04/21 19:57

こんにちは。



イベントが、ループしていますから、再帰して、パラメーターの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
'//

この回答への補足

お教えいただいたコードがそっくり使えますので、
コピーさせていただきます。
(私のやりたいことにピッタリのイベントが在れば、そちらに変更しますが)

有り難うございました。

なお、再度回答いただけるかも知れませんので、もう少し開けておきます。

補足日時:2014/04/21 17:38
    • good
    • 1
この回答へのお礼

早速有り難うございました。

お教えいただいた内容は違いますが、
1番の方と同じことだと理解しました。

何をやりたいかは、ご指摘のとおりです。

頂いた回答で何となく分かりましたが、
考え方が違っていたみたいです。
B1に変更があったときにだけイベントが発生する、と思っていました。
なので、書き込みは1回なので、お教えいただいた、「ループする」とは思っていませんでした。
このチェンジイベントは、シートに対して引き金が引かれるのですね。

なお、1番の方のお礼にも書きましたが、
私の考えのようなイベント引き金は存在しないのでしょうか。
追加で恐縮ですが、お教えいただければ嬉しいです。
宜しくお願いいたします。

お礼日時:2014/04/21 17:35

Range("B3:B8").Select


Selection.ClearContents
によりシートに変更が加わった後もセル範囲として
If Target = Range("B1") Then
でB1と比較しているため、型不一致となっているようです。


If Target = Range("B1") Then

の手前に

If Selection.Count <> 1 Then Exit Sub

を追加でどうでしょ。
    • good
    • 0
この回答へのお礼

早速有り難うございました。

2番の方の回答にも書かれていますが、
何をやりたいかと私の考えが違っていたみたいです。
頂いた回答で何となく分かりました。

先ず、やりたいことは
セルB1に引き金のキーワードが入ります。
それを引き金にセルB3~B8をクリアする、です。

そして考え違いは、
B1に書き込まれたら(変更があったら)イベントが発生すると思っていました。
なので、書き込みは1回なので、お教えいただいた、「ループする」とは思っていませんでした。
このチェンジイベントは、シートに対して引き金が引かれるのですね。
よく分かりました。

なお、私の考えのようなイベント引き金は存在しないのでしょうか。
追加で恐縮ですが、お教えいただければ嬉しいです。
宜しくお願いいたします。

お礼日時:2014/04/21 17:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!