我有一些代码使用 .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
之类的内容也没有影响。
这看起来很微不足道,但经过几个小时的尝试,我还没有找到可行的解决方案。
最佳答案
以下代码:
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/