1

我有一系列日期格式的单元格,格式为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

4

2 回答 2

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中)

于 2013-08-10T16:24:29.230 回答
1

这是我在博客上发布的内容。它在一个方向上使用循环,但应该比您的循环尝试快得多。Selecting它经常使用新单元格的技巧来解决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
于 2013-08-10T16:23:11.080 回答