Excel自定义格式检查字符

时间:2017-09-05 09:23:27

标签: excel format

我需要的是自定义格式,可根据以下规则更改值:

  1. 如果" /"不存在且数字的长度小于6,添加零 开始时。
  2. 如果" /"存在且数字的长度在" /"之前小于6,加 从零开始。
  3. 如果" /"在" /"之后存在和数字的长度是1,加零 在前一个角色之前
  4. 如果" /"在" /"之后存在和数字的长度是2,离开吧 是
  5. 字符串的总长度为" /"将是8,没有它 - 6
  6. 未格式化的数据:

    -534  
    1083  
    386840/2  
    12345/10  
    

    期望的结果:

    000534  
    001083  
    38684002  
    01234510  
    

    到目前为止我的目标:
    000000; 000000; 0是非常明显的部分,没有" /"无论如何都将被读作数字。如果是一个数字,我会使用[>1000]0或类似的东西但据我所知,它不能与Text一起使用。
    公式I使用(仅适用于现在)而不是理想的自定义格式:

    =IF(ISERROR(FIND("/";A1));  
        CONCATENATE(REPT("0";6-LEN(A1));A1);  
        IF((LEN(A1)-FIND("/";A1))=1;  
            SUBSTITUTE(CONCATENATE(REPT("0";7-FIND("/";A1));A1);"/";"0");  
            SUBSTITUTE(CONCATENATE(REPT("0";7-FIND("/";A1));A1);"/";"")))  
    

    任何人都可以给我一个提示吗?

1 个答案:

答案 0 :(得分:1)

以下是使用NumberFormat完成所需内容的一种方法。适当的数字格式由VBA事件代码生成。

有一个很大的缺点是,对于包含"/"的每个唯一条目,您将需要不同的数字格式,并且允许的数字格式的数量可能会受到限制。

但是,它不需要辅助列,也不会改变存储在单元格中的原始数据。

A列中输入的任何内容都将根据规则进行格式化。 如果存在斜杠,代码将改变数字部分;但不测试看两者都是数字。所以abc/1 - > abc01,但如果您愿意,可以更改。

这是工作表代码:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim FormatRange As Range, C As Range
    Const Fmt As String = "000000;000000;000000;@"
    Dim V As Variant

Set FormatRange = Range("A:A")
If Not Intersect(Target, FormatRange) Is Nothing Then
    For Each C In Intersect(Target, FormatRange)
        If InStr(C.Text, "/") = 0 Then
            C.NumberFormat = Fmt
        Else
            V = Split(C.Text, "/")
            V(0) = Format(V(0), "000000")
            V(1) = Format(V(1), "00")
            C.NumberFormat = ";;;" & Chr(34) & Join(V, "") & Chr(34)
        End If
    Next C
End If

End Sub