2013-09-05 58 views
4

我正在编写一个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 

任何想法? 谢谢

回答

8
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

蒂姆的答案应该适合你,但你可能想限制错误处理程序提供该特定错误号的响应。 – dennythecoder

1

如果你只是想测试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 no validation." 
    Exit Sub 
noval: 
    MsgBox "Active cell has no validation." 
    On Error GoTo 0 
End Sub 
+0

如果您真的有兴趣检查单个单元格是否有验证,那么这是最有效的方法。如果您正在检查工作表中的所有单元格,则可以修改此范围以获取一次范围r,然后循环遍历每个单元格和范围r的交点,以将验证添加到没有它的单元格。 – GlennFromIowa

0

这对我的作品

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

我知道这个问题是旧的,但因为它来自当谷歌搜索“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 
+1

这应该是被接受的答案... –

0

另外,如果你想获得验证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 
0

大约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 
相关问题