将Excel单元格设置为等于包含日期且不带前撇号的字符串

时间:2018-08-28 09:06:21

标签: excel vba excel-vba

我有一些使用.CopyFromRecordset的代码将字符串写入Excel工作表的代码。该记录集包含看起来像日期和数字的字符串,例如 1 09-08-2018 ,并且这些字符串正确保留为字符串。

我最近添加了一些其他处理来调整某些单元格的值。但是,当将值写回单元格时,我无法保留其当前状态(字符串,格式:常规,无前导撇号)。

以下代码说明了我的问题:

Public Sub MCVE()
    With Range("A1")
        Debug.Print .Value '09-08-2018
        Debug.Print .Value2 '09-08-2018
        Debug.Print VarType(.Value) = vbString 'True
        Debug.Print .NumberFormat 'General
        Debug.Print .PrefixCharacter 'Zero-length string
        .Value = .Value 'I want to manipulate the value here too
        '.Value2 = .Value2 'Yields the same result
        Debug.Print .Value '08-09-2018
        Debug.Print .Value2 '43351
        Debug.Print VarType(.Value) = vbString 'False
        Debug.Print .NumberFormat 'm/d/yyyy
        Debug.Print .PrefixCharacter 'Zero-length string
    End With
End Sub

我可以手动将.NumberFormat设置为 @ 强制输入文本,但随后.NumberFormat.PrefixCharacter都会发生变化,这进一步会带来麻烦将其导入另一个程序时。我还可以在分配字符串之前用撇号将其填充,但这也改变了.PrefixCharacter

我尝试使用.Value2代替.Value,没有区别。 .Text是只读的,因此我不能将其用于分配。设置Application.Calculation = xlCalculationManual之类的内容也没有影响。

这似乎很琐碎,但是经过数小时的尝试,我还没有找到可行的解决方案。

1 个答案:

答案 0 :(得分:1)

以下代码:

Public Sub MCVE()
    Dim OldFormat As String
    With Range("A1")
        OldFormat = .NumberFormat
        .NumberFormat = "@"
        .Value = .Value 
        .NumberFormat = OldFormat
    End With
End Sub

解决了Excel 2010和2013中的问题,但(如注释中所述)在2016年将PrefixCharacter更改为撇号。

此版本似乎可以在所有版本中使用:

Public Sub MCVE()
    With Range("A1")
        .NumberFormat = "@"
        .Value = .Value 
        .ClearFormats
    End With
End Sub