2015-07-01 2 views
2

Доброе утро всем,VBA TimeValue() и электронная таблица Формула TimeValue()

У меня есть более 20000 входов времени в колонке, такие как 6/23/2015 1:05:37.7 PM и нужно передать его в значение времени Excel может управлять.

мне удалось найти обходной путь:

Set wrTB = Worksheets("TEST BENCH Data") 
wrTB.UsedRange 
lastRowTB = wrTB.UsedRange.Rows.Count 
lastColumnTB = wrTB.UsedRange.Columns.Count 

If lastRowTB > 1 Then 'makes sure there is data on the worksheet 
    If wrTB.Cells(7, lastColumnTB) <> "" Then 'makes sure time has not already been formated 
     Dim aTempsTB As Variant, TempsTB() As String 
     ReDim TempsTB(lastRowTB - 7, 1) 
     aTempsTB = wrTB.Range(wrTB.Cells(8, 2), wrTB.Cells(lastRowTB, 2)) 
     For i = 1 To lastRowTB - 7 
      TempsTB(i - 1, 0) = Right(aTempsTB(i, 1), 13) 
     Next i 
     wrTB.Range(wrTB.Cells(8, lastColumnTB + 2), wrTB.Cells(lastRowTB, lastColumnTB + 2)).NumberFormat = "[h]:mm:ss.000" 
     wrTB.Cells(8, lastColumnTB + 2).FormulaR1C1 = "=TIMEVALUE(RC[-1])" 
     wrTB.Cells(8, lastColumnTB + 2).AutoFill Destination:=wrTB.Range(wrTB.Cells(8, lastColumnTB + 2), Cells(lastRowTB, lastColumnTB + 2)), Type:=xlFillDefault 
     wrTB.Range(wrTB.Cells(8, lastColumnTB + 1), wrTB.Cells(lastRowTB, lastColumnTB + 1)) = TempsTB 
     Columns(lastColumnTB + 2).Copy 
     Columns(lastColumnTB + 2).PasteSpecial Paste:=xlPasteValues 
     Columns(lastColumnTB + 1).Delete 
     wrTB.UsedRange 
     lastColumnTB = wrTB.UsedRange.Columns.Count 
    End If 
End If 

В основном, это работает, но это какой-то некрасиво обходной путь я хотел бы изменить что-то более «профессиональной»

Если изменить код чтобы:

For i = 1 To lastRowTB - 7 
    TempsTB(i - 1, 0) = TimeValue(Right(aTempsTB(i, 1), 13)) 
Next i 

я получаю ошибку типа несовпадение, я также попытался установить временные переменные, чтобы убедиться, что массивы не вызывает проблем, но он по-прежнему не работает ...

Что мне не хватает?

ответ

2

с данными в B1, это будет преобразовать его в работоспособное время

Sub OutOfTime() 
    Dim s As String 
    s = Range("B1").Text 
    ary = Split(s, " ") 
    Range("B1").Formula = "=timevalue(""" & ary(1) & " " & ary(2) & """)" 
End Sub 

enter image description here

+1

Похоже, у меня нет достаточной репутации upvote Вашего комментария, но спасибо, что работает отлично, мне нужно только, чтобы соответствовать это в массиве, и это будет сделано! – HotFuzz

+0

@HotFuzz Спасибо за отзыв! –

0

Вы можете использовать формулу:

=TIMEVALUE(TEXT(A1,"hh:mm:ss")) 

и сохранить текст у вас есть там.

0

Проблема в том, что ваше время слишком специфичны для Excel. Excel распознает только время до второго. Но у вас есть миллисекунды. Вот что вызывает проблему и почему Excel ее не распознает. Вам нужно избавиться от миллисекунд в источнике (точка после секунд и то, что следует перед PM).

Не работает:

Debug.Pring IsDate("6/23/2015 1:05:37.7 PM") 

Работы:

Debug.Pring IsDate("6/23/2015 1:05:37 PM") 
Смежные вопросы