2015-10-05 18 views
5

Cột C có thời gian (được định dạng dưới dạng văn bản dưới dạng trang tính sẽ được xuất dưới dạng csv) theo định dạng HH: mm: ss.VBA: Thay thế một phần của chuỗi thời gian

C1, C2, C3 giá trị là of Time 09:15:00, 09:16:00, 09:17:00 tương ứng đến 15:29:00

Cần chỉ thay thế cuối cùng ": 00 "phần với ": 59"

--- cATCH --- Trong cột C sẽ có giá trị như 10:00:00 hay 11:00:00 hay 12:00:00

này có nghĩa là thay thế trực tiếp ": 00" bằng ": 59" sẽ làm hỏng giá trị của đồng hồ chính xác 10'o, đồng hồ 11'o, v.v.

Cột C sẽ được lấp đầy ith hàng ngàn điểm dữ liệu như vậy. Logic của tôi dưới đây sẽ không làm việc tôi đoán:

{

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

}

tôi biết mã trên là sai, nhưng đó là tất cả tôi có thể đưa ra.

yêu cầu để được giúp đỡ hoàn toàn logic này ..

EDIT: Chẳng phải khá công phu trong việc giải thích. Ngay cả những giá trị đầy đủ giờ cần phải Thay thế như: 10:00:59, 11:00:59, 12:00:59

Trả lời

2

Nếu giá trị không kết thúc với 00:00 sau đó cập nhật nó để :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 

chỉnh sửa, thay thế chỉ là cuối cùng00:

Dim cell As Range 

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

Cảm ơn Alex. Sai lầm của tôi không hoàn toàn phức tạp trong việc giải thích. Nếu 'Right $ (cell.Value, 5) <>" 00:00 "Sau đó, phần này tránh thay thế": 00 "thành": 59 "cho giá trị giờ đầy đủ như 10:00:00, 11:00:00 v.v. Ngay cả những giá trị giờ đầy đủ này cũng cần phải được thay thế như: 10:00:59, 11:00:59, 12:00:59 Yêu cầu bạn phải bắt đầu lại – Vaibhav

+0

Đã nhận được cập nhật. –

+0

Cảm ơn bạn đã dành thời gian và nỗ lực Alex K. Người chỉnh sửa này đã hoạt động hoàn hảo. :) – Vaibhav

2

Bạn đang đi đúng hướng. Bạn chỉ cần tách chuỗi đầu tiên, thay thế trong nửa thứ hai và sau đó nối lại sau đó. Dưới đây là một chức năng có mục đích chung mà bạn có thể muốn tăng cường với một số lỗi xử lý:

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 

Chỉnh sửa: Ví dụ sử dụng:

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

không chắc chắn những gì tôi đang làm sai, nhưng cột thời gian C vẫn có tất cả: 00 (3 ký tự cuối cùng) bỏ thay thế. Không nhận được bất kỳ lỗi nào. Bất kỳ manh mối giao phối? – Vaibhav

+0

Bạn đã chèn chuỗi được thay thế vào ô? Ví dụ.Phạm vi ("C1: C" & LastRow) .Value = secrep – DanL

+0

Có, DanL tôi đã làm điều đó. Không có bất kỳ lỗi nào chỉ là tệp với thời gian không thay đổi. Tôi sẽ thử lại một lần nữa. – Vaibhav

0

Sử dụng chức năng phân chia và sau đó phân tích và sửa đổi.

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

cảm ơn bạn đã chia sẻ. Tôi có thể thiếu một cái gì đó, tôi chèn mã này trong một vĩ mô khác (vì đây là một giai đoạn trong quá trình làm sạch dữ liệu) và csv cuối cùng mà ra không có thay đổi trong nó. Không chắc chắn lý do tại sao. Bất kỳ cách nào tôi có thể giải thích cho bạn tốt hơn? hoặc nếu tôi áp dụng mã không chính xác? – Vaibhav

+0

Điều này chỉ thực hiện các thay đổi đối với sổ làm việc mở. Bạn sẽ phải lưu nó bằng tay hoặc đặt trong một lưu như ActiveWorkbook.Save ở phía dưới. – MatthewD

+0

Dưới đây là thông tin về cách lưu dưới dạng csv http://stackoverflow.com/questions/10551353/saving-excel-worksheet-to-csv-files-with-filen weapsheet-name-using-vb – MatthewD

1

bạn có thể sử dụng này:

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

Hi Bas Verlaat, hãy để tôi thử. Chỉ cần một headup rằng tôi đã định dạng cột dưới dạng văn bản và không muốn excel can thiệp vào Định dạng thời gian. Lý do là excel phá hỏng các giá trị ngày giờ khi được xuất dưới dạng csv. Vì vậy, không chắc chắn nếu mã của bạn sẽ giúp đỡ. Để tôi thử. – Vaibhav

+0

Xin chào. Bạn có thể đặt một hàm 'Văn bản (Val, 'hh: mm')' vào để nó trở lại văn bản. Lợi ích của phương pháp này là nó không thể đi sai, bởi vì thời gian thực tế được xây dựng lại. –

Các vấn đề liên quan