• ベストアンサー

VBA:結合されたセルに対する「Target」について

Private Sub Worksheet_Change(ByVal Target As Range)   If Target = "" Then     MsgBox "空欄です"   End If End Sub 上記コードで、セルにカーソルを合わせてDeleteキーを押すと正常にメッセージが表示されます。 ただし、カーソルを合わせたセルが結合されていた場合、 「型が一致しません」というエラーで停止してしまいます。 結合されているセルに対しても同じ処理をするには、   If Target = "" Then の部分をどのように指定すればよいでしょうか。

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

  • ベストアンサー
  • tkrn
  • ベストアンサー率53% (33/62)
回答No.3

If Target.Text = "" Then Textプロパティでよければエラーになりませんね。 不思議な挙動ですね。 結合されたセルが空の場合のみValueプロパティの値が「Variant()」配列で渡されてますね。

rem_1982
質問者

お礼

回答ありがとうございます。 とても気持ちよく動作しております。 記述の意味もわかりやすいですし。 Valueプロパティ云々は正直理解できていないのですが、 今までのコードに.Textを追加するだけでいけそうです。

その他の回答 (4)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

Private Sub Worksheet_Change(ByVal Target As Range)   If Application.CountA(Target) = 0 Then     MsgBox "空欄です"   End If End Sub はどうですか?

rem_1982
質問者

お礼

回答ありがとうございます。 解決したのに締め切るのを忘れていました、 申し訳ありません。 提示していただいたコードも正常動作しました。 なにやら他とは毛色が違うのでとっつきにくい印象がありますが、 使わせていただこうと思います。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

Private Sub Worksheet_Change(ByVal Target As Range) If Target.MergeCells = True Then MsgBox "セル結合" End If End Sub が参考になれば。

rem_1982
質問者

お礼

回答ありがとうございます。 「Target.MergeCells = True 」を組み込むことで正常に動作しました。 if文の階層を1つ増やすか、orを入れないと空白の判断はできませんけど、 動作的に問題ないです。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

簡単にするなら   If Target.Cells(1,1) = "" Then 選択範囲の「左上のセル」を処理対象としています。 結合セルをきちんと判断するならもう少し複雑になりますが…

rem_1982
質問者

お礼

回答ありがとうございます。 正常に動きました。 が、何故左上のセルを処理対象とすると動くのかがわかりません。 結合セルは、常に隣り合った2つを結合したものに対して使うつもりです。

  • pamsd
  • ベストアンサー率18% (39/209)
回答No.1

If Range(Left(Target.Address(0, 0), 2)) = "" Then とすればいいでしょう。

rem_1982
質問者

補足

回答ありがとうございます。 すみません、ちょっと意味がわかりません。 Target.Addressは対象のセルのアドレスで、 Target.Address(0, 0)は同じアドレスだけど[$]マークを抜いた形で出るようですね。 で、そこから前2文字を抜き出したRangeというのは、何を指しているのでしょうか。