• ベストアンサー

changeイベント

セルの値をDeleteキーで消去すると「型が一致しません。」のエラーメッセージが表示され、 if not(target.value>=1 and target.value<=9) then exit sub が黄色くなります。 これを回避する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1です。 エラーの原因は、 > 各マスは縦1横4の結合セルです。 単一セルじゃないから、ですね。 ただ、結合セルの扱いは独特なものになります。 消去した時は、Targetは結合セル全体、 値を確定した時は、Targetは結合セルの先頭の単一セル、 という2通りに処理対象が別れるので、 Exit Sub の条件分岐での値の比較の部分だけ、 Target Target(1) に書き換えることで対策します。 (ついでに赤いフォント色を元に戻す記述を追加しました。  色はそちらでお好きに。) Private Sub Worksheet_Change(ByVal Target As Range)   If Target(1).Value = "" Then Target.Font.Color = vbBlack: Exit Sub ' ◆追加   If Not (Target(1).Value >= 1 And Target(1).Value <= 9) Then Exit Sub ' ◆書換え '  If Not Target(1).Value Like "[1-9]" Then Exit Sub ' ◆書換え(上の1行の代り)?   N = 0   For C = 2 To 34 Step 4     If Cells(Target.Row, C) = Target.Value Then N = N + 1     If N = 2 Then Target.Font.Color = vbRed: Exit For   Next C   N = 0   For R = 4 To 28 Step 3     If Cells(R, Target.Column) = Target.Value Then N = N + 1     If N = 2 Then Target.Font.Color = vbRed: Exit For   Next R   If C > 34 And R > 28 Then Target.Font.Color = vbBlack ' ◆追加 End Sub

kana14
質問者

お礼

結合セルの扱いが消去したときと値を確定したときとで違うことがわかりました。 ありがとうございました。

その他の回答 (1)

回答No.1

こんにちは、 直接的な対策、というより、そもそもの一般的な基本記法なのですが、   If Target.Count > 1 Then Exit Sub   If Not (Target.Value >= 1 And Target.Value <= 9) Then Exit Sub の順番になるように1行書き加えて下さい。 ご提示のエラーは、 単一ではない(複数の)セル範囲を選択してDeleteしているので、 発生します。 ご提示の記述は、 ひとつのセルに対する処理に限定した書き方を選んでいます。 「changeイベント 」も、range.Valueも 複数のセルを対象にしたものです。 複数のセル範囲に対してrange.Valueを取得して、 ">=1" や "<=9" のような比較をしようとしているのでエラーになります。   If Target.Count > 1 Then Exit Sub と先頭に書き加えることで、 単一ではない(複数の)セル範囲に対して「changeイベント 」が発生した場合は、 以降の処理に進まずに、Exit Subします(プロシージャを抜けます)。 もしも、単一ではない(複数の)セル範囲に対しても 「changeイベント 」での処理を加えたい場合は、 「changeイベント 」内の書き方が大きく変わります。 ご要望有れば、お応えしますが、その場合は、 具体的な処理内容を補足してください。

kana14
質問者

お礼

早々に回答いただきましてありがとうございます。

kana14
質問者

補足

縦9マス、横9マスに1から9までの数字を1つずつ入れておなじ数字が縦横各1行に重複したら文字色を赤くするという処理です。各マスは縦1横4の結合セルです。 ※ナンプレです。 N = 0 For C = 2 To 34 Step 4 If Cells(Target.Row, C) = Target.Value Then N = N + 1 If N = 2 Then Target.Font.Color = vbRed: Exit For Next C N = 0 For R = 4 To 28 Step 3 If Cells(R, Target.Column) = Target.Value Then N = N + 1 If N = 2 Then Target.Font.Color = vbRed: Exit For Next R

関連するQ&A