【问题标题】:Determine if cell contains data validation确定单元格是否包含数据验证
【发布时间】:2013-09-05 17:55:33
【问题描述】:

我正在编写一个 VBA 代码,它通过一系列单元格检查每个单元格是否具有数据验证(下拉菜单),如果没有,则从另一张表上的列表中为其分配一个。

我目前在检查当前单元格是否已进行数据验证的行有问题。我收到错误 1004“未找到单元格”。

Sub datavalidation()

    Dim nlp As Range
    Dim lrds As Long
    Dim wp As Double
    Dim ddrange As Range

    Sheets("DataSheet").Select

        lrds = ActiveSheet.Range("A1").Offset(ActiveSheet.rows.Count - 1, 0).End(xlUp).Row

        Set nlp = Range("I3:I" & lrds)

        For Each cell In nlp

    'error on following line

            If cell.SpecialCells(xlCellTypeSameValidation).Cells.Count < 1 Then
                wp = cell.Offset(0, -8).Value

                Set ddrange = ddrangefunc(wp)

            End If

        Next

End Sub

有什么想法吗? 谢谢

【问题讨论】:

    标签: vba excel excel-2010


    【解决方案1】:

    我知道这个问题很老了,但是由于它是在谷歌搜索“excel vba 检查单元格是否有验证”时出现的,所以我想我会加点盐。

    如果您调用SpecialCellsRange 对象仅代表一个单元格,则将扫描整个工作表以查找匹配项。如果你的数据量非常大,之前的答案中提供的方法可能会变得有点慢。

    因此,这是检查单个单元格是否具有验证的更有效方法:

    Function HasValidation(cell As Range) As Boolean
        Dim t: t = Null
    
        On Error Resume Next
        t = cell.Validation.Type
        On Error GoTo 0
    
        HasValidation = Not IsNull(t)
    End Function
    

    【讨论】:

    • 请注意,您可以将多单元格范围传递给cell。如果您这样做并且该范围的一部分包含数据验证,那么它将错误地报告False
    【解决方案2】:
    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
    

    【讨论】:

    • Tim 的回答对您来说应该没问题,但您可能希望将错误处理程序限制为针对该特定错误号提供响应。
    【解决方案3】:

    如果你只想测试activecell,那么:

    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
    

    【讨论】:

    • 如果您真的对检查单个单元格是否具有验证感兴趣,这是最有效的方法。如果您要检查工作表中的所有单元格,则可以对其进行修改以获取范围 r 一次,然后循环遍历每个单元格的交叉点和范围 r 以将验证添加到没有它的单元格。
    【解决方案4】:

    另外,如果您想获得验证 Source 您可以使用以下...

    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
    

    【讨论】:

      【解决方案5】:

      大约 4 年后,我也在寻找细胞验证。结合这里的一些答案,这就是我想出的:

      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
      

      【讨论】:

        【解决方案6】:

        正在寻找一种方法来处理这个问题,以避免接下来的错误恢复。 这是我实现它的方式:

        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
        

        【讨论】:

          【解决方案7】:

          这对我有用

          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
          

          【讨论】:

            【解决方案8】:
            Function isValidated(ByVal Cell as Range) as Boolean
                On Error Resume Next
                isValidated = Not isEmpty(Cell.Validation.Type)
            End Function
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-10-04
              • 2023-03-10
              • 2015-02-13
              • 1970-01-01
              • 2022-11-23
              • 2020-12-09
              • 1970-01-01
              相关资源
              最近更新 更多