Доброго времени суток! Помогите кто знает как из даты числового формата превратить дату число-буквенный формат. (есть 01.01.2017 г. нужно 1 января 2017 года). На одном листе много дат. Возможно-ли через макрос произвести замену формата дат на всем листе?
Доброго времени суток! Помогите кто знает как из даты числового формата превратить дату число-буквенный формат. (есть 01.01.2017 г. нужно 1 января 2017 года). На одном листе много дат. Возможно-ли через макрос произвести замену формата дат на всем листе?doberman
Макрос обрабатывает выделенный диапазон. Рассчитан на выделение 1 области и не более одного столбца. Резулььтат помещает в соседний справа столбец. [vba]
Код
Sub perebr() Dim arrD As Variant, arrT As Variant Dim I As Long, J As Long, R As Long Dim D As Integer, M As Integer, Y As Integer
If Selection.Areas.Count > 1 Then Exit Sub If Selection.Columns.Count > 1 Then Exit Sub
arrD = Selection.Value
If IsArray(arrD) Then For J = LBound(arrD) To UBound(arrD) arrT = Split(arrD(J, 1)) If IsArray(arrT) Then For I = LBound(arrT) To UBound(arrT) If arrT(I) Like "##.##.####" Then D = Val(Left(arrT(I), 2)) M = Val(Mid(arrT(I), 4, 2)) Y = Val(Right(arrT(I), 4)) If IsDate(arrT(I)) Then arrT(I) = Format(D, "0") & " " & _ Application.Index(Array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", _ "сентября", "октября", "ноября", "декабря"), M) & " " & Format(Y, "0000") If I = UBound(arrT) Then arrT(I) = arrT(I) & " г." ElseIf Left(arrT(I + 1), 2) = "г." Then ElseIf Left(arrT(I + 1), 4) = "года" Then arrT(I + 1) = Replace(arrT(I + 1), "года", "г.", 1, 1) Else arrT(I) = arrT(I) & " г." End If End If End If Next I End If arrD(J, 1) = Join(arrT) Next J R = UBound(arrD) - LBound(arrD) + 1 Else arrT = Split(arrD) If IsArray(arrT) Then For I = LBound(arrT) To UBound(arrT) If arrT(I) Like "##.##.####" Then D = Val(Left(arrT(I), 2)) M = Val(Mid(arrT(I), 4, 2)) Y = Val(Right(arrT(I), 4)) If IsDate(arrT(I)) Then arrT(I) = Format(D, "0") & " " & _ Application.Index(Array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", _ "сентября", "октября", "ноября", "декабря"), M) & " " & Format(Y, "0000") End If End If Next I End If arrD = Join(arrT) R = 1 End If Selection.Cells(1, 1).Offset(0, 1).Resize(R, 1).Value = arrD End Sub
[/vba] Работать должен шустро даже на больший объемах данных. Если будет тормозить, оптимизировать вряд ли получится, если только добавить отслеживание строки состояния: сколько обработано, сколько осталось.
Чуть исправил. Файл перезалил.
Макрос обрабатывает выделенный диапазон. Рассчитан на выделение 1 области и не более одного столбца. Резулььтат помещает в соседний справа столбец. [vba]
Код
Sub perebr() Dim arrD As Variant, arrT As Variant Dim I As Long, J As Long, R As Long Dim D As Integer, M As Integer, Y As Integer
If Selection.Areas.Count > 1 Then Exit Sub If Selection.Columns.Count > 1 Then Exit Sub
arrD = Selection.Value
If IsArray(arrD) Then For J = LBound(arrD) To UBound(arrD) arrT = Split(arrD(J, 1)) If IsArray(arrT) Then For I = LBound(arrT) To UBound(arrT) If arrT(I) Like "##.##.####" Then D = Val(Left(arrT(I), 2)) M = Val(Mid(arrT(I), 4, 2)) Y = Val(Right(arrT(I), 4)) If IsDate(arrT(I)) Then arrT(I) = Format(D, "0") & " " & _ Application.Index(Array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", _ "сентября", "октября", "ноября", "декабря"), M) & " " & Format(Y, "0000") If I = UBound(arrT) Then arrT(I) = arrT(I) & " г." ElseIf Left(arrT(I + 1), 2) = "г." Then ElseIf Left(arrT(I + 1), 4) = "года" Then arrT(I + 1) = Replace(arrT(I + 1), "года", "г.", 1, 1) Else arrT(I) = arrT(I) & " г." End If End If End If Next I End If arrD(J, 1) = Join(arrT) Next J R = UBound(arrD) - LBound(arrD) + 1 Else arrT = Split(arrD) If IsArray(arrT) Then For I = LBound(arrT) To UBound(arrT) If arrT(I) Like "##.##.####" Then D = Val(Left(arrT(I), 2)) M = Val(Mid(arrT(I), 4, 2)) Y = Val(Right(arrT(I), 4)) If IsDate(arrT(I)) Then arrT(I) = Format(D, "0") & " " & _ Application.Index(Array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", _ "сентября", "октября", "ноября", "декабря"), M) & " " & Format(Y, "0000") End If End If Next I End If arrD = Join(arrT) R = 1 End If Selection.Cells(1, 1).Offset(0, 1).Resize(R, 1).Value = arrD End Sub
[/vba] Работать должен шустро даже на больший объемах данных. Если будет тормозить, оптимизировать вряд ли получится, если только добавить отслеживание строки состояния: сколько обработано, сколько осталось.
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;".01.";" января ");".02.";" февраля ");".03.";" марта ");".04.";" апреля ");".05.";" мая ");".06.";" июня ");".07.";" июля ");".08.";" августа ");".09.";" сентября ");".10.";" октября ");".11.";" ноября ");".12.";" декабря ")
Такое решение "в лоб" не подойдёт?
Код
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A2;".01.";" января ");".02.";" февраля ");".03.";" марта ");".04.";" апреля ");".05.";" мая ");".06.";" июня ");".07.";" июля ");".08.";" августа ");".09.";" сентября ");".10.";" октября ");".11.";" ноября ");".12.";" декабря ")