Excel VBA宏:如何查找具有列表验证的单元格
我想要一个宏来清除工作表中给定范围内的所有单元格,除非它(特别是)进行了列表验证。(在这种情况下,我想让它='选择') 所以。。。我需要宏来: 1) 检查工作表上范围内的所有单元格 2) 如果单元格没有(特别是)列表验证,它将使单元格=” 3) 如果单元格确实有(特别是)列表验证,它将使单元格='选择' 大概是这样的:Excel VBA宏:如何查找具有列表验证的单元格,excel,vba,Excel,Vba,我想要一个宏来清除工作表中给定范围内的所有单元格,除非它(特别是)进行了列表验证。(在这种情况下,我想让它='选择') 所以。。。我需要宏来: 1) 检查工作表上范围内的所有单元格 2) 如果单元格没有(特别是)列表验证,它将使单元格=” 3) 如果单元格确实有(特别是)列表验证,它将使单元格='选择' 大概是这样的: Dim x as variant with thisworkbook.sheets("audits") For each x in .range("A6:AZ200")
Dim x as variant
with thisworkbook.sheets("audits")
For each x in .range("A6:AZ200")
if x.validationtype = "list" then
x.value = "Select"
else
x.value = ""
end if
next x
end with
谢谢 您可能可以使用range对象的
SpecialCells
属性仅返回经过验证的单元格,然后执行另一项检查以确保验证类型为List
Dim rng As Range
Dim vRng As Range
Dim cl As Range
Set rng = thisworkbook.sheets("audits").Range("A6:AZ200") 'Modify as needed
'Get a range of ONLY the validation cells
Set vRng = rng.SpecialCells(xlCellTypeAllValidation)
For Each cl In rng
'If the cell has NO VALIDATION:
If Intersect(cl, vRng) Is Nothing Then
cl.ClearContents
ElseIf cl.Validation.Type = 3 Then 'xlValidateList
cl.Value = "Select"
End If
Next
注意:。您也可以使用常量表达式:xlValidateList
上面的方法应该处理混合验证类型,而不会处理任何其他类型的验证。如果可以安全地假设只使用列表验证,则尝试将其压缩为:
Set vRng = rng.SpecialCells(xlCellTypeAllValidation)
vRng.Value = "Select"
For Each cl In rng
'If the cell has NO VALIDATION:
If Intersect(cl, vRng) Is Nothing Then
cl.ClearContents
End If
Next
您可能可以使用range对象的
SpecialCells
属性仅返回经过验证的单元格,然后执行另一项检查以确保验证类型为List
Dim rng As Range
Dim vRng As Range
Dim cl As Range
Set rng = thisworkbook.sheets("audits").Range("A6:AZ200") 'Modify as needed
'Get a range of ONLY the validation cells
Set vRng = rng.SpecialCells(xlCellTypeAllValidation)
For Each cl In rng
'If the cell has NO VALIDATION:
If Intersect(cl, vRng) Is Nothing Then
cl.ClearContents
ElseIf cl.Validation.Type = 3 Then 'xlValidateList
cl.Value = "Select"
End If
Next
注意:。您也可以使用常量表达式:xlValidateList
上面的方法应该处理混合验证类型,而不会处理任何其他类型的验证。如果可以安全地假设只使用列表验证,则尝试将其压缩为:
Set vRng = rng.SpecialCells(xlCellTypeAllValidation)
vRng.Value = "Select"
For Each cl In rng
'If the cell has NO VALIDATION:
If Intersect(cl, vRng) Is Nothing Then
cl.ClearContents
End If
Next
这将是一种方法。为了使错误处理远离主例程,我将验证检查器放入了一个独立的函数中:
Sub clear_validation()
Dim x As Range
With ThisWorkbook.Sheets("audits")
For Each x In .Range("A6:AZ200")
If validationtype(x) = 3 Then
x.Value = "Select"
Else
x.Value = ""
End If
Next x
End With
End Sub
Function validationtype(cl As Range)
Dim t As Integer
t = 0
On Error Resume Next
t = cl.Validation.Type
On Error GoTo 0
validationtype = t
End Function
它是flicker-y,所以您可能希望在运行时暂时关闭屏幕更新,或者关闭计算,但我认为这会满足您的要求。这是一种方法。为了使错误处理远离主例程,我将验证检查器放入了一个独立的函数中:
Sub clear_validation()
Dim x As Range
With ThisWorkbook.Sheets("audits")
For Each x In .Range("A6:AZ200")
If validationtype(x) = 3 Then
x.Value = "Select"
Else
x.Value = ""
End If
Next x
End With
End Sub
Function validationtype(cl As Range)
Dim t As Integer
t = 0
On Error Resume Next
t = cl.Validation.Type
On Error GoTo 0
validationtype = t
End Function
它是flicker-y,因此您可能希望在运行时暂时关闭屏幕更新和计算功能,但我认为这正是您想要的。Joe有什么问题?你是否在获取一些代码时遇到问题(在这种情况下,请发布代码并告诉我们发生了什么情况),或者尝试使用谷歌Fu,因为我确信某个地方有人构建了类似的东西。如果你需要帮助让它发挥作用,请告诉我们。嗨,@CLR-我不会在google fu,特别是stackoverflow fu之后发布问题。我将更新我的问题,但不确定如何使其更清楚。乔,问题是什么?你是否在获取一些代码时遇到问题(在这种情况下,请发布代码并告诉我们发生了什么情况),或者尝试使用谷歌Fu,因为我确信某个地方有人构建了类似的东西。如果你需要帮助让它发挥作用,请告诉我们。嗨,@CLR-我不会在google fu,特别是stackoverflow fu之后发布问题。我将更新我的问题,但不确定如何使其更清楚。这也很好地工作,并且更直接(无需调用函数)。有各种类型的验证,我知道为什么我需要具体地缩小范围。非常感谢你!这也可以很好地工作,并且更加直接(无需调用函数)。有各种类型的验证,我知道为什么我需要具体地缩小范围。非常感谢你!