Преобразуване на диапазон, форматиран като дата, в текст

Имам диапазон от клетки във формат за дата, форматиран като 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 стойност? Или как мога да инструктирам формат в прост фрагмент, който публикувах, така че да получа очаквания текст като резултат?


person theta    schedule 10.08.2013    source източник


Отговори (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)

person lori_m    schedule 10.08.2013
comment
Не виждам метод Application.Text наличен в моя Excel 2010 - person theta; 10.08.2013
comment
Вярно, но трябва да видите Application.WorksheetFunction.Text. Разликата е, че Application.Text връща вариант, така че позволява масиви и грешки в изходите. Това важи и за всички други методи за функция на работен лист. - person lori_m; 10.08.2013

Ето нещо, което публикувах в моя блог. Той използва цикъл в една посока, но трябва да бъде много по-бърз от вашите опити за цикъл. Той използва трик за Selecting нова клетка от време на време, за да отчете това бъг, описан от Чарлз Уилямс.

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
person Doug Glancy    schedule 10.08.2013