VBA:替换时间字符串的一部分

5

第C列有时间(格式为文本,因为该工作表将被导出为csv),格式为HH:mm:ss。

C1、C2和C3的值分别为09:15:00、09:16:00和09:17:00,一直到15:29:00。

需要仅替换最后的“:00”部分为“:59”。

---注意--- 在C列中将会有10:00:00或11:00:00或12:00:00等值。

这意味着直接用“:00”替换为“:59”将损坏确切的10点钟、11点钟等值的价值。

C列将填充成数千个此类数据点。我下面的逻辑可能不行:

{

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")

我知道上面的代码是错误的,但那是我能想到的全部。

请求帮助完成这个逻辑...

编辑: 解释不够详细。 甚至这些整点值也需要被替换,例如:10:00:59、11:00:59、12:00:59

4个回答

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

谢谢Alex,我的错误是在解释方面不够详细。如果 Right$(cell.Value, 5) <> "00:00" Then,这一部分避免了将完整的小时值(例如10:00:00,11:00:00等)替换为“:59”。即使是这些完整的小时值也需要被替换,例如:10:00:59,11:00:59,12:00:59请再次查看。 - Vaibhav
感谢您的时间和努力,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")

不确定我做错了什么,但时间列C仍然有所有的:00(最后3个字符)未替换。也没有收到任何错误信息。有什么线索吗? - Vaibhav
你是否将替换后的字符串插入到单元格中了?例如:Range("C1:C" & LastRow).Value = secrep - DanL
是的,DanL我已经做了。没有任何错误,只是文件的时间没有改变。我现在会再试一次。 - Vaibhav
我将函数插入到模块2中,并在现有的宏中正确排序。Dim secrep As StringlastRow = Cells(Rows.Count, "C").End(xlUp).Rowsecrep = ReplaceEnd(Range("C1:C" & lastRow).Select, 3, ":00", ":59")但是它没有对C列进行任何更改! - Vaibhav

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

嗨,Bas Verlaat,让我试试。提醒一下,我已将该列格式化为文本,并且不希望Excel干扰时间格式。原因是当导出为CSV时,Excel会破坏日期时间值。所以不确定你的代码是否有用。让我试试。 - Vaibhav
你好。你可以在周围放置一个 Text(Val,"hh:mm") 函数,这样它就会变成文本格式。这种方法的好处是它不会出错,因为实际时间被重建了。 - Bas Verlaat

0
使用split函数,然后进行分析和修改。
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

谢谢分享。我可能漏掉了什么,我将这段代码插入到另一个宏中(因为这是数据清理过程中的一个阶段),最终生成的CSV文件没有任何变化。不确定原因。有什么更好的解释方式吗?或者我是否错误地应用了代码? - Vaibhav
这只是对当前打开的工作簿进行更改。您需要手动保存或在底部添加ActiveWorkbook.Save之类的保存操作。 - MatthewD
这里有关于如何保存为csv文件的信息:https://dev59.com/BWkv5IYBdhLWcg3wgRCc - MatthewD
谢谢Matthew,问题是我的表格操作数据,然后将其保存为CSV格式。在那个CSV文件中,我找不到更改。 - Vaibhav
感谢您抽出时间和精力帮助。我现在要再试一次。 - Vaibhav
让我们在聊天中继续这个讨论 - Vaibhav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接