Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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中的数据?_Excel_Vba_Validation - Fatal编程技术网

如何实时验证和更正excel中的数据?

如何实时验证和更正excel中的数据?,excel,vba,validation,Excel,Vba,Validation,我知道excel具有数据验证功能,但是否有一种方法可以自动为用户应用更改,而不是提示他们存在问题 例如,我们有一个通用的电子表格模板,用于内部系统添加项目。在第一列中,对于项目编号,不能有任何非法字符。因此,如果用户在A1中输入AN-XR10LP/1,然后单击下一个单元格,我希望验证能够在用户不做任何操作的情况下将A1值更正为ANXR10LP1 有什么想法可以从这个开始吗?为工作表更改创建一个处理程序 Private Sub Worksheet_Change(ByVal Target As Ra

我知道excel具有数据验证功能,但是否有一种方法可以自动为用户应用更改,而不是提示他们存在问题

例如,我们有一个通用的电子表格模板,用于内部系统添加项目。在第一列中,对于项目编号,不能有任何非法字符。因此,如果用户在A1中输入AN-XR10LP/1,然后单击下一个单元格,我希望验证能够在用户不做任何操作的情况下将A1值更正为ANXR10LP1


有什么想法可以从这个开始吗?

为工作表更改创建一个处理程序

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
在处理程序中,查看
Target
指向的位置,并在此基础上应用验证逻辑

请确保在回写更正的值时忽略引发的
更改
事件:

Private Sub Worksheet_Change(ByVal Target As Range)
    static self_protect as boolean

    if self_protect then exit sub


    ...
    self_protect = true
    Target.Value = "corrected value"
    self_protect = false
    ...

End Sub

我认为只有使用VBA才能实现这一点。请尝试下面的代码。如果对单元格进行数据验证,则可能需要对其进行调整

将此模块放置在要验证数据的工作表对象中

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 And Target.Rows.Count = 1 Then '-> make sure row count is 1 and target is in column A, can further refine if needed

    Dim strValue As String

    strValue = CleanString(Target.Value)

    Application.EnableEvents = False
    Target = strValue
    Application.EnableEvents = True

End If

End Sub

Function CleanString(str As String) As String

CleanString = Replace(str, "-", "")
CleanString = Replace(CleanString, "/", "")
'...
'keep adding replacements as needed


End Function

与其自我保护,为什么不关闭应用程序.EnableEvents,然后再打开?@Doug-如果您在一个可能有其他代码需要处理事件的环境中运行代码,那么关闭它们可能会导致问题。“有时候更具选择性是更好的。”蒂姆·威廉姆斯,这是真的,但我不认为是这样。我发现像上面这样的代码比使用内置的
应用程序.EnableEvents
更难维护,所以我认为最好使用它,除非需要像GSerg这样的定制方法。我想你的观点是,你不知道是哪种情况。如果你不关闭事件或以其他方式不处理自己的更新值,你将在这里陷入循环…@TimWilliams。我完全明白你的意思,但当我在一个(小)样本集上测试这个时,它似乎工作顺利。我确实编辑了我的代码以获得最佳实践。谢谢,你能解释一下如何将其放入工作表对象中吗?我试图创建一个新的宏,但它不是这样工作的@user7954->这对您来说做得很好。嘿,Scott,在我尝试执行的第一个If语句行上:If Target.Column=1和Target.Rows.Count=1和Target.Row>=2,然后使其跳过标题,但它会使Excel崩溃!