WorksheetFunction.Trim删除前导零

时间:2019-05-24 02:16:50

标签: excel vba

我看到了很多问题,问如何删除前导零,但是我在保护我的工作上遇到了麻烦。

我正在尝试在具有混合数据类型的一系列不同工作表上运行通用Application.WorksheetFunction.Trim宏。这些列之一将具有不同的长度数字,其中一些具有前导零,而我有一列日期。我可以通过在运行时将每个单元格格式化为Text来保留零,但这似乎打破了我的日期。尝试过以下操作:如果单元格中不包含日期,则仅将其转换为Text并没有取得太大的成功。

If Cell.NumberFormat <> "d-mmm-yy" Or Cell.NumberFormat <> "dd-mmm-yy" Then
    Cell.NumberFormat = "@"
End If

我尝试使用

将'强制插入到单元格值中
If Left(Cell.Value, 1) = "0" Then
    Cell.Value = "'" & Cell.Value
    Debug.Print Cell.Value
End If

但是我似乎没有多大运气。我正在尝试构建一些通用的解决方案,该解决方案不需要随着其他用户添加更多信息而更改电子表格中的任何内容。

编辑:有没有一种方法可以检测到某个单元格已设置为日期格式,如果可以,请避免将其覆盖为文本格式?为了节省时间,为了继续节省时间,请仅将其标记为Text(如果尚未注册并且也不是Date)。

编辑2:示例-一个工作表将包含诸如
之类的行 ABCD'012345 TL PT1234 NS CA
ABCD 112345 TL PT1235 NS CA
ACBD 0890 TL PT1238 NS CA

而另一个看起来更像

ABCD DR ROBB鲍勃·罗伯逊护照1990年1月12日(显示为90年12月1日)AA1234501 CA ROBER0123456789 NS CA

1 个答案:

答案 0 :(得分:0)

可能还有其他问题,并提供示例数据wpul; d帮助说明您的情况,但我将从以下内容开始。

If Cell.NumberFormat <> "d-mmm-yy" Or Cell.NumberFormat <> "dd-mmm-yy" Then
    Cell.NumberFormat = "@"
End If

您陷入了一个常见的逻辑“漏洞”。在此处使用Or运算符是错误的。如果单元格的数字格式为d-mmm-yy,则不是dd-mmm-yy,反之亦然。此外,任何其他数字格式都不是。本质上,每个单元格的数字格式(无论它是什么)都不是选项之一,因此测试始终为真。您需要And运算符。

If Cell.NumberFormat <> "d-mmm-yy" AND Cell.NumberFormat <> "dd-mmm-yy" Then
    Cell.NumberFormat = "@"
End If

以上说明数字格式不能为 “ d-mmm-yy”或“ dd-mmm-yy”。

但是,单元格的.NumberFormat属性可以是 General ,并且仍然是真实日期。为了绕过这个缺点,提到了IsDate函数。这取决于附加到单元格默认.Value属性(而不是.Text.Value2属性)的区域信息。

If NOT ISDATE(Cell.Value) Then
    Cell.NumberFormat = "@"
End If

我发现IsDate相当可靠,即使在测试仅看起来像日期的文本时也是如此。

问:如果前导零的单元格未设置为文本格式,并且没有强制使用前导零的自定义数字格式,那么将前导零保留在首位的原因是什么?