用msg框防止重复input显示使用vba已经存在的序列号

我想创build一个vba代码,以防止重复的条目,也告诉我它已经存在的位置。 例如在我的工作表中,我在单元格D13或列D中的任何位置键入“Jimmy”,然后MsgBox将警告我显示“input的名称已经存在于序列号4”。

这是我的工作表的屏幕截图

我正在尝试这个公式,但不起作用。

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Len(Target.Value) > 0 Then If Evaluate("Countif(D:D," & Target.Address & ")") > 1 Then MsgBox Target.Value & " is a duplicate entry. It will be removed.", vbExclamation, "Data Entry Editor" & "(INDEX(C7:C23,MATCH(target.Value,D7:D23,0))" Range(Target.Address).ClearContents End If End If End Sub 

虽然@ShaiRado提供的答案当然是正确的,但它缺less一个小部分,并没有指出(dupe)名称已存在于哪一行。 所以,这是另一个解决scheme,其中包括:

  1. 指示重复的行和所需的function
  2. 也允许在列表中间重复。 所以,如果你要在名单中改变从麦克什到吉米的第二号。
  3. 最后,sub已被更改为允许一次编辑多个单元格(select多行并按下del或一次插入多个名称/行)。

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim arrList As Variant, cell As Range Dim rowLast As Long, searchRow As Long For Each cell In Target If cell.Column = 4 And Trim(cell.Value2) <> vbNullString Then rowLast = cell.Parent.Cells(cell.Parent.Rows.Count, 4).End(xlUp).Row arrList = cell.Parent.Range("D1:D" & rowLast).Value2 For searchRow = LBound(arrList) To UBound(arrList) If searchRow <> cell.Row Then If arrList(UBound(arrList), 1) = arrList(searchRow, 1) Then cell.Parent.Activate Union(cell, cell.Parent.Range("C" & searchRow & ":F" & searchRow)).Select MsgBox "This name exists already in row " & searchRow & _ Chr(10) & " with the S. No. " & searchRow - 6 & _ Chr(10) & Chr(10) & "This name will be now removed..." Application.EnableEvents = False cell.ClearContents Application.EnableEvents = True End If End If Next searchRow End If Next cell End Sub 

在你的代码中,你想检查列D中的值,但是在你的代码中检查是否If Target.Column = 2 And.. ,它需要是If Target.Column = 4

另外,您可以使用WorksheetFunction.CountIf来查看D列中是否有重复项。

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 4 And Len(Target.Value) > 0 Then Application.EnableEvents = False If WorksheetFunction.CountIf(Range("D:D"), Target.Value) > 1 Then MsgBox Target.Value & " is a duplicate entry. It will be removed.", vbExclamation, "Data Entry Editor" & "(INDEX(C7:C23,MATCH(Target.Value,D7:D23,0))" Target.ClearContents End If Application.EnableEvents = False End If End Sub 

excel有这个function内置到function区…

使用条件格式 – 标记popup式通知的重复和数据validation

http://www.excel-easy.com/examples/prevent-duplicate-entries.html