Формулы и фон:
Если вы пытаетесь назначить свидание, взгляните на пару идей, используя формулы, которые помогут вам разобраться с использованием VBA позже. В конечном итоге вам нужно создать строку, которая может быть проанализирована как дата. В приведенном вами примере функция CDate
смогла распознать строку как дату и преобразовать ее в тип данных Date.
1) Если у вас Apr 5, 2018, 10:00 AM
в A2
, вы можете использовать простое:
=DATE(RIGHT(SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",",""),4),MONTH(1&LEFT(SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",",""),3)),TRIM(MID(SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",",""),5,2)))
Внутренняя
=SUBSTITUTE(LEFT(A2,FIND(", ",A2,FIND(", ",A2)+1)-1),",","")
получает строку перед вторым ",", затем заменяет оставшиеся "," на "", давая
Apr 5 2018
В остальной части формулы функция Date
используется для создания даты из частей даты, то есть года, месяца, дня.
Есть предположения, что Месяц всегда будет трехбуквенным сокращением. Отдельные пробелы внутри строки и никаких дополнительных пробелов с обеих сторон.
2) Без таких предположений вы можете получить что-то вроде:
=DATE(RIGHT(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),4),MONTH(1&LEFT(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),3)),MID(A4,4,FIND(CHAR(1),SUBSTITUTE(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),CHAR(32),CHAR(1),2))-FIND(CHAR(1),SUBSTITUTE(LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(A2,",",""),CHAR(32)," ")),CHAR(32),CHAR(1),3))-1),CHAR(32),CHAR(1),1))))
Вот таблица, объясняющая каждый шаг обоих:
![Formula tables](https://i.stack.imgur.com/dQKBC.png)
Формулы в изображении по номеру ссылки
1) Удалены "," и лишние пробелы
=TRIM(SUBSTITUTE(SUBSTITUTE(B2,",",""),CHAR(32)," "))
2) Получить часть даты без времени
=LEFT(TRIM(SUBSTITUTE(SUBSTITUTE(B2,",",""),CHAR(32)," ")),FIND(CHAR(1),SUBSTITUTE(B3,CHAR(32),CHAR(1),3))-1)
3) Положение первого пробела ""
=FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),1))
4) Положение второго пробела ""
=FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),2))
5) Номер месяца
=MONTH(1&LEFT(B4,3))
6) Год
=RIGHT(B4,4)
7) День
=MID(B4,4,FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),2))-FIND(CHAR(1),SUBSTITUTE(B4,CHAR(32),CHAR(1),1)))
8) Дата от даты Y, M, D
=DATE(B8,B7,B9)
9) Длинная формула, уже приведенная выше в качестве второго решения
10) Получить строку перед вторым ",", затем заменить оставшиеся "," на ""
=SUBSTITUTE(LEFT(B2,FIND(", ",B2,FIND(", ",B2)+1)-1),",","")
11) Формула приведена сверху как первое решение с большим количеством предположений
VBA:
Edit:
@ Даррен Бартруп-Кук отметил, что CDate более эффективен, чем я себе представлял, и вы можете просто сделать:
CDate(Replace(.Range("B2").Text, ",", ""))
Это сохранит элемент времени. Я рассмотрел удаление элемента времени ранее в ответе, если требуется. Или вы можете сделать
Int(CDate(Replace(.Range("B2").Text, ",", "")))
Оригинальный текст:
В vba вы можете использовать функции Instr
или Instrrev
вместо Find
, чтобы найти вхождение символа в строку. Find
используется с объектами диапазона, а не со строкой внутри при использовании VBA. Instr начинает поиск с начала строки, а InstrRev
с конца, то есть справа налево. Это означает, что порядок аргументов меняется. Более подробная информация об этом приведена в ссылках.
Простая формула в виде кода VBA с использованием функции CDate
в соответствии с ответом, на который вы ссылаетесь.
Public Sub test()
With ThisWorkbook.Worksheets("Sheet1")
Debug.Print CDate(Left$(.Range("B2").Text, InStr(InStr(.Range("B2").Text, ", ") + 1, .Range("B2").Text, ", ") - 1))
End With
End Sub
Выше вы можете использовать в цикле по диапазону, в который вы хотите конвертировать значения.
Что-то вроде:
.Range("B2") = CDate(Left$(.Range("B2").Text, InStr(InStr(.Range("B2").Text, ", ") + 1, .Range("B2").Text, ", ") - 1))
Или,
Вы можете преобразовать это в пользовательскую функцию и вызвать ее из рабочего листа:
Public Function GetDate(ByVal rng As Range)
GetDate = CDate(Left$(rng.Text, InStr(InStr(rng.Text, ", ") + 1, rng.Text, ", ") - 1))
End Function
Вызов UDF в листе
![UDF](https://i.stack.imgur.com/6O9yO.png)
Обратите внимание, что вы либо форматируете ячейки как формат даты, чтобы получить правильное форматирование, либо меняете функцию на:
GetDate = Format$(CDate(Left$(rng.Text, InStr(InStr(rng.Text, ", ") + 1, rng.Text, ", ") - 1)), "dd/mm/yyyy")
Ссылки:
- Instrrev
- Instr
- Range.Find
- Запасной
- Char
- Пользовательские функции UDF
- CDate