Excel 2007 VBA审核

新的VBA thanx提前..是否可以自动撤消更改行范围取决于另一个相应的单元格值?

例如:单元格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 

在这里输入图像说明

问题出在您试图检查列G是否为“是”的代码中:

 If Target.Range("g1:g10").Value = "Yes" Then Application.Undo Else End If 

Targetvariables已经是一个范围,如果用户在列AD中input了某些内容,则不会是列G. 相反,你必须找出刚刚被改变的行号,然后看看那一行的G列。 用下面的代码replace你的代码块:

 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