Страницы: 1
RSS
Извлечь две даты, записанные через тире
 
Здравствуйте, уважаемые экселеведы!
В таблице имеется столбец, заполнявшийся вручную (результат - текстовый формат ячеек), с двумя датами, разделенными тире. Сейчас мне нужно эти даты разделить. То есть это задача-максимум. Задача-минимум - вынести из ячейки конечную дату. К сожалению, не понимаю даже, с какого края подступиться: пробовал и формулы - безуспешно ввиду отсутствия унификации и моей малой склонности к длинноформулонаписанию, и макросы - тут вообще, то разделителем в дате становился слэш вместо точки, то месяц и день меняются местами… Очень надеюсь, что, как обычно, я перемудриваю, и есть простой (можно и элегантный) способ решить проблему если не для всего столбца, то хотя бы для большинства ячеек. Заранее спасибо.
 
=--ЛЕВБ(D2;5)
=--ПОДСТАВИТЬ(ПСТР(D2;9;6);"?";".")
 
Цитата
vikttur написал:
=--ЛЕВБ(D2;5)
Результат: 44099
 
Почитайте о  формате ячейки Дата
 
И вариант макросом, не претендующий на звание
Цитата
zav написал:
простой (можно и элегантный) способ

Код
Sub SplitDate()
    Dim r As Range
    Set r = Range("D2:D9")
    Dim a As Variant
    a = r
    
    
    Dim d As Variant
    ReDim d(1 To UBound(a, 1), 1 To 2)
    
    Dim b As Variant
    Dim y As Long
    Dim i As Long
    Dim s As String
    Dim c As String
    Dim d1 As String
    Dim d2 As String
    Dim ye As String
    For y = 1 To UBound(a, 1)
        a(y, 1) = Replace(a(y, 1), " ", "")
        a(y, 1) = Replace(a(y, 1), "?", ".")
        
        s = ""
        For i = 1 To Len(a(y, 1))
            c = Mid(a(y, 1), i, 1)
            If c Like "#" Or c = "." Or c = "-" Then
                s = s & c
            End If
        Next
        a(y, 1) = s
                
        b = Split(a(y, 1), "-")
        d1 = ""
        d2 = ""
        If UBound(b) >= 0 Then
            d1 = b(0)
            If UBound(b) > 0 Then d2 = b(1)
        End If
        
        Select Case r.Cells(y, 1).Interior.Color
        Case 65535: ye = ".2019"
        Case 49407: ye = ".2020"
        Case Else: ye = ""
        End Select
        
        d1 = d1 & ye
        d2 = d2 & ye
        
        d(y, 1) = CDate(d1)
        d(y, 2) = CDate(d2)
        
    Next
    
    With r.Columns(1).Offset(0, 4).Resize(, 2)
        .NumberFormat = "dd.mm.yyyy"
        .Cells = d
    End With
End Sub
 
vikttur, читал.  :)  Прошу уточнить, лучше сначала поменять формат, а затем уже протягивать формулу, или наоборот?
После изменения формата в ячейке появилось 25.09.2020, вторым шагом я смогу заменить 2020 на 2019, ура!
 
Цитата
zav написал: вторым шагом я смогу заменить 2020 на 2019,
и Как вы собираетесь это сделать? :)
 
Заменю формулы на значения, потом Ctrl+H, как обычно.
 
Вить, +365  :)
 
Для ячеек типа 25.09 - 04.10 год вставляете в функцию, n=0 для первой даты, n=1 для второй даты
UDF
Код
Function GetDate(cell As Range, iYear As Integer, n As Integer) As Date
Dim arr
  arr = Split(cell, "-")
  GetDate = CDate(Application.Trim(arr(n)) & "." & iYear)
End Function

Вызов =GetDate(D2;2019;0) и =GetDate(D2;2019;1)
Изменено: Kuzmich - 08.04.2020 11:55:24
 
Цитата
RAN написал:
+365
Минус. Там должен был быть минус.  :)
Kuzmich, МатросНаЗебре, столько всего, и всё кажется таким вкусным.  :D

Спасибо всем огромное! Пошел пробовать.
 
RAN, мне было интересно. как автор собирается это сделать.  :)
 
Цитата
zav написал:
Пошел пробовать.

Сначала читаем это.
Изменено: sokol92 - 08.04.2020 12:19:35
Владимир
 
если автор темы опишет свою задачу, то отвечающие будут решать его задачу, а не каждый свою
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Текст по столбцам, в качестве разделителя "-". Ну а год только автору известно где какой.
 
Цитата
Андрей_26 написал:
Ну а год только автору известно где какой.
Это не так, и в табличке написано , какой цвет - какой год. Но и логика есть. Если месяц меньше последующего, то  год -1
но могут быть сюрпризы конечно.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх