我需要对下面编写的代码提出建议,以防止粘贴在下拉单元格上

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

从技术上讲,您可以只做最后一部分,但我想为它指出一些语法。

步骤 2x 上的测试不正确,如果范围已验证,它将分配一个数字给 x。如果不是,它会将 x 保留为空,因此您应该使用:

If IsEmpty(x) Then HasValidation = False Else HasValidation = True