Vba 防止多列中出现重复条目
我目前正在使用此宏来防止用户在电子表格中输入类似的条目。这在单个列中运行良好 但是如何在多个列中添加类似的内容(如A、D和F列)。每列仅允许唯一的记录。请帮帮我Vba 防止多列中出现重复条目,vba,excel,Vba,Excel,我目前正在使用此宏来防止用户在电子表格中输入类似的条目。这在单个列中运行良好 但是如何在多个列中添加类似的内容(如A、D和F列)。每列仅允许唯一的记录。请帮帮我 Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Column <> 1 Or .Cells.Count > 1 Then Exit Sub If WorksheetFunction.Count
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Column <> 1 Or .Cells.Count > 1 Then Exit Sub
If WorksheetFunction.CountIf(Columns(.Column), .Value) > 1 Then
Application.DisplayAlerts = False
.ClearContents
Application.DisplayAlerts = True
MsgBox "Record no. already exists!"
End If
End With
End Sub
Private子工作表\u更改(ByVal目标作为范围)
有目标
如果.Column 1或.Cells.Count>1,则退出Sub
如果工作表function.CountIf(列(.Column),.Value)>1,则
Application.DisplayAlerts=False
.ClearContents
Application.DisplayAlerts=True
MsgBox“记录编号已存在!”
如果结束
以
端接头
我已在if中修改了您的代码,并将其放在普通模块中的单独过程中:
Sub ClearCont(cl As Range)
Application.EnableEvents = False
cl.ClearContents
Application.EnableEvents = True
MsgBox "Record no. already exists!"
'cl.Select
End Sub
然后,工作表下的代码应如下所示:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Dim col As Range
With Target.Parent
Set rng = Union(.Columns(1), .Columns(4), .Columns(6))
End With
With Target
For Each col In rng.Columns
If WorksheetFunction.CountIf(col, .Value) > 0 And col.Column <> .Column Then
ClearCont Target
ElseIf WorksheetFunction.CountIf(col, .Value) > 1 Then
ClearCont Target
End If
Next col
End With
End Sub
选择A、D和F列,可以对其进行修改以添加更多列
编辑:正如下面Peh所建议的,我已将
ActiveSheet
更改为Target.Parent
。我还在ClearCont
子例程中对cl.Select
进行了注释。我认为如果直接在工作表中手动键入值,这行代码将非常有用-用户将返回到被询问的单元格。但是,例如,如果值是按表单输入的,则您宁愿将其保留或删除。只需更改原始代码中的if
语句并允许另一列,即可将此代码应用于其他列
If (.Column <> 1 And .Column <> 4) Or .Cells.Count > 1 Then Exit Sub
如果(.Column 1和.Column 4)或.Cells.Count>1,则退出Sub
可以使用附加的And语句和添加更多列。列xxx
If (.Column <> 1 And .Column <> 4 And .Column <> 6) Or .Cells.Count > 1 Then Exit Sub
如果(.Column 1和.Column 4和.Column 6)或.Cells.Count>1,则退出Sub
我想你可以参考这一点:ActiveSheet
中列上的Excel VBA循环不是一个好主意,这可以是一个不同的工作表。使用Target.Parent
获取Target
所在的工作表。此外,应避免选择。通常,工作表的更改(按范围为ByVal Target)适用于活动工作表。您需要特别努力修改非活动工作表。不一定。例如,如果您运行VBA宏来更改某些内容,例如在Sheet1上,则Sheet2仍然可以是活动的。因此,我建议将ActiveSheet
替换为Target.Parent
,这样可以很容易地解决此问题,并且不会遇到任何奇怪的问题。或者用ActiveSheet删除,因为。列总是指目标。默认情况下,父项在工作表\u Change
事件中。好的,我明白你的意思。但是在第一个宏中,我会考虑CL选择,这取决于如何使用电子表格。查看我的编辑。是的,在这种情况下,。选择
可能有意义。起初我只是不知道这有什么用处。
If (.Column <> 1 And .Column <> 4 And .Column <> 6) Or .Cells.Count > 1 Then Exit Sub