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

У меня есть диапазон ячеек в формате даты, отформатированный как 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 в ячейке дает м / д / гггг)

.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