指向源单元的数据验证

时间:2015-11-20 09:14:45

标签: excel validation excel-vba compare excel-2003 vba

我在A列中使用了数据验证,如果输入了重复数据,则会显示错误消息。它只显示错误,但没有告诉我数据在列中的位置。

我想知道的是Excel是否可以导航到源单元格,其中重复值与之比较?

如果单元格A2 = 12345并且我尝试更新A50 = 12345,Excel会生成错误消息,但它是否可以将光标指向单元格A2,因为这是比较数据的位置?

1 个答案:

答案 0 :(得分:0)

我在&出。我的解决方案是

  1. 接收两个范围(targetcell,datarange)的通用欺骗检查例程
  2. WorkSheet_Change()事件触发了我希望它的列的检查
  3. 工作表标题中的单元格,用于输出错误消息
  4. 示例:

    我已经提取了其中一个的重要部分......

    让我们从DupeCheck()开始......它正在一个范围(DataRange)中运行,并返回与要测试的Target具有相同值的第一个单元格。此函数驻留在自己的模块中。像这样,它可以被同一工作簿中的多个工作表使用。

    Function DupeCheck(Target As Range, DataRange As Range) As Range
    Dim DataCell As Range
    
        Set DupeCheck = Nothing
    
        ' compare each cell of DataRange with Target
        For Each DataCell In DataRange.Cells
    
            ' exclude Target which may be part of DataRange per se
            If Intersect(DataCell, Target) Is Nothing Then
                If DataCell = Target Then
    
                    ' duplicate found ... terminate on first find
                    Set DupeCheck = DataCell
                    Exit For
                End If
            End If
        Next DataCell
    End Function
    

    现在让我们看一下Worksheet_Change事件,它位于其所处理的工作表的代码区域中。在我的情况下,我有大量的验证,但我减少了示例以仅包含相关代码...这里我们检查单元格更改是否适用于列A,在这种情况下我们触发DupeCheck()函数,并取决于将错误消息返回,设置或清除到名为[ErrorMessage]的工作表上的单元格中...这里我们当然可以将光标定位到重复的单元格中(例如TempR.Select ...品味问题)

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim TempR As Range
    
    ' various validations
    ' always break on first error found
    ' output to named range ErrorMessage
    
        ' Dupe Check for PoP ID (column A)
        If Target.Column = 1 Then
    
            Set TempR = DupeCheck(Target, Range("A1:A50"))
    
            If Not TempR Is Nothing Then
                [ErrorMessage] = "Duplicate ID in " & TempR.AddressLocal
            Else
                [ErrorMessage] = ""
            End If
    
        ' ElseIf Target.Column = 4 Then ' other validations (deleted)
        ' ....
    
        End If
    
    End Sub
    

    etvoilà