Excel 2007 VBA审核

时间:2015-06-25 20:04:57

标签: excel vba excel-vba

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

enter image description here

1 个答案:

答案 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
相关问题