Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA宏:如何查找具有列表验证的单元格_Excel_Vba - Fatal编程技术网

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

Excel VBA宏:如何查找具有列表验证的单元格,excel,vba,Excel,Vba,我想要一个宏来清除工作表中给定范围内的所有单元格,除非它(特别是)进行了列表验证。(在这种情况下,我想让它='选择') 所以。。。我需要宏来: 1) 检查工作表上范围内的所有单元格 2) 如果单元格没有(特别是)列表验证,它将使单元格=” 3) 如果单元格确实有(特别是)列表验证,它将使单元格='选择' 大概是这样的: Dim x as variant with thisworkbook.sheets("audits") For each x in .range("A6:AZ200")

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

所以。。。我需要宏来:

1) 检查工作表上范围内的所有单元格 2) 如果单元格没有(特别是)列表验证,它将使单元格=” 3) 如果单元格确实有(特别是)列表验证,它将使单元格='选择'

大概是这样的:

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之后发布问题。我将更新我的问题,但不确定如何使其更清楚。这也很好地工作,并且更直接(无需调用函数)。有各种类型的验证,我知道为什么我需要具体地缩小范围。非常感谢你!这也可以很好地工作,并且更加直接(无需调用函数)。有各种类型的验证,我知道为什么我需要具体地缩小范围。非常感谢你!