字符的Excel自定义格式检查
我需要的是根据以下规则更改值的自定义格式:字符的Excel自定义格式检查,excel,format,Excel,Format,我需要的是根据以下规则更改值的自定义格式: 如果缺少“/”且数字的长度小于6,则将零添加到 开始 如果存在“/”且“/”之前的数字长度小于6,则添加 零开始 如果存在“/”,且“/”后的数字长度为1,则添加零 在最后一个字符之前 如果存在“/”,且“/”后的数字长度为2,则保持不变 是 带“/”的字符串的总长度为8,不带“/”的字符串的总长度为-6 未格式化数据: -534 1083 386840/2 12345/10 000534 001083 38684002
-534
1083
386840/2
12345/10
000534
001083
38684002
01234510
所需结果:
-534
1083
386840/2
12345/10
000534
001083
38684002
01234510
到目前为止我的想法:000000;000000;0是非常明显的部分,不带“/”的值无论如何都将被读取为数字。如果它是一个数字,我会使用
[>1000]0
或类似的东西,但据我所知,它不适用于文本。
我正在使用的公式(就目前而言)而不是理想的自定义格式:
有人能给我一个提示吗?这里有一种方法可以使用NumberFormat
实现您想要的功能。VBA事件代码生成适当的数字格式
有一个很大的缺点是,对于每个包含“/”
的唯一条目,您将需要不同的数字格式,并且允许的数字格式的数量可能会受到限制
但是,它不需要helper列,也不会更改存储在单元格中的原始数据
在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
您不能要求数字格式检查您的数字。因此,在提交数字格式之前,必须将40/2转换为4002,将5/10转换为510。你应该可以用一个helper列(你可以隐藏它),但如果不可能的话,你唯一的办法就是VBA。@Variatus不能这样做,这就是为什么要使用数字格式,否则我会使用公式。你必须告诉我更多。是否允许更改所在列中的数据?只是忘了用数字格式。必须找到其他解决方案。Excel中的数字格式仅影响数字。它们不能用于更改文本的表示方式。@RonRosenfeld这可能不是可靠的来源,但它表明,文本的表示方式可以更改,尽管没有任何示例。遗憾的是,如果没有宏,这是无法完成的,尽管它看起来像我需要的东西。忘了我实际上可以将字符串分成两部分并连接起来,非常感谢,我明天会仔细查看。不需要检查字符串的部分是否为数字,每次都是100%的数字,忘了提及。@AntiDrondert使代码更简单。此方法的主要警告是,工作簿仅限于具有64000种独特的单元格格式/单元格样式。用“format”替换该值会更健壮,但会阻止在没有辅助列的情况下保留原始数据。至于值,我很确定其他人将来可能需要原始数据。