vba - 将 Excel 单元格设置为包含不带前导撇号的日期的字符串

标签 vba excel

我有一些代码使用 .CopyFromRecordset 将字符串写入 Excel 工作表。此记录集包含看起来像日期和数字的字符串,例如 109-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 之类的内容也没有影响。

这看起来很微不足道,但经过几个小时的尝试,我还没有找到可行的解决方案。

最佳答案

以下代码:

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

关于vba - 将 Excel 单元格设置为包含不带前导撇号的日期的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52054051/

相关文章:

excel - VBA左函数问题

vba - 搜索两个值并在循环中复制其间的所有内容

arrays - 跨行求和并计算小于 0 的行数

VBA粘贴到下一个空行

excel - 如何在 VBA 中获取标签的内部文本,不包括嵌套标签中的文本?

python - 将 Excel 文件加载到 numpy 二维数组中

mysql - excel VBA更新SQL中的现有记录

javascript - 如何使用javascript打开Excel

excel - VBA 如何确定是否隐式使用默认属性?

xml - Excel“从xml数据导入”不会添加新列