TRIM 将日期左对齐

问题描述

问题

在写这篇文章时,我意识到了问题所在并修复了它。然而,在花了太多时间之后,我仍然想知道这是否是最好的方法

在工作表中,我将宏应用于我有一列,其中一些单元格包含文本,其他单元格包含日期 (DD.MM.YYYY)。 Excel 会自动将文本左对齐,日期右对齐。

我遇到了有时在此列中尾随空格的问题。所以我使用了一个带有 TRIM 的 for 循环来确保没有前导或尾随空格。它起作用了,但所有日期现在都向左对齐,而之前它们都向右对齐。当我双击其中一个单元格然后选择另一个单元格时,即使我没有对单元格做任何事情,日期也会向右对齐(这是我想要的)。


修复

我花了很长时间才意识到(或仔细阅读)TRIM 用于字符串。

  1. 我在运行宏之前注意到:日期会自动向右对齐,但在功能区中的“对齐”中,没有选择水平对齐的选项。如果我手动执行此操作并将日期向右对齐,然后运行宏,则日期将保持在右侧。

  2. 在运行宏之前检查 VarType 时,正如预期的那样,对于带有文本的单元格,我得到 8,对于带有日期的单元格得到 7。然而,在运行宏之后,我得到了 8 (意思是字符串)。双击带有日期的单元格并取消选择后,VarType 再次变为 7。在 Excel 功能区中,它总是说它是一个日期(宏之前和之后),因此 Excel 似乎没有显示 VBA 告诉我的内容

  3. 我现在的解决方法是:在应用 TRIM 之前,我的宏检查单元格的 VarType,如果它是 7,它什么都不做,因为只有尾随空格一直是用户输入文本的问题。 (或者,我可以将日期对齐并让 TRIM 遍历所有单元格)

这很好,但有没有更好的方法来做到这一点?在日期上使用 TRIM 是否有可能搞砸?我正在尝试从中学到一些东西。


代码

为了更好的衡量,我的示例代码包括修复。

Sub test()
    Dim ws          As Worksheet
    Dim searchRng   As Range
    Dim cell        As Variant
    
    Set ws = ActiveSheet
    
    With ws
        Set searchRng = .Range("A1:A100")
        For Each cell In searchRng
            If VarType(cell) = 7 Then
                'Date -> Do nothing
            Else
                cell.Value = WorksheetFunction.Trim(cell.Value)
            End If
            
        Next cell
    End With
End Sub

解决方法

对于你的问题,我做了一些测试,结果和你的相差很大,是不是excel版本的原因?

我在 A1 中有一个数据,在日期前加上空格,如下所示:

enter image description here

通过执行下面的函数,第一个 typename 是 string,但是去掉空格后它最终变成了 typename date,我认为没有必要在你的解决方案上检查类型?>

Sub tt()

Debug.Print TypeName(Sheet1.Range("A1").Value)

Sheet1.Range("A1").Value = Trim(Sheet1.Range("A1").Value)

Debug.Print TypeName(Sheet1.Range("A1").Value)

End Sub

enter image description here

所以这意味着您的代码可以在循环中简化如下,并且仍然产生相同的结果,它是否右对齐无关紧要:

For Each cell In searchRng
    cell.Value = Trim(cell.Value)
Next cell