Determine if cell contains data validation

后端 未结 7 1385
盖世英雄少女心
盖世英雄少女心 2020-11-28 15:40

I am writing a VBA code that goes through a range of cells checking if each cell has data validation (drop down menu) and if not assign one to it from a list on another shee

相关标签:
7条回答
  • 2020-11-28 16:18

    If you only want to test the activecell, then:

    Sub dural()
        Dim r As Range
        On Error GoTo noval
        Set r = Cells.SpecialCells(xlCellTypeAllValidation)
        If Intersect(r, ActiveCell) Is Nothing Then GoTo noval
        MsgBox "Active cell has validation."
        Exit Sub
    noval:
        MsgBox "Active cell has no validation."
        On Error GoTo 0
    End Sub
    
    0 讨论(0)
  • 2020-11-28 16:26

    Also, if you'd like to get the validation Source you can use the following...

    Dim cell as Range
    Dim rng as Range
    Set rng = Range("A1:A10") 'enter your range
    
    On Error Resume Next 'will skip over the cells with no validation
    
    For Each cell In rng
        msgbox cell.Validation.Formula1
    Next cell
    
    0 讨论(0)
  • 2020-11-28 16:26

    Looking for a way to handle this avoiding the error resume next this is the way I implement it:

    Option Explicit
    ' https://stackoverflow.com/questions/18642930/determine-if-cell-contains-data-validation
    ' Use this if you want to omit doing something to the cell added: http://dailydoseofexcel.com/archives/2007/08/17/two-new-range-functions-union-and-subtract/
    Sub ValidationCells()
    
        Dim theSheet As Worksheet
        Dim lastCell As Range
        Dim validationRange As Range
        Dim validationCell As Range
    
        Application.EnableEvents = False ' optional
    
        Set theSheet = ThisWorkbook.Worksheets(1)
    
        theSheet.Unprotect ' optional
    
        ' Add a cell with a value and some validation to bypass specialcells error
        Set lastCell = theSheet.Cells(1, theSheet.Cells.Columns.Count)
        With lastCell
            .Value2 = 1
            .Validation.Add xlValidateWholeNumber, xlValidAlertInformation, xlEqual, "1"
        End With
    
        ' If usedrange is greater than 1 (as we added a single cell previously)
        If theSheet.UsedRange.Rows.Count > 1 Or theSheet.UsedRange.Columns.Count > 1 Then
    
            Set validationRange = theSheet.UsedRange.SpecialCells(xlCellTypeAllValidation)
    
            MsgBox validationRange.Address
    
            For Each validationCell In validationRange
                If validationCell.Address <> lastCell.Address Then
                    MsgBox validationCell.Address
                End If
            Next validationCell
    
        End If
    
        lastCell.Clear
    
        Set validationRange = Nothing
        Set lastCell = Nothing
    
        theSheet.Protect ' optional
    
        Application.EnableEvents = True ' optional
    
    
    End Sub
    
    0 讨论(0)
  • 2020-11-28 16:27

    This works for me

    Sub test()
        On Error Resume Next
            If ActiveCell.SpecialCells(xlCellTypeSameValidation).Cells.Count < 1 Then
                MsgBox "validation"
            Else
                MsgBox "no Validation"
            End If
        On Error GoTo 0
    End Sub
    
    0 讨论(0)
  • 2020-11-28 16:29

    About 4 years later, I am looking for cell validation as well. Combining a few from the answers here, this is what I came up with:

    Option Explicit
    
    Public Sub ShowValidationInfo()
    
        Dim rngCell             As Range
        Dim lngValidation       As Long
    
        For Each rngCell In ActiveSheet.UsedRange
    
            lngValidation = 0
    
            On Error Resume Next
            lngValidation = rngCell.SpecialCells(xlCellTypeSameValidation).Count
            On Error GoTo 0
    
            If lngValidation <> 0 Then
                Debug.Print rngCell.Address
                Debug.Print rngCell.Validation.Formula1
                Debug.Print rngCell.Validation.InCellDropdown
            End If
        Next
    
    End Sub
    
    0 讨论(0)
  • 2020-11-28 16:34
    Dim cell As Range, v As Long
    
    For Each cell In Selection.Cells
        v = 0
        On Error Resume Next
        v = cell.SpecialCells(xlCellTypeSameValidation).Count
        On Error GoTo 0
    
        If v = 0 Then
            Debug.Print "No validation"
        Else
            Debug.Print "Has validation"
        End If
    Next
    
    0 讨论(0)
提交回复
热议问题