「質問への追記・修正の依頼」欄ですでにあげられているものも含めて、エラー原因がいくつか考えられます。
①引数として複数セルを受け取っている
例えばTarget
引数として結合セルを受け取った場合です。
この場合Target.Value
では値の取得ができず、エラーが発生します。
取得した複数のセルのうち、どのセルを対象に判定・書き込みを行うかを特定したコードにすることで解消できます。
②引数で受け取ったセルの値が、文字列と比較できない
例えばTarget
引数として#VALUE
のようなエラーとなっているセルを受け取った場合などです。
この場合、Taregt.Value
を暗黙的に文字列と比較することができず、エラーが発生します。
※エラー発生個所からみて今回はこちらが原因と思われます。
多くの場合Taregt.Text
で比較することで回避できます。
サンプル
最終的に、上記2点はどちらも対応しておいた方がいいものです。
下記は、これを考慮したサンプルコードです。
サンプル① 複数セルの場合、先頭セルで処理をする
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
'If Intersect(Target, Range("a1:af99")) Is Nothing Then Exit Sub
''↑の("a1:af99")の部分に、対象の範囲を自分で書き込む
Dim rngArea As Range
Dim c As Range
'対象範囲内のセルを抽出
Set rngArea = Intersect(Target, Range("a1:af99"))
If rngArea Is Nothing Then Exit Sub
'先頭セルを対象として取得
Set c = rngArea.Cells(1)
'対象セルを判定し、書き込みを行う
Select Case c.Text
Case ""
Target.Value = "○"
Case "○"
Target.Value = ""
End Select
End Sub
DoubleClickイベントにおいて、引数で複数セルを受け取るのは結合セルを指定したときくらいかと思います。
結合セルの対応であればサンプル①で事足りますが、他のイベントなどで「複数セルを受け取った時は、全てのセルを処理したい」ということもあるかと思いますので、参考までにサンプルコード②も作ってみました。
サンプル② 複数セルの場合、全てのセルに処理をする
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
'If Intersect(Target, Range("a1:af99")) Is Nothing Then Exit Sub
''↑の("a1:af99")の部分に、対象の範囲を自分で書き込む
Dim rngArea As Range
Dim c As Range
Set rngArea = Intersect(Target, Range("a1:af99"))
If rngArea Is Nothing Then Exit Sub
'複数のセル範囲から対象セルを1つずつ取り出すループ処理
For Each c In rngArea.Cells
'結合セルの場合、先頭セルのみ処理を行う
If c.Address = c.MergeArea.Cells(1).Address Then
'対象セルを判定し、書き込みを行う
Select Case c.Text
Case ""
Target.Value = "○"
Case "○"
Target.Value = ""
End Select
End If
Next
End Sub
注意しなければいけないのは、結合セルでもそれぞれのセルに対してループ処理が行われるという点です。
A1とA2を結合したセルに対してはA1で1回、A2で1回ループ処理が行われます。
このためA1で""⇒"○"に書き換えても、その後のA2の判定で"○"⇒""に戻されたりしかねません。
これを回避するため、結合セルではその先頭セルでのみ処理するようc.MergeArea.Cells(1).Address
の判定を追加しています。
結合セルであればその先頭セルの座標が返されますし、単一セルの場合はそのセルの座標が返されます。
これにより結合セルの先頭以外のセルでは処理が行われないようになります。
参考になれば幸いです。