【问题标题】:VBA: Replace Part of Time StringVBA:替换部分时间字符串
【发布时间】:2016-01-02 03:43:40
【问题描述】:

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

C1、C2、C3 值分别为时间 09:15:00、09:16:00、09:17:00 到 15:29:00

只需要用“:59”替换最后的“:00”部分

---捕捉--- 在 C 列中将有诸如 10:00:00 或 11:00:00 或 12:00:00 之类的值

这意味着直接将“:00”替换为“:59”会破坏精确的 10'o clock 、11'o clock 等的值。

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

【问题讨论】:

    标签: vba time replace


    【解决方案1】:

    如果值不以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
    

    编辑,仅替换 last 00:

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

    【讨论】:

    • 谢谢亚历克斯。我的错误我解释得不是很详细。如果Right$(cell.Value, 5) &lt;&gt; "00:00" Then 这部分避免将完整小时值(例如 10:00:00、11:00:00 等)替换为“:00”到“:59”。即使这些完整小时值也需要替换,例如:10:00 :59, 11:00:59, 12:00:59 请您重看
    • 感谢 Alex K 的时间和努力。这个编辑过的完美。 :)
    【解决方案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 个字符)未替换。也没有收到任何错误。有什么线索吗?
    • 您是否将替换的字符串插入到单元格中?例如。 Range("C1:C" & LastRow).Value = secrep
    • 是的,DanL 我做到了。没有任何错误,只是时间没有改变的文件。我现在会再试一次。
    • 我在模块 2 中插入了函数,并将其按正确顺序放置在我现有的宏 Dim secrep As String lastRow = Cells(Rows.Count, "C").End(xlUp).Row secrep = ReplaceEnd(Range("C1:C" &amp; lastRow).Select, 3, ":00", ":59") 但它没有对 C 列进行任何更改!
    【解决方案3】:

    你可以用这个:

    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 干扰时间格式的提示。原因是 excel 在导出为 csv 时会破坏日期时间值。所以不确定你的代码是否有帮助。让我试试。
    • 嗨。你可以放一个Text(Val,"hh:mm") 函数,让它再次变成文本。这种方法的好处是不会出错,因为实际时间是重建的。
    【解决方案4】:

    使用拆分功能,然后分析修改。

    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 没有任何变化。不知道为什么。有什么办法可以更好地向你解释吗?或者如果我错误地应用了代码?
    • 这只是对打开的工作簿进行更改。您将不得不手动保存它或将其保存在底部的 ActiveWorkbook.Save 中。
    • 这里是保存为 csv stackoverflow.com/questions/10551353/…的信息
    • 谢谢马修,事情是我的工作表对数据进行操作,然后将其保存为 CSV。在那个 CSV 文件中,我找不到更改。
    • 感谢您抽出时间和精力提供帮助。我现在要再试一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2012-07-17
    • 2012-01-22
    • 2013-06-19
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多