Excel VBA宏:如何查找带有列表验证的单元格

时间:2017-05-22 15:39:48

标签: excel-vba vba excel

我想要一个宏来清除工作表上给定范围内的所有单元格,除非它具有(特别是)LIST验证。 (在这种情况下,我想让它='选择'。)

所以......我需要宏来:

1)检查工作表上某个范围内的所有单元格 2)如果单元格没有(特定)LIST验证,它将使单元格=“” 3)如果细胞DOES(具体地)具有LIST验证,它将使细胞='选择'

这样的事情:

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

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用范围对象的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

注意: 3 is the xlDVType constant for "List" validation。您也可以使用常量表达式: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

答案 1 :(得分:1)

这是一种方法。为了使错误处理远离主程序,我将验证检查器放入一个独立的功能中:

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

它的闪烁,所以你可能想暂时关闭屏幕更新,也可能在它运行时进行计算,但我认为这样做会影响你的目标。