我是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
如果DataValidationRange显然具有数据验证功能,那么“ If HasValidation(Range(“ DataValidationRange”))然后”行将返回false,这意味着应该执行“退出子”。但是显然reutrn的值是错误的,因为sub可以正常工作,这使我想知道那条线是如何工作的。我想念什么?
您的范围通过值传递,因此到达该行时,它只是在读取范围的内容,而不是整个Range
对象。将您的函数开始行更改为
Private Function HasValidation(ByRef r As Range) As Boolean
并且在不使用方括号的情况下对其进行调用(以停止将其转换为值):
If HasValidation Range("DataValidationRange") Then