Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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 单元格格式/数据验证/vba以确保单元格中的输入正确_Excel_Validation_Vbscript - Fatal编程技术网

Excel 单元格格式/数据验证/vba以确保单元格中的输入正确

Excel 单元格格式/数据验证/vba以确保单元格中的输入正确,excel,validation,vbscript,Excel,Validation,Vbscript,我们有一张发票,格式非常严格,必须符合一定的格式。我们手动执行此操作,我经常会得到多个变体,因此我试图创建数据验证来控制发票号的输入 以下是格式: YYYYMMDD-RNN 发票号码的长度正好为12个字符 前4个字符是年份(全年,如2018年) 接下来的2个字符是月份(如02,必须有1到9的前导零),并且不允许大于12 接下来的2个字符是日期(如08,必须有1到9的前导零),并且不允许大于31 下一个字符是“-” 下一个字符是区域标识符。允许的数字为0到9 最后两个字符是顺序的#,以01开头。必

我们有一张发票,格式非常严格,必须符合一定的格式。我们手动执行此操作,我经常会得到多个变体,因此我试图创建数据验证来控制发票号的输入

以下是格式:

YYYYMMDD-RNN

  • 发票号码的长度正好为12个字符
  • 前4个字符是年份(全年,如2018年)
  • 接下来的2个字符是月份(如02,必须有1到9的前导零),并且不允许大于12
  • 接下来的2个字符是日期(如08,必须有1到9的前导零),并且不允许大于31
  • 下一个字符是“-”
  • 下一个字符是区域标识符。允许的数字为0到9
  • 最后两个字符是顺序的#,以01开头。必须有1到9的前导零

  • 需要一个公式来验证这一点。

    以下公式应该可以工作,但我无法在自定义数据验证中插入它。我怀疑有字符限制。如果有人可以解释一下,那就太好了


    =如果(和)(左(A1;4)*1=2000);如果(和)(中(A1;5;2)*1>=1;中(A1;5;2)*1=1;中(A1;5;2)*1=0;中(A1;10;1)*1=1;中(A1;11;2)*1在标准模块代码表中尝试此自定义项

    Option Explicit
    
    Function invoiceCheck(rng As Range) As Boolean
        Dim tmp As String
    
        tmp = rng.Value2
    
        'check length
        If Len(tmp) <> 12 Then Exit Function
    
        'check valid date
        If Not IsDate(Join(Array(Mid(tmp, 5, 2), Mid(tmp, 7, 2), Left(tmp, 4)), "/")) Then Exit Function
    
        'check date is today or earlier
        If CDate(Join(Array(Mid(tmp, 5, 2), Mid(tmp, 7, 2), Left(tmp, 4)), "/")) > Date Then Exit Function
    
        'make sure there is a hyphen
        tmp = Split(tmp, "-")(1)
    
        invoiceCheck = IsNumeric(tmp)
    End Function
    
    选项显式
    函数invoiceCheck(rng作为范围)作为布尔值
    将tmp设置为字符串
    tmp=rng.Value2
    “检查长度
    如果Len(tmp)12,则退出功能
    '检查有效日期
    如果不是IsDate(Join(数组(Mid(tmp,5,2),Mid(tmp,7,2),Left(tmp,4)),“/”),则退出函数
    '检查日期为今天或更早
    如果CDate(Join(数组(Mid(tmp,5,2),Mid(tmp,7,2),Left(tmp,4)),“/”)>Date,则退出函数
    '确保有一个连字符
    tmp=拆分(tmp,“-”)(1)
    invoiceCheck=IsNumeric(tmp)
    端函数
    
    除了起草一份需求清单之外,您还为解决方案做了什么吗?我能够使用LEN(A1)=12验证长度;我能够使用=EXACT(左(A1,3),“201”)验证201;我能够使用MID(A1,9,1)=“-”验证连字符;我能够使用=和(ISNUMBER(--MID(A1,11,1)),ISNUMBER(--MID验证最后两个数字(A1,12,1)))非常感谢!!!!!!!!!这很有效。自定义数据验证确实有字符限制。我使用了您在发票旁边的另一个单元格中给出的公式,并在自定义数据验证中使用了此公式=和(B1)=TRUE。