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

时间:2018-03-19 22:24:07

标签: excel validation vbscript

我们的发票#格式非常严格,必须符合某种格式。我们手动执行此操作,并且经常会出现多种变化,因此尝试创建数据验证以控制发票编号的输入。

以下是格式:

YYYYMMDD-RNN

  1. 发票号码正好是12个字符
  2. 前4个字符是年份(全年,如2018年)
  3. 接下来的2个字符是月份(如02,必须具有1到9的前导零)并且不允许高于12。
  4. 接下来的2个字符是当天(如08,必须具有1到9的前导零)并且不允许高于31。
  5. 下一个字符是“ - ”
  6. 下一个字符是区域标识符。允许的数字是0到9。
  7. 最后2个字符是从01开始的顺序#。必须具有1到9的前导零。
  8. 需要一个公式来验证这一点。

2 个答案:

答案 0 :(得分:1)

以下公式应该有效,但我无法将其插入到自定义数据验证中。我怀疑这是一个字符限制。如果有人能发光,那就太好了。

= IF(AND(LEFT(A1; 4)* 1·= YEAR(TODAY()); LEFT(A1; 4)* 1> = 2000); IF(AND(MID(A1; 5; 2) * 1> = 1; MID(A1; 5; 2)* 1·= 12); IF(AND(MID(A1; 7; 2)* 1> = 1; MID(A1; 5; 2)* 1·; = 30); IF(MID(A1; 9; 1)=" - &#34 ;; IF(AND(MID(A1; 10; 1)* 1> = 0; MID(A1; 10; 1 )* 1·= 9); IF(AND(MID(A1; 11; 2)* 1> = 1; MID(A1; 11; 2)* 1·= 99); TRUE; FALSE); FALSE); FALSE ); FALSE); FALSE); FALSE)

P.S。:我在2000年之后没有发票。

答案 1 :(得分:0)

在标准模块代码表中尝试使用此UDF。

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