конвертировать ммм дд, гггг, ч: мм я в Excel VBA - PullRequest
0 голосов
/ 04 мая 2018

Приложение экспортирует с текстовым полем, которое объединяет дату и время в формате, показанном ниже. Этот формат немного отличается (запятая после года для начинающих), чем ответ «конвертировать МММ ДД, ГГГГ ЧЧ: ММ: СС в Excel», на который был получен ответ в Stackflow 02.06.2014. Я попытался запустить код VBA, который дал ответ, но получаю ошибку времени выполнения 13 и несоответствие типов. Я не знаю достаточно о VBA, чтобы знать, какие изменения я должен внести в код VBA. Любая помощь будет принята с благодарностью.

Apr 5, 2018, 10:00 AM
Apr 15, 2018, 2:00 PM 
Apr 30, 2018, 7:00 PM

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы не указываете, во что хотите конвертировать.

Однако для извлечения стандартного значения Excel DATE или TIME из вашей строки просто замените вторую запятую пробелом и примените к результату функцию TIMEVALUE или DATEVALUE.

Если вы хотите создать комбинированную отметку даты / времени, примените функцию VALUE или двойное унарное число к замещаемой строке:

ДАТА / ВРЕМЯ

=VALUE(SUBSTITUTE(A1,","," ",2))  or
=--(SUBSTITUTE(A1,","," ",2)) 

Result -->   43195.41667 which can be formatted however you want

ТОЛЬКО ДАТА

 =DATEVALUE(SUBSTITUTE(A1,","," ",2))

ТОЛЬКО ВРЕМЯ

=TIMEVALUE(SUBSTITUTE(A1,","," ",2))
0 голосов
/ 04 мая 2018

Формулы и фон:

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

Формулы в изображении по номеру ссылки

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

Обратите внимание, что вы либо форматируете ячейки как формат даты, чтобы получить правильное форматирование, либо меняете функцию на:

GetDate = Format$(CDate(Left$(rng.Text, InStr(InStr(rng.Text, ", ") + 1, rng.Text, ", ") - 1)), "dd/mm/yyyy")

Ссылки:

  1. Instrrev
  2. Instr
  3. Range.Find
  4. Запасной
  5. Char
  6. Пользовательские функции UDF
  7. CDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...