VBA-重复值(未使用 DV)
VBA-duplicate value (not using DV)
第一次 post,长时间的堆栈冲浪。我有一个关于捕获用户在 sheet 中输入欺骗值的问题。我们无法使用数据验证,因为 cut/copy/paste 抛出数据验证并允许他们输入欺骗值。我最初使用的是这段代码:
Option Explicit
Public Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'******problem when copying entire row and pasting into new row, enables user to paste dupe Box ID #******
'Defining variables in Mailroom
Dim WS As Worksheet, EvalRange As Range
'Range to check for duplicates
Set EvalRange = Worksheets("Mailroom").Range("Box_ID_Number")
'Checking if entered value is in the defined range; also if cell is empty exit macro
If Intersect(Target, EvalRange) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
If IsEmpty(Target) Then Exit Sub
'If user enters dupe value in specified range then error message pops up and event is undone
If WorksheetFunction.CountIf(EvalRange, Target.Value) > 1 Then
MsgBox Target.Value & " already appears as a Box ID Number. Please enter a unique ID."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub
该代码可以很好地防止用户在 "Box ID Number." 的列中输入重复值 我遇到的问题是,如果用户要从一个列和另一个单元格中复制一个 Box ID 号从不同的列,他们能够粘贴 _SheetChange 未捕获的 Dupe 值。当我们第一次为此创建代码时,我们禁用了 cut/copy/paste 函数;然而,其他使用 sheet 的人显然仍然需要 sheet.
的其他部分的功能
有什么想法吗?
假设您的用户实际上一次只需要更改一个单元格,我认为以下内容应该可行(它只是您代码的底部):
If Intersect(Target, EvalRange) Is Nothing Then Exit Sub
If IsEmpty(Target) Then Exit Sub
'Check if only one cell in "Box_ID_Number" is changed
If Intersect(Target, EvalRange).Count > 1 Then
MsgBox "One cell at a once please."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
If WorksheetFunction.CountIf(EvalRange, Intersect(Target, EvalRange)) > 1 Then
MsgBox Target.Value & " already appears as a Box ID Number. Please enter a unique ID."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
我删除了 Or Target.Cells.Count > 1
,在我的版本中您看到的是 CountIf(EvalRange, Intersect(Target, EvalRange))
,而不是 CountIf(EvalRange, Target.Value)
。如果 Intersect(Target, EvalRange))
不是一个单元格,您将再次收到类型不匹配 (13) 错误。因此,为了防止它,我实施了您看到的额外检查。
@ZygD!用 Intersect(Target, EvalRange)
钉了它
完成的代码如下所示:
Option Explicit
Public Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Defining variables in Mailroom
Dim WS As Worksheet, EvalRange As Range
'Range to check for duplicates
Set EvalRange = Worksheets("Mailroom").Range("Box_ID_Number")
If Intersect(Target, EvalRange) Is Nothing Then Exit Sub
If IsEmpty(Target) Then Exit Sub
'Check if only one cell in Box_ID_Number is changed at a time
If Intersect(Target, EvalRange).Count > 1 Then
MsgBox "Unable to modify greater than 1 Box ID Number at a time. Please select one Box ID Row."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If`
'check for dupe value in Box ID Number Column; if copy and pasting entire row, dupe check still holds
If WorksheetFunction.CountIf(EvalRange, Intersect(Target, EvalRange)) > 1 Then
MsgBox Intersect(Target, EvalRange) & " already appears as a Box ID Number. Please enter a unique ID."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub
第一次 post,长时间的堆栈冲浪。我有一个关于捕获用户在 sheet 中输入欺骗值的问题。我们无法使用数据验证,因为 cut/copy/paste 抛出数据验证并允许他们输入欺骗值。我最初使用的是这段代码:
Option Explicit
Public Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'******problem when copying entire row and pasting into new row, enables user to paste dupe Box ID #******
'Defining variables in Mailroom
Dim WS As Worksheet, EvalRange As Range
'Range to check for duplicates
Set EvalRange = Worksheets("Mailroom").Range("Box_ID_Number")
'Checking if entered value is in the defined range; also if cell is empty exit macro
If Intersect(Target, EvalRange) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
If IsEmpty(Target) Then Exit Sub
'If user enters dupe value in specified range then error message pops up and event is undone
If WorksheetFunction.CountIf(EvalRange, Target.Value) > 1 Then
MsgBox Target.Value & " already appears as a Box ID Number. Please enter a unique ID."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub
该代码可以很好地防止用户在 "Box ID Number." 的列中输入重复值 我遇到的问题是,如果用户要从一个列和另一个单元格中复制一个 Box ID 号从不同的列,他们能够粘贴 _SheetChange 未捕获的 Dupe 值。当我们第一次为此创建代码时,我们禁用了 cut/copy/paste 函数;然而,其他使用 sheet 的人显然仍然需要 sheet.
的其他部分的功能有什么想法吗?
假设您的用户实际上一次只需要更改一个单元格,我认为以下内容应该可行(它只是您代码的底部):
If Intersect(Target, EvalRange) Is Nothing Then Exit Sub
If IsEmpty(Target) Then Exit Sub
'Check if only one cell in "Box_ID_Number" is changed
If Intersect(Target, EvalRange).Count > 1 Then
MsgBox "One cell at a once please."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
If WorksheetFunction.CountIf(EvalRange, Intersect(Target, EvalRange)) > 1 Then
MsgBox Target.Value & " already appears as a Box ID Number. Please enter a unique ID."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
我删除了 Or Target.Cells.Count > 1
,在我的版本中您看到的是 CountIf(EvalRange, Intersect(Target, EvalRange))
,而不是 CountIf(EvalRange, Target.Value)
。如果 Intersect(Target, EvalRange))
不是一个单元格,您将再次收到类型不匹配 (13) 错误。因此,为了防止它,我实施了您看到的额外检查。
@ZygD!用 Intersect(Target, EvalRange)
完成的代码如下所示:
Option Explicit
Public Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Defining variables in Mailroom
Dim WS As Worksheet, EvalRange As Range
'Range to check for duplicates
Set EvalRange = Worksheets("Mailroom").Range("Box_ID_Number")
If Intersect(Target, EvalRange) Is Nothing Then Exit Sub
If IsEmpty(Target) Then Exit Sub
'Check if only one cell in Box_ID_Number is changed at a time
If Intersect(Target, EvalRange).Count > 1 Then
MsgBox "Unable to modify greater than 1 Box ID Number at a time. Please select one Box ID Row."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If`
'check for dupe value in Box ID Number Column; if copy and pasting entire row, dupe check still holds
If WorksheetFunction.CountIf(EvalRange, Intersect(Target, EvalRange)) > 1 Then
MsgBox Intersect(Target, EvalRange) & " already appears as a Box ID Number. Please enter a unique ID."
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub