将格式化为日期的范围转换为文本

时间:2013-08-10 14:46:35

标签: excel excel-vba excel-2010 vba

我有日期格式的单元格范围,格式为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值?或者我如何在我发布的简单片段中指示格式,以便我得到预期的文本?

2 个答案:

答案 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