Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 防止多列中出现重复条目_Vba_Excel - Fatal编程技术网

Vba 防止多列中出现重复条目

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

我目前正在使用此宏来防止用户在电子表格中输入类似的条目。这在单个列中运行良好

但是如何在多个列中添加类似的内容(如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.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