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

いつもお世話になっております
下記の部分が黄色くなり、
型が一致しませんとでます。
If .Value <> "" Then

わかる方おしえてくれませんでしょうか

Private Sub Worksheet_Change(ByVal Target As Range)
Dim st As String

With Target
st = .Address(False, False)
st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))

Select Case st

Case "B"

If .Value <> "" Then
With .Resize(, 7)
.Borders.LineStyle = xlContinuous
.Borders.ColorIndex = 6
.Borders(xlEdgeTop).ColorIndex = 6
End With
Else
.Resize(, 7).Clear

End If


End Select
End With
End Sub

質問者からの補足コメント

  • うーん・・・

    下記のコードだけならうまくいくのですが、
    わかりませんです。
    空白でなければ線を引くでなければ消したいだけなのに。

    If .Value <> "" Then

    With .Resize(, 7)
    .Borders.LineStyle = xlContinuous
    .Borders.ColorIndex = 6
    .Borders(xlEdgeTop).ColorIndex = 6
    End With

    End If

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/03/12 22:02
  • つらい・・・

    target.valueをactivecell.valueにしました。
    だめでした
    どうしたよろしいでしょうか
    .Borders(xlEdgeTop).ColorIndex = 6がもんだいなのかな

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/03/12 22:13

A 回答 (4件)

こんばんは


問題はWorksheet_Changeイベントの使い方にあります
複数選択したセルの場合 Target.Valueは取得できません
仮に操作するセルを1セルで行っても 複数セルの場合を排除する(処理しない)コードが無ければ エラーが発生します
(イベント抑制が無く複数セルを操作する処理がある場合)

これは
If .Value <> "" Then Trueの場合に問題が無くとも
空白にした場合 .Resize(, 7).Clear コードで再びイベントが発生して
Targetの中身が.Resize(, 7)となるからです

従ってWorksheet_Changeイベントで
セルの値を操作する場合に欠かせない
Application.EnableEvents = False ’イベント発生を抑止
処理
Application.EnableEvents = True

また、イベント発生時の選択範囲を取得して処理を分ける条件分岐
If Target.Count > 1 Then Exit Sub 1セルのみ実行

If Target.Count = 1 Then 複数範囲を処理をする場合など
処理 1セル
Else
For Each c In Target 複数セル
処理
Next
End If
など必須と考えて良いと思います

追加例
Private Sub Worksheet_Change(ByVal Target As Range)
Dim st As String
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
With Target
st = .Address(False, False)
st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))
Select Case st
Case "B"
Debug.Print .Address(False, False)
If .Value <> "" Then
With .Resize(, 7)
.Borders.LineStyle = xlContinuous
.Borders.ColorIndex = 6
.Borders(xlEdgeTop).ColorIndex = 6
End With
Else
.Resize(, 7).Clear
End If
End Select
End With
Application.EnableEvents = True
End Sub
    • good
    • 0
この回答へのお礼

いつもありがとうございます
なかなか奥が深いです
If Target.Count > 1 Then Exit Sub
ありがとうございました。

お礼日時:2023/03/12 23:01

追記


複数範囲を処理をする場合など コピーや 範囲選択Delキー操作の時の例

Private Sub Worksheet_Change(ByVal Target As Range)
Dim st As String
Dim i As Long
Application.EnableEvents = False
For i = 1 To Target.Count
With Target(i)
st = .Address(False, False)
st = Left(.Address(0, 0), IIf(.Address(0, 0) Like "[A-Z][A-Z]*", 2, 1))
Select Case st
Case "B"
If .Value <> "" Then
With .Resize(, 7)
.Borders.LineStyle = xlContinuous
.Borders.ColorIndex = 6
.Borders(xlEdgeTop).ColorIndex = 6
End With
Else
.Resize(, 7).Clear
End If
End Select
End With
Next
Application.EnableEvents = True
End Sub
    • good
    • 0
この回答へのお礼

For i = 1 To Target.Count
は一度にセルをdeleteするとすべてきえて

下記の場合消えない

If Target.Count > 1 Then Exit Sub
なるほどです
ありがとうございました。

お礼日時:2023/03/12 23:05

複数のセルを選択して Target.Value を行うとエラーになります。


http://vba.doorblog.jp/archives/51300558.html
この回答への補足あり
    • good
    • 0

Worksheet_Changeの引数で、複数のセルを選んでいませんか?

この回答への補足あり
    • good
    • 0

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