Excel自定义格式,检查字符

问题描述:

我需要的是自定义格式,以根据这些规则更改值:Excel自定义格式,检查字符

  1. 如果“/”不存在和数量的长度小于6,添加零至 的begining。
  2. 如果“/”存在且“/”之前的数字长度小于6,则将 零增加到开头。
  3. 如果“/”存在,并且“/”之后的数字长度为1,则在最后一个字符前加上 。
  4. 如果“/”存在,并且“/”之后的数字长度为2,则保留为 。
  5. 串的总长度 “/” 将是8,没有它 - 6

未格式化的数据:

-534 
1083 
386840/2 
12345/10 

期望的结果:

000534 
001083 
38684002 

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

=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);"/";""))) 

谁能给我一个提示?

+0

你不能要求的数字格式来检查你的电话号码。因此,在将其提交给NumberFormat之前,必须将40/2转换为4002和5/10转换为510。你应该可以用帮助栏(你可能会保持隐藏)做到这一点,但如果这是不可能的,你的唯一办法就是VBA。 – Variatus

+0

@Variatus不能这样做,这是数字格式的原因,否则我会使用公式。 – AntiDrondert

+0

你必须告诉更多。您是否允许更改列中的数据?只要忘记用NumberFormat来做就可以了。必须找到其他解决方案 – Variatus

下面是使用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 
+0

虽然它看起来像我需要的东西,但它不能没有宏就可以完成。忘了我可以将两个部分分开,然后加入他们,非常感谢,明天我会仔细研究一下。 – AntiDrondert

+0

无需检查字符串的部分是否为数字,每次都是100%数字,忘记提及。 – AntiDrondert

+0

@AntiDrondert这使得代码更简单。这种方法的主要缺陷是工作簿仅限于拥有64,000个独特的单元格格式/单元格样式。用“格式”替换值会更加健壮,但会阻止保留没有帮助列的原始数据。 –