Excel自定义格式,检查字符
我需要的是自定义格式,以根据这些规则更改值:Excel自定义格式,检查字符
- 如果“/”不存在和数量的长度小于6,添加零至 的begining。
- 如果“/”存在且“/”之前的数字长度小于6,则将 零增加到开头。
- 如果“/”存在,并且“/”之后的数字长度为1,则在最后一个字符前加上 。
- 如果“/”存在,并且“/”之后的数字长度为2,则保留为 。
- 串的总长度 “/” 将是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);"/";"")))
谁能给我一个提示?
下面是使用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
虽然它看起来像我需要的东西,但它不能没有宏就可以完成。忘了我可以将两个部分分开,然后加入他们,非常感谢,明天我会仔细研究一下。 – AntiDrondert
无需检查字符串的部分是否为数字,每次都是100%数字,忘记提及。 – AntiDrondert
@AntiDrondert这使得代码更简单。这种方法的主要缺陷是工作簿仅限于拥有64,000个独特的单元格格式/单元格样式。用“格式”替换值会更加健壮,但会阻止保留没有帮助列的原始数据。 –
你不能要求的数字格式来检查你的电话号码。因此,在将其提交给NumberFormat之前,必须将40/2转换为4002和5/10转换为510。你应该可以用帮助栏(你可能会保持隐藏)做到这一点,但如果这是不可能的,你的唯一办法就是VBA。 – Variatus
@Variatus不能这样做,这是数字格式的原因,否则我会使用公式。 – AntiDrondert
你必须告诉更多。您是否允许更改列中的数据?只要忘记用NumberFormat来做就可以了。必须找到其他解决方案 – Variatus