2015-10-05 160 views
5

列C具有格式爲HH:mm:ss的時間(格式爲文本,因爲工作表將導出爲csv)。VBA:替換部分時間字符串

C1,C2,C3值時間9時15分零零秒,9點16分00秒的,九時17分00秒分別直到15點29分00秒

只需要替換最後一個「:00 「與部分 」:59「

--- --- CATCH在 塔C會有如10:00:00 11:00:00或12:00:00或

此值意味着直接用「:00」替換「:59」會損壞精確10'o時鐘,11'o時鐘等的值。

C列將被填充w ith數千個這樣的數據點。我的邏輯之下將不工作我猜:

{

Dim secrep As String 
LastRow = Cells(Rows.Count, "C").End(xlUp).Row 
Secsz = Range("C1:C" & LastRow).Select 
seczero = Right(Secsz, 2) 
secrep = Replace(Secsz, ":00", ":59") 

}

我知道上面的代碼是錯誤的,但是這就是我能想出。爲幫助完成這個邏輯

要求..

編輯: 是不是在解釋相當精細的。 即使這些充分的小時值需要內容替換,如:十點00分59秒,11時00分59秒,12時○○分59秒

回答

2

如果該值不00:00結束然後更新:59

Dim cell As Range 

For Each cell In Range("C1", Range("C1").End(xlDown)) 
    If Right$(cell.Value, 5) <> "00:00" Then 
     cell.Value = Left$(cell.Value, 6) & "59" 
    End If 
Next 

編輯,只更換最後00

Dim cell As Range 

For Each cell In Range("C1", Range("C1").End(xlDown)) 
    cell.Value = Left$(cell.Value, 6) & "59" 
Next 
+0

感謝亞歷克斯。我的錯誤我沒有詳細解釋。如果'Right $(cell.Value,5)<>「00:00」那麼'這個部分避免了像「10:00:00」,「11:00:00」等整個小時值替換「:00」到「:59」 。即使這些完整的小時值需要替換,如:10:00:59,11:00:59,12:00:59 要求您請重新看 – Vaibhav

+0

啊gotcha更新。 –

+0

感謝您的時間和精力。Alex K.編輯完成。 :) – Vaibhav

2

你在正確的軌道上。你只需要首先拆分字符串,在下半部分中替換,然後再連接。這裏,你可能會想一些錯誤處理增強通用功能:

Function ReplaceEnd(s As String, endCount As Integer, replaceWhat As String, replaceWith As String) 
    Dim baseString As String 
    Dim replaceString As String 

    baseString = Left(s, Len(s) - endCount) 
    replaceString = Right(s, endCount) 

    ReplaceEnd = baseString & Replace(replaceString, replaceWhat, replaceWith) 
End Function 

編輯:用法示例:

secrep = ReplaceEnd(Secsz, 3, ":00", ":59") 
+0

不知道我在做什麼錯,但時間列C仍然有所有:00(最後3個字符)未取代。沒有得到任何錯誤。任何線索隊友? – Vaibhav

+0

你把被替換的字符串插入單元格嗎?例如。範圍(「C1:C」和LastRow)。值=祕密 – DanL

+0

是的,DanL我做到了。沒有任何錯誤,只是時間沒有改變的文件。我現在再試一次。 – Vaibhav

0

使用分割功能,然後分析和修改。

Private Sub CommandButton1_Click() 
    Dim ws   As Excel.Worksheet 
    Dim lastRow  As Long 
    Dim szTimeParts() As String 
    Dim lRow   As Long 

    lRow = 1 
    lastRow = ws.Cells(ws.Rows.count, "C").End(xlUp).Row 

    Set ws = ActiveWorkbook.Sheets("Sheet1") 
    ws.Activate 

    'Loop through the rows 
    Do While lRow <= lastRow 

     'Make sure we have a value to read into our string 
     If ws.Range("C" & lRow).Value <> "" Then 
      szTimeParts = Split(Trim(ws.Range("C" & lRow).Value), ":") 
      If szTimeParts(1) <> "00" Then 
       ws.Range("C" & lRow).Value = szTimeParts(0) & ":" & szTimeParts(1) & ":59" 
      End If 
     End If 
     lRow = lRow + 1 
    Loop 

End Sub 
+0

感謝分享。我可能會錯過一些東西,我在另一個宏中插入了這段代碼(因爲這是數據清理過程中的一個階段),並且最終出來的csv沒有改變。不知道爲什麼。任何方式我可以更好地向你解釋?或者如果我錯誤地應用了代碼? – Vaibhav

+0

這只是對打開的工作簿進行更改。你將不得不手動保存它,或者像ActiveWorkbook.Save一樣保存在底部。 – MatthewD

+0

這是關於保存爲csv信息http://stackoverflow.com/questions/10551353/saving-excel-worksheet-to-csv-files-with-filenameworksheet-name-using-vb – MatthewD

1

您可以使用此:

Public Function AlterTime(rInputRange As Range) 

    Dim oCell As Range 

    For Each oCell In rInputRange.Cells 
     oCell = TimeSerial(Hour(oCell), Minute(oCell), 59) 
    Next oCell 

End Function 
+0

嗨Bas Verlaat,讓我試試。只是一個headup,我已經格式化列作爲文本,不希望excel干擾時間格式。當導出爲csv時,原因是excel損壞日期時間值。所以不確定你的代碼是否有幫助。讓我嘗試。 – Vaibhav

+0

嗨。你可以放一個'Text(Val,「hh:mm」)'函數,所以它會再次顯示文本。這種方法的好處是它不會出錯,因爲實際時間被重建。 –