Cộng thêm 1 hằng số vào 1 số chứa trong chuổi

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Xin hỏi các bạn 1 vấn đề:
- Giả sử tôi có 1 chuổi 00:06:54,633 --> 00:06:56,333
- Tôi muốn dùng cách gì đó, cộng thêm 3s vào các số ở trên, sao cho khi cộng xong, kết quả thu được = 00:06:57,633 --> 00:06:59,333
Xin nói rõ thêm 1 chút. Số là tôi có 1 file Video và 1 file phụ đề... Trong quá trình chiếu phim, tôi thấy phụ đề và hình ảnh không đồng bộ với nhau (lệch khoảng 3 giây) ---> Thế là tôi dùng Notepad để mở file phụ đề, nó có dạng như sau:
Mã:
1 
00:06:54,633 --> 00:06:56,333 
Đây là chuyện tồi tệ nhất 
tôi từng thấy. 

2 
00:06:58,000 --> 00:06:59,767 
Có bánh bích qui ở đó không? 
............
............
Tôi dự định copy dử liệu này vào Excel, dùng cách gì đó để cộng thêm 3s vào mỗi mốc thời gian ---> Các bạn down file đính kèm và xem thử có cách gì nhanh gọn giải quyết vấn đề này không nha
 

File đính kèm

  • Phude_01.xls
    23.5 KB · Đọc: 20
Lần chỉnh sửa cuối:
Anh thử công thức củ chuối này xem sao:
Ô B1 gõ công thức:
=IF(A1="","",IF(ISERROR(SEARCH("-->",A1,1)),A1,CONCATENATE(TEXT(LEFT(A1,8)+TIME(0,0,3),"hh:mm:ss"),MID(A1,9,9),TEXT(MID(A1,18,8)+TIME(0,0,3),"hh:mm:ss"),RIGHT(TRIM(A1),4))))

Rồi kéo cái rẹt xuống dưới.
 

File đính kèm

  • Phude_01.rar
    9.3 KB · Đọc: 15
Lần chỉnh sửa cuối:
Anh thử công thức củ chuối này xem sao:
Ô B1 gõ công thức:


Rồi kéo cái rẹt xuống dưới.
Hình như phải sửa A2 thành TRIM(A2) thì mới đạt
Tôi sửa lại 1 tí:
PHP:
=IF(A2="","",IF(ISERROR(FIND("-->",$A2,1)),$A2,CONCATENATE(TEXT(LEFT(TRIM(A2),8)+TIME(0,0,3),"hh:mm:ss"),MID(TRIM(A2),9,9),TEXT(MID(TRIM(A2),18,8)+TIME(0,0,3),"hh:mm:ss"),RIGHT(TRIM(A2),4))))
Cảm ơn ca_dafi
Còn giải pháp VBA thì sao nhỉ?
------------------------
Ái chà... vừa sửa xong thì trên kia cũng sửa luôn... Ẹc... Ẹc...
 
Lúc đầu em không để ý, chuỗi chứa thời gian có một khoản trắng cuối cùng, nên phải dùng Right(TRIM(A2),4) mới đúng như anh ndu đã nói.

@Ndu: yêu cầu này nếu dùng VBA em nghĩ sẽ không tránh khỏi For..next. Vậy thì dùng công thức trên được không anh. Nó cũng kéo cái rẹt mà. Chậm hơn chút xíu chắc hổng sao!
-------------------------------------------------------------
Ái chà... vừa sửa xong thì trên kia cũng sửa luôn... Ẹc... Ẹc...
Cái này người ta gọi là " thần giao cách cảm" phải không anh!
 
Lần chỉnh sửa cuối:
Lúc đầu em không để ý, chuỗi chứa thời gian có một khoản trắng cuối cùng, nên phải dùng Right(TRIM(A2),4) mới đúng như anh ndu đã nói.

@Ndu: yêu cầu này nếu dùng VBA em nghĩ sẽ không tránh khỏi For..next. Vậy thì dùng công thức trên được không anh. Nó cũng kéo cái rẹt mà. Chậm hơn chút xíu chắc hổng sao!
Vâng! Làm như vậy là thành công lắm rồi ---> Từ đây nếu phụ đề nó bị "lệch" thì tôi sẽ copy nó cho vào Excel của Kiệt và sửa ---> giảm được 99% công sức
Ở đây đang muốn "ngâm cứu" thêm về VBA ấy mà (xem có chiêu gì mới không thôi)
 
IncTime

Vâng! Làm như vậy là thành công lắm rồi ---> Từ đây nếu phụ đề nó bị "lệch" thì tôi sẽ copy nó cho vào Excel của Kiệt và sửa ---> giảm được 99% công sức
Ở đây đang muốn "ngâm cứu" thêm về VBA ấy mà (xem có chiêu gì mới không thôi)

Dùng thử cái macro này xem sao, code chưa được gọn lắm:
Mã:
Sub IncTime()
Dim Rng As Range, sRo As Range, i As Long
Dim Arr(), sP, t1 As Date, t2 As Date
Const spStr = " --> ", iTi = "00:00:03"
    Application.ScreenUpdating = False
    Set sRo = [A65000].End(xlUp)
    Set Rng = Range([A1], sRo)
    ReDim Arr(sRo.Row)
    Arr = Rng
    'On Error Resume Next
    For i = 1 To sRo.Row
        If InStr(Arr(i, 1), spStr) > 0 Then
            sP = Split(Arr(i, 1), spStr)
            t1 = CDate(Left(sP(0), 8)) + CDate(iTi)
            t2 = CDate(Left(sP(1), 8)) + CDate(iTi)
            Arr(i, 1) = Format(t1, "hh:mm:ss") & Mid(sP(0), 9, 4) & spStr & _
                        Format(t2, "hh:mm:ss") & Mid(sP(1), 9, 4)
        End If
    Next
    
    Set Rng = Rng.Offset(, 1)
    Rng = Arr
    Set Rng = Nothing
    
    Application.ScreenUpdating = True
End Sub
 
Cũng có một cách khác, là nếu như con số thời gian của anh định dạng theo kiểu hh:mm:ss.000, thì có thể cộng trực tiếp luôn.
Em đã thử làm như sau (dữ liệu của File gốc, em dời xuống hàng 4):
  1. Dành 1 ô chứa số giây muốn cộng thêm, ví dụ như ô B1, rồi đặt một Name là Giay, là số giây muốn cộng thêm: =B1/86400

  2. Thay thế hết dấu phẩy (,) ở cột A thành dấu chấm (.)

  3. Tách phần thời gian trước: =LEFT(A4, SEARCH(" --> ", A4))

  4. Tách phần thời gian sau: =RIGHT(A4, SEARCH(" --> ", A4))

  5. Dùng TIMEVALUE để dịch thời gian trước và thời gian sau thành thời gian thực, với định dạng hh:mm:ss.000

    • Thời gian trước: =TIMEVALUE(LEFT(A4, SEARCH(" --> ", A4))) + Giay

    • Thời gian sau: =TIMEVALUE(RIGHT(A4, SEARCH(" --> ", A4))) + Giay


  6. Dùng TEXT với định dạng "hh:mm:ss.000" để chuyển giá trị thời gian thực trở lại dạng Text, đồng thời đặt luôn 2 cái Name cho công thức đỡ rối rắm:

    • Thời gian trước (Tu): =TEXT(TIMEVALUE(LEFT(A4, SEARCH(" --> ", A4))) + Giay, "hh:mm:ss.000")

    • Thời gian sau (Den): =TEXT(TIMEVALUE(RIGHT(A4, SEARCH(" --> ", A4))) + Giay, "hh:mm:ss.000")


  7. Nối hết lại với nhau (có 3 cái à, dùng dấu & cho nó ngắn), kẹp thêm điều kiện bẫy lỗi cho cột A:
    =IF(A4="", "", IF(ISERROR(SEARCH("-->", A4)), A4, Tu & " --> " & Den))

    Cũng có thể dùng hàm IFERROR (Excel 2007):
    =IF(A4="", "", IFERROR(Tu & " --> " & Den, A4))


  8. Kéo cái rẹt xuống....
 

File đính kèm

  • Phude_01.xls
    92.5 KB · Đọc: 17
Dùng thử cái macro này xem sao, code chưa được gọn lắm:
Mã:
Sub IncTime()
Dim Rng As Range, sRo As Range, i As Long
Dim Arr(), sP, t1 As Date, t2 As Date
Const spStr = " --> ", iTi = "00:00:03"
    Application.ScreenUpdating = False
    Set sRo = [A65000].End(xlUp)
    Set Rng = Range([A1], sRo)
    ReDim Arr(sRo.Row)
    Arr = Rng
    'On Error Resume Next
    For i = 1 To sRo.Row
        If InStr(Arr(i, 1), spStr) > 0 Then
            sP = Split(Arr(i, 1), spStr)
            t1 = CDate(Left(sP(0), 8)) + CDate(iTi)
            t2 = CDate(Left(sP(1), 8)) + CDate(iTi)
            Arr(i, 1) = Format(t1, "hh:mm:ss") & Mid(sP(0), 9, 4) & spStr & _
                        Format(t2, "hh:mm:ss") & Mid(sP(1), 9, 4)
        End If
    Next
    
    Set Rng = Rng.Offset(, 1)
    Rng = Arr
    Set Rng = Nothing
    
    Application.ScreenUpdating = True
End Sub
Code chạy ngon lành!
Tôi nghĩ bạn kết hợp thêm AutoFilter với điều kiện Contants = "-->" .. sau đó quét qua các cell Visible thì sẽ nhanh hơn là quét toàn bộ ... Phần còn lại ta tiếp tục AutoFilter với điều kiện Contants <> "-->" ... Copy paste sang là xong!
Bạn nghĩ sao?
 
Code chạy ngon lành!
Tôi nghĩ bạn kết hợp thêm AutoFilter với điều kiện Contants = "-->" .. sau đó quét qua các cell Visible thì sẽ nhanh hơn là quét toàn bộ ... Phần còn lại ta tiếp tục AutoFilter với điều kiện Contants <> "-->" ... Copy paste sang là xong!
Bạn nghĩ sao?

Hì, phiên bản cải tiến theo gợi ý của bạn nè:

Mã:
Sub IncTime2()
Dim Rng As Range, sRo As Range
Dim sP, t1 As Date, t2 As Date
Const spStr = " --> ", iTi = "00:00:03"
    Application.ScreenUpdating = False
    Set Rng = Range([A1], [A65000].End(xlUp))
    Rng.Copy [B1]
    Rng.AutoFilter field:=1, Criteria1:="*" & spStr & "*"
    Rows(1).EntireRow.Hidden = True
    Set Rng = Rng.SpecialCells(xlCellTypeVisible)
    For Each sRo In Rng
            sP = Split(sRo(1, 1), spStr)
            t1 = CDate(Left(sP(0), 8)) + CDate(iTi)
            t2 = CDate(Left(sP(1), 8)) + CDate(iTi)
            sRo(1, 2) = Format(t1, "hh:mm:ss") & Mid(sP(0), 9, 4) & spStr & _
                        Format(t2, "hh:mm:ss") & Mid(sP(1), 9, 4)
    Next
    Rng.Parent.AutoFilterMode = False
    Application.CutCopyMode = False
    Rows(1).EntireRow.Hidden = False
    Set Rng = Nothing
    Application.ScreenUpdating = True
End Sub
 
có một cách # nữa là khi bác coi có dùng plugin DirectVobub, thì bản thân nó cũng đã có tính năng này rồi, bác double click vào cái mũi tên màu xanh trên system tray, chọn menu timing, ngoài tính năng delay nó cũng còn tính năng ratio sub:video rất hay nếu bác thường down phim từ internet.
 
Web KT
Back
Top Bottom