将范围格式化为date文本

我有date格式的单元格范围,格式为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值? 或者我怎么能指示格式在简单的片段我发布,以便我得到预期的文字作为结果?

在你的代码中,而不是aDate=rSel.Value ,试试这个:

 aDate = Application.Text(rSel.Value2,rSel.NumberFormatLocal) 

注意

以下范围属性与此示例相关:

.Value以VBAdate格式返回一个variables(数字/date/string/布尔/错误)。

.Value2返回一个variables(数字/string/布尔/错误)与date转换为序列号。

.Text返回一个包含格式化值的string,这仅适用于单个单元格。

.NumberFormat以美国格式返回区域格式(例如在单元格中input1/2/3给出m / d / yyyy

.NumberFormatLocal返回本地格式的区域格式(例如,在欧洲语言区域d / m / yy

这是我发布在我的博客上的东西。 它在一个方向上使用一个循环,但应该比循环尝试快得多。 它使用一个经常Selecting一个新单元的技巧来解决Charles Williams描述的这个bug 。

 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