我有日期格式的单元格范围,格式为dd.mm.yyyy
,如下所示:
05.10.1993
05.10.1993
05.10.1993
05.10.1993
我希望使用VBA将此范围的单元格转换为文本格式,但不会在范围内迭代每个单元格(因为它对于大范围来说很慢)。
我使用了这段代码:
Set rSel = Selection
aDate = rSel.Value
rSel.NumberFormat = "@"
rSel.Value = aDate
因此,我将所选范围分配给中间数组,然后将范围转换为文本格式,并将数组指定回选定范围。
结果是这样的文字:
5/10/1993
5/10/1993
5/10/1993
5/10/1993
我想知道格式转换发生在哪里,好像我debug.print
例如aDate(1,1)
我得到了05.10.1993
值?或者我如何在我发布的简单片段中指示格式,以便我得到预期的文本?
答案 0 :(得分:2)
在代码中,而不是aDate=rSel.Value
,请尝试以下操作:
aDate = Application.Text(rSel.Value2,rSel.NumberFormatLocal)
注意
以下范围属性与此示例相关:
.Value
返回一个变量(数字/日期/字符串/布尔/错误),日期为VBA日期格式。
.Value2
返回变量(数字/字符串/布尔值/错误),日期转换为序列号。
.Text
返回包含格式化值的字符串,这仅适用于单个单元格。
.NumberFormat
以美国格式返回区域格式(例如,在单元格中输入1/2/3会给出 m / d / yyyy )
.NumberFormatLocal
以本地格式返回区域格式(例如,在欧洲语言环境 d / m / yy )
答案 1 :(得分:1)
这是我posted on my blog的内容。它在一个方向上使用循环,但应该比循环尝试快很多。它经常使用Selecting
一个新单元格的技巧来解释这个bug described by Charles Williams。
Sub NumberToStringWithFormat(rng As Excel.Range)
Dim Texts() As String
Dim i As Long, j As Long
'This might prevent "###" if column too narrow
rng.EntireColumn.AutoFit
'Can't use variables in Dim
ReDim Texts(1 To rng.Rows.Count, 1 To rng.Columns.Count)
For i = 1 To rng.Rows.Count
'Charles Williams' fix for slow code with Text
If i Mod 1000 = 0 Then
rng.Range("A1").Offset(i).Select
End If
For j = 1 To rng.Columns.Count
Texts(i, j) = rng.Cells(i, j).Text
Next j
Next i
'@ is the Text format
rng.NumberFormat = "@"
rng.Value2 = Texts
End Sub