VBA新手 提前.. 是否可以根据另一个相应的单元格值自动撤消对行范围的更改?
例如: 单元格A2,B2,C2是用户内部数据的单元格 单元格G2审核员通过键入"是"
批准原始数据的单元格所以如果G2值是"是"对A2,B2,C2中的值的任何更改都将被取消"撤消"并返回其原始数据, 如果G2不是"是"那么用户可以根据需要改变单元格A2,B2,C2中的值 对于A3,B3,C3与G3,A4,B4,C4与G4等的其他细胞相比,等等......
从评论中复制的代码:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo er1
Application.EnableEvents = False
If Not Intersect(Target, Range("A1:d10")) Is Nothing Then
If Target.Range("g1:g10").Value = "Yes" Then
Application.Undo
Else
End If
End If
err2:
Application.EnableEvents = True
Exit Sub
er1:
MsgBox Err.Description
Resume err2
End Sub
答案 0 :(得分:1)
问题在于您要检查G列是否为“是”的代码:
If Target.Range("g1:g10").Value = "Yes" Then Application.Undo Else End If
Target
变量已经是一个范围,如果用户在A-D列中输入了某些内容,则不会是G列。相反,您必须计算刚刚更改的行号,然后查看该行的G列。用以下代码替换你的代码块:
Dim rowNumber As Long
' This **assumes** only 1 cell has been changed
rowNumber = Target.Row
If Target.Parent.Cells(RowIndex:=rowNumber, ColumnIndex:="G").Value = "Yes" Then
Application.Undo
Else
End If
警告此代码假定只更改了一个单元格。如果您认为Target
可能不止一个单元格,则应循环检查所有单元格:
Dim rowNumber As Long
Dim cell As Range
For Each cell In Target.Cells
rowNumber = cell.Row
If Target.Parent.Cells(RowIndex:=rowNumber, ColumnIndex:="G").Value = "Yes" Then
Application.Undo
Exit For
Else
End If
Next cell