我需要对下面编写的代码提出建议,以防止粘贴在下拉单元格上
I need advise on the code below written to prevent paste on the drop down cells
我是 VBA 的新手。这是代码
Private Sub Worksheet_Change(ByVal Target As Range)
'Does the validation range still have validation?
If HasValidation(Range("DataValidationRange")) Then
Exit Sub
Else
Application.Undo
MsgBox "Error: You cannot paste data into these cells." & _
"Please use the drop-down to enter data instead.", vbCritical
End If
End Sub`
`Private Function HasValidation(r) As Boolean
'Returns True if every cell in Range r uses Data Validation
On Error Resume Next
x = r.Validation.Type
If Err.Number = 0 Then HasValidation = True Else HasValidation = False
End Function
行 "If HasValidation(Range("DataValidationRange")) Then" returns false if DataValidationRange obciously has data validation,这意味着 'exit sub' 应该被执行。但显然 reutrn 值是错误的,因为 sub 工作正常,这让我想知道那条线是如何工作的。我错过了什么?
第 1 步:你的范围是按值传递的,所以当它到达那一行时,它只是读取你的范围的内容,而不是整个 Range
目的。将您的函数起始行更改为
Private Function HasValidation(ByRef r As Range) As Boolean
并且在不使用括号的情况下调用它(停止将其转换为值):
If HasValidation Range("DataValidationRange") Then
从技术上讲,您可以只做最后一部分,但我想为它指出一些语法。
步骤 2:x
上的测试不正确,如果范围已验证,它将分配一个数字给 x
。如果不是,它会将 x 保留为空,因此您应该使用:
If IsEmpty(x) Then HasValidation = False Else HasValidation = True
我是 VBA 的新手。这是代码
Private Sub Worksheet_Change(ByVal Target As Range)
'Does the validation range still have validation?
If HasValidation(Range("DataValidationRange")) Then
Exit Sub
Else
Application.Undo
MsgBox "Error: You cannot paste data into these cells." & _
"Please use the drop-down to enter data instead.", vbCritical
End If
End Sub`
`Private Function HasValidation(r) As Boolean
'Returns True if every cell in Range r uses Data Validation
On Error Resume Next
x = r.Validation.Type
If Err.Number = 0 Then HasValidation = True Else HasValidation = False
End Function
行 "If HasValidation(Range("DataValidationRange")) Then" returns false if DataValidationRange obciously has data validation,这意味着 'exit sub' 应该被执行。但显然 reutrn 值是错误的,因为 sub 工作正常,这让我想知道那条线是如何工作的。我错过了什么?
第 1 步:你的范围是按值传递的,所以当它到达那一行时,它只是读取你的范围的内容,而不是整个 Range
目的。将您的函数起始行更改为
Private Function HasValidation(ByRef r As Range) As Boolean
并且在不使用括号的情况下调用它(停止将其转换为值):
If HasValidation Range("DataValidationRange") Then
从技术上讲,您可以只做最后一部分,但我想为它指出一些语法。
步骤 2:x
上的测试不正确,如果范围已验证,它将分配一个数字给 x
。如果不是,它会将 x 保留为空,因此您应该使用:
If IsEmpty(x) Then HasValidation = False Else HasValidation = True