【问题标题】:Excel VBA Validation ObjectExcel VBA 验证对象
【发布时间】:2014-12-15 10:40:07
【问题描述】:

我没有使用过但需要建议的 VBA 功能。

我有一个大而可怕的工作表,需要在数据输入时进行数据验证。很多错别字和错误的数字要修复。我刚开始使用 Validation 对象并需要建议...

  • 我对使用基于接口的数据验证有点谨慎,尤其是来自 维护的角度。这很傻吗?

  • 是否允许范围(或其他任何内容)拥有多个验证对象?

  • 是否有一种简单的方法可以在单元格输入时触发验证对象,或者是 和使用基于接口的Validation一样吗?

  • 我是在无中生有吗?

谢谢, 迈克

【问题讨论】:

  • 数据选项卡 -> 数据验证 - 就在那里。如果有不清楚的地方,请按 F1 寻求帮助。

标签: vba validation excel excel-2010


【解决方案1】:

按顺序处理您的问题 1. 使用内置数据验证是最简单、最简单的方法,但它确实有局限性。你不是傻,但答案取决于你的情况,考虑几个因素,例如“你预计验证可能多久改变一次”,“验证有多复杂”,“有多少不同的用户可能正在使用这个床单”? (我发现您拥有的用户越多,他们中的一个就越有可能做一些不同的事情并“破坏”您的验证。我在单元格数据验证中遇到的最大问题是用户复制单元格并粘贴到验证的顶部,这将删除验证(用户或您没有意识到) 2. 据我所知,每个单元格的数据验证不能超过 1 个 3. 我不再使用下面的方法,并且想出了我自己的自定义数据验证方法,但是下面的代码有效地重新运行了单元内数据验证检查。这个过程是为我们更广泛的 Validatiosn 模块调用的,该模块在数据输入结束时运行,因此它不是“实时”运行的

Sub copy_paste_errors_CO()

If Application.Version >= "12.0" Then
Application.StatusBar = "Checking for Cell Format errors"
' This will work for excel 2007 but not earlier
'--------- Identify Copy and Paste errors where cell level validation not activated
    Dim DataRange As Range
    Dim c As Range
    Dim count As Long
    Dim ExactMatch As Boolean
    'Find the cells containing Data Validation
    Set DataRange = Worksheets("Contacts").Range(CO_DataRange).SpecialCells(xlCellTypeAllValidation)
    If DataRange Is Nothing Then
        MsgBox "no cells with any validation"
    Else
        'Loop through each cell that has data validation
        For Each c In DataRange
            If Not IsError(c.Value) Then 'If the data validation errors
                If Len(c.Value) > 0 Then ' only check if data in cell '
                    ExactMatch = False
                    If c.Validation.Type <> xlValidateList Then
                        If c.Validation.Value Then
                            ExactMatch = True
                        End If
                    Else   'List validation
                        Dim LookupName, MatchValue As String
                        Dim rng As Range
                        LookupName = c.Validation.Formula1
                        LookupName = Right(LookupName, Len(LookupName) - 1)
                        Set rng = Range(LookupName).Find(c.Value, LookIn:=xlValues, lookat:=xlWhole)
                        If Not rng Is Nothing Then
                            If StrComp(rng, c.Value, vbBinaryCompare) = 0 Then
                                ExactMatch = True
                            End If
                        End If
                    End If
                    If Not ExactMatch Then
                        'If there is an error, store the error in the error array and colour the interior of the failing cell
                        CopyAndPasteCount_CO = CopyAndPasteCount_CO + 1
                        CopyAndPasteResultsArray(CopyAndPasteCount_CO, 1) = c.Row - CO_StartRow + 1
                        CopyAndPasteResultsArray(CopyAndPasteCount_CO, 2) = c.Address
                        With c.Interior
                            .ColorIndex = CCellFormatErrorColour
                            .Pattern = xlSolid
                        End With
                    End If
                End If
            End If
        Next
    End If
End If

End Sub
  1. 至于你是不是白手起家,这与答案1有关。如果你的使用次数有限,谁知道工作表的工作原理和它的一些陷阱,那么单元内数据验证可能足以满足您的需求

我现在用于数据验证的解决方案是为我要验证的每个工作表定义一个“模板”工作表,并在其中定义每个列的验证规则。这样做的好处是不会被用户复制和粘贴损坏,并且还允许每列进行 1 次以上的验证。我的代码是参数化的,因此只需遵循相同的模板结构,相同的代码就可以跨多个工作表甚至多个不同的工作簿工作。这种方法也比上面粘贴的原始代码快几个数量级,所以我不会在这里包含它,除非你认为这是你想要考虑的东西

【讨论】:

  • 哇,谢谢。这是一些主要的后期回答。如果您能克服限制,现有的 DV 功能似乎很好。我必须让一切都变得愚蠢。我可以看到粘贴会杀死验证,糟透了。我简要地研究了禁用粘贴等,但这似乎有点笨拙。我也在考虑按需验证方法。我很快测试了模板方法,这似乎是一个合乎逻辑的方法。我只能假设基于模板的工作簿启用和/或禁用了某些功能。现在要弄清楚那些是什么。非常感谢。
  • 模板方法的另一个好处是,它使经验不足的开发人员/高级用户更容易修改验证,只需完成模板,无需编码,或者对于新工作簿,放入模块和次要调整。模板结构简单。 A 列包含要应用于的列字母,B 列包含验证类型,例如长度、查找名称、日期格式、强制等。C 列 - 往后是验证使用的元数据列,例如运算符、长度、列表名称等。验证时,我将工作表读入数组并循环使用验证表
  • 马克,我知道这个答案是几年前的,但我会很高兴听到更多关于您的模板验证方法的信息。有没有机会我可以看看一些代码,以便我清楚你是如何完成这个的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多