2015-10-05 116 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”)'函数,所以它会再次显示文本。这种方法的好处是它不会出错,因为实际时间被重建。 –