Nhờ tách dữ liệu trong các cột (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

pinklove

Thành viên thường trực
Tham gia
21/1/08
Bài viết
336
Được thích
42
Nhờ các anh chị em giúp đỡ viết code tách dữ liệu ở các cột theo như yêu cầu ở trong file kèm theo với ạ.
 

File đính kèm

Nhờ các anh chị em giúp đỡ viết code tách dữ liệu ở các cột theo như yêu cầu ở trong file kèm theo với ạ.

Trong lúc chờ cao thủ khác viết bằng Code mình xin làm thử bằng cách dùng CT, bạn thử xem có được không
 

File đính kèm

Upvote 0
Nhờ các anh chị em giúp đỡ viết code tách dữ liệu ở các cột theo như yêu cầu ở trong file kèm theo với ạ.
Kết quả G15=19/09/2015 là lấy từ đâu vậy?
Yêu cầu thế này thì "hổng có trách nhiệm" với bài viết của mình.
PHP:
Public Sub CuLoi()
Dim sArr(), dArr(), I As Long
sArr = Range([A14], [A14].End(xlDown)).Resize(, 3).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
For I = 1 To UBound(sArr, 1)
    dArr(I, 1) = Mid(sArr(I, 1), InStr(sArr(I, 1), ":") + 1, Len(sArr(I, 1)))
    dArr(I, 2) = TimeSerial(Hour(sArr(I, 2)), Minute(sArr(I, 2)), Second(sArr(I, 2)))
    dArr(I, 3) = DateSerial(Year(sArr(I, 2)), Month(sArr(I, 2)), Day(sArr(I, 2)))
    If sArr(I, 3) <> Empty Then
        dArr(I, 4) = TimeSerial(Hour(sArr(I, 3)), Minute(sArr(I, 3)), Second(sArr(I, 3)))
        dArr(I, 5) = DateSerial(Year(sArr(I, 3)), Month(sArr(I, 3)), Day(sArr(I, 3)))
    End If
Next I
[E14].Resize(I - 1, 5) = dArr
End Sub
 

File đính kèm

  • CuLoi.jpg
    CuLoi.jpg
    37.6 KB · Đọc: 108
Upvote 0
Nhờ các anh chị em giúp đỡ viết code tách dữ liệu ở các cột theo như yêu cầu ở trong file kèm theo với ạ.

Bài này vừa dễ lại vừa khó:
- DỄ: chỉ là bài toán tách chuỗi, nhìn là thấy
- KHÓ: Vì cột B và C của bạn thuộc dạng Text nên khi tách ra rồi chuyển đổi thành ngày giờ có khả năng sẽ cho kết quả sai trên hệ thống mà Control Panel thiết lập M/d/yy

Gợi ý cho bạn công thức tại F14:
Mã:
=IF(B14="",0,--RIGHT(B14,8))
Công thức tại G14:
Mã:
=IF(B14="",0,DATE(MID(B14,7,4),MID(B14,4,2),LEFT(B14,2)))
Công thức tại H14:
Mã:
=IF(C14="",0,--RIGHT(C14,8))
Công thức tại I14:
Mã:
=IF(C14="",0,DATE(MID(C14,7,4),MID(C14,4,2),LEFT(C14,2)))
Tất cả kéo fill xuống
 
Lần chỉnh sửa cuối:
Upvote 0
Kết quả G15=19/09/2015 là lấy từ đâu vậy?
Yêu cầu thế này thì "hổng có trách nhiệm" với bài viết của mình.
PHP:
Public Sub CuLoi()
Dim sArr(), dArr(), I As Long
sArr = Range([A14], [A14].End(xlDown)).Resize(, 3).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
For I = 1 To UBound(sArr, 1)
    dArr(I, 1) = Mid(sArr(I, 1), InStr(sArr(I, 1), ":") + 1, Len(sArr(I, 1)))
    dArr(I, 2) = TimeSerial(Hour(sArr(I, 2)), Minute(sArr(I, 2)), Second(sArr(I, 2)))
    dArr(I, 3) = DateSerial(Year(sArr(I, 2)), Month(sArr(I, 2)), Day(sArr(I, 2)))
    If sArr(I, 3) <> Empty Then
        dArr(I, 4) = TimeSerial(Hour(sArr(I, 3)), Minute(sArr(I, 3)), Second(sArr(I, 3)))
        dArr(I, 5) = DateSerial(Year(sArr(I, 3)), Month(sArr(I, 3)), Day(sArr(I, 3)))
    End If
Next I
[E14].Resize(I - 1, 5) = dArr
End Sub
Em cảm ơn anh. E xin lỗi vì cẩu thả trong việc làm ví dụ. Lần sau e sẽ cận thận hơn.
Ở chỗ tên NE phía sau vẫn còn cái dấu ")". Có bỏ nốt được không anh?
 
Upvote 0
bạn thay thành dArr(I, 1) = Mid(sArr(I, 1), InStr(sArr(I, 1), ":") + 1, Len(sArr(I, 1)) - InStr(sArr(I, 1), ":") - 1) là được mà
 
Upvote 0
Kết quả G15=19/09/2015 là lấy từ đâu vậy?
Yêu cầu thế này thì "hổng có trách nhiệm" với bài viết của mình.
PHP:
Public Sub CuLoi()
Dim sArr(), dArr(), I As Long
sArr = Range([A14], [A14].End(xlDown)).Resize(, 3).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
For I = 1 To UBound(sArr, 1)
    dArr(I, 1) = Mid(sArr(I, 1), InStr(sArr(I, 1), ":") + 1, Len(sArr(I, 1)))
    dArr(I, 2) = TimeSerial(Hour(sArr(I, 2)), Minute(sArr(I, 2)), Second(sArr(I, 2)))
    dArr(I, 3) = DateSerial(Year(sArr(I, 2)), Month(sArr(I, 2)), Day(sArr(I, 2)))
    If sArr(I, 3) <> Empty Then
        dArr(I, 4) = TimeSerial(Hour(sArr(I, 3)), Minute(sArr(I, 3)), Second(sArr(I, 3)))
        dArr(I, 5) = DateSerial(Year(sArr(I, 3)), Month(sArr(I, 3)), Day(sArr(I, 3)))
    End If
Next I
[E14].Resize(I - 1, 5) = dArr
End Sub

Giờ mới để ý cái chỗ đỏ đỏ này! "Bắt giò" anh Ba nha.
(liên quan đến M/d/yy trong Control Panel)
Ẹc... Ẹc...
 
Upvote 0
Mù mờ không hiểu chi hết anh ạ !$@!!
Em thử sửa lại định dạng là M/d/yy thì thấy vẫn đúng mà anh.

Sửa M/d/yy là sửa trong Control Panel ấy (không phải sửa trên bảng tính)
Sửa xong, chạy lại code sẽ biết liền
Một code chạy đúng là code luôn ra cùng một kết quả, bất kể Control Panel định dạng kiểu gì
 
Upvote 0
Sửa M/d/yy là sửa trong Control Panel ấy (không phải sửa trên bảng tính)
Sửa xong, chạy lại code sẽ biết liền
Một code chạy đúng là code luôn ra cùng một kết quả, bất kể Control Panel định dạng kiểu gì
tôi rất quan tâm đến câu nói này của ndu96081631

. Anh có thể làm ví dụ chỉ giáo cho được không?
 
Upvote 0
Theo mình giờ theo english thì ngày trước tháng sau; giờ theo canada thì lại tháng trước ngày sau @@
 
Upvote 0
tôi rất quan tâm đến câu nói này của ndu96081631

. Anh có thể làm ví dụ chỉ giáo cho được không?
Ý a Ndu là khi chỉnh lại định dạng ngày trong control panel thành m/d/yy thì định dạng ở cột ngày tháng sau khi chạy code nó vẫn phải là mm/dd/yyyy thì đó mới là code đúng hoàn toàn. Anh Ndu cho e hỏi ngoài cách dùng công thức a đã gợi ý cho em thì nếu sửa lại code của bác Ba thì phải sửa thế nào cho đúng a.
 
Upvote 0
Kết quả G15=19/09/2015 là lấy từ đâu vậy?
Yêu cầu thế này thì "hổng có trách nhiệm" với bài viết của mình.
PHP:
Public Sub CuLoi()
Dim sArr(), dArr(), I As Long
sArr = Range([A14], [A14].End(xlDown)).Resize(, 3).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
For I = 1 To UBound(sArr, 1)
    dArr(I, 1) = Mid(sArr(I, 1), InStr(sArr(I, 1), ":") + 1, Len(sArr(I, 1)))
    dArr(I, 2) = TimeSerial(Hour(sArr(I, 2)), Minute(sArr(I, 2)), Second(sArr(I, 2)))
    dArr(I, 3) = DateSerial(Year(sArr(I, 2)), Month(sArr(I, 2)), Day(sArr(I, 2)))
    If sArr(I, 3) <> Empty Then
        dArr(I, 4) = TimeSerial(Hour(sArr(I, 3)), Minute(sArr(I, 3)), Second(sArr(I, 3)))
        dArr(I, 5) = DateSerial(Year(sArr(I, 3)), Month(sArr(I, 3)), Day(sArr(I, 3)))
    End If
Next I
[E14].Resize(I - 1, 5) = dArr
End Sub
ANh Bate và các anh chị cho em hỏi thêm về đề tài này. Với code trên, bây giờ em muốn sau khi chuyển đổi thì sẽ có tiếp 2 cột tính tổng thời gian chạy theo giờ và theo phút dựa vào các cột vừa chuyển đổi. Ba Tê và các anh chị giúp đỡ.
(Em có làm bằng công thức nhưng bị lỗi nếu như giờ bắt đầu và giờ kết thúc ở 2 ngày khác nhau, tức là thời gian chạy máy quá 24h.)
 
Upvote 0
ANh Bate và các anh chị cho em hỏi thêm về đề tài này. Với code trên, bây giờ em muốn sau khi chuyển đổi thì sẽ có tiếp 2 cột tính tổng thời gian chạy theo giờ và theo phút dựa vào các cột vừa chuyển đổi. Ba Tê và các anh chị giúp đỡ.
(Em có làm bằng công thức nhưng bị lỗi nếu như giờ bắt đầu và giờ kết thúc ở 2 ngày khác nhau, tức là thời gian chạy máy quá 24h.)

Muốn trừ giờ thì bạn phải lấy Date2 + Timer2 - Date1 - Time1
Nếu chỉ lấy time trừ với time thì.. trật lất
 
Upvote 0
Muốn trừ giờ thì bạn phải lấy Date2 + Timer2 - Date1 - Time1
Nếu chỉ lấy time trừ với time thì.. trật lất
Anh chỉ em công thức đi ạ. Em tìm hoài chẳng thấy.
Nếu có thể anh sửa luôn nơi code cho em được không ạ. Hôm hỏi code em quên mất. Giờ 12 tháng mỗi tháng hàng ngàn dòng công thức fill xuống thế này file hơi nặng ạ.
 
Upvote 0
Anh chỉ em công thức đi ạ. Em tìm hoài chẳng thấy.
Nếu có thể anh sửa luôn nơi code cho em được không ạ. Hôm hỏi code em quên mất. Giờ 12 tháng mỗi tháng hàng ngàn dòng công thức fill xuống thế này file hơi nặng ạ.

Hiện bạn đang dùng code gì tôi có biết đâu mà sửa. Đưa file đang có code đang dùng lên rồi tính
 
Upvote 0
Hiện bạn đang dùng code gì tôi có biết đâu mà sửa. Đưa file đang có code đang dùng lên rồi tính
File của em là file Test. Còn file nguồn lấy dữ liệu là Repordata.
Dữ liệu Import vào từ cột B, ở cột G em muốn có tổng số giờ tính theo giờ, ở cột H tính theo phút.
Nhờ anh định dạng dữ liệu 2 cột này như ở mấy cột được import ra giúp em luôn.
 

File đính kèm

Upvote 0
File của em là file Test. Còn file nguồn lấy dữ liệu là Repordata.
Dữ liệu Import vào từ cột B, ở cột G em muốn có tổng số giờ tính theo giờ, ở cột H tính theo phút.
Nhờ anh định dạng dữ liệu 2 cột này như ở mấy cột được import ra giúp em luôn.

Thì vầy thôi:
Mã:
Public Sub Exporting()
  Dim sArr(), dArr(), vFile
  Dim wkb As Workbook, wks As Worksheet, rng As Range
  Dim sFile As String, tmp As String
  Dim i As Long
  vFile = Application.GetOpenFilename("Excel Files, *.xls*")
  If TypeName(vFile) = "String" Then
    sFile = CStr(vFile)
    Application.ScreenUpdating = False
    Set wkb = Workbooks.Open(sFile)
    Set wks = wkb.Worksheets("Sheet1")
    sArr = wks.Range("J14", wks.Range("E60000").End(xlUp)).Value
    wkb.Close False
    ReDim dArr(1 To UBound(sArr, 1), [COLOR=#0000cd]1 To 7[/COLOR])
    For i = 1 To UBound(sArr, 1)
      tmp = Mid(sArr(i, 1), InStr(sArr(i, 1), ":") + 1)
      dArr(i, 1) = Left(tmp, Len(tmp) - 5)
      dArr(i, 2) = TimeValue(Right(sArr(i, 5), 8))
      dArr(i, 3) = DateSerial(Mid(sArr(i, 5), 7, 4), Mid(sArr(i, 5), 4, 2), Left(sArr(i, 5), 2))
      If sArr(i, 3) <> Empty Then
        dArr(i, 4) = TimeValue(Right(sArr(i, 6), 8))
        dArr(i, 5) = DateSerial(Mid(sArr(i, 6), 7, 4), Mid(sArr(i, 6), 4, 2), Left(sArr(i, 6), 2))
      End If
      [COLOR=#ff0000]dArr(i, 6) = dArr(i, 5) + dArr(i, 4) - dArr(i, 3) - dArr(i, 2)
      dArr(i, 7) = Hour(dArr(i, 6)) * 60 + Minute(dArr(i, 6))[/COLOR]
    Next i
    Application.ScreenUpdating = True
    On Error Resume Next
    Set rng = Application.InputBox("Chon noi de dat", Type:=8)
    On Error GoTo 0
    If Not rng Is Nothing Then
      With rng.Resize(i - 1, 7)
        .Value = dArr
        .EntireColumn.AutoFit
        Union(.Offset(, 1).Resize(, 1), .Offset(, 3).Resize(, 1), .Offset(, 3).Resize(, 5)).NumberFormat = "hh:mm"
        Union(.Offset(, 2).Resize(, 1), .Offset(, 4).Resize(, 1)).NumberFormat = "dd/mm/yyyy"
        .Offset(, 6).Resize(, 1).NumberFormat = "General"
      End With
    End If
  End If
End Sub
Chỗ màu đỏ là thêm vào, màu xanh là sửa lại
Nhân tiện sửa luôn sub Xoa_DL cho gọn:
Mã:
Sub Xoa_DL()
  Dim Ans As VbMsgBoxResult
  Ans = MsgBox("Ban chac chan muon xoa du lieu chu?", vbYesNo, "Xac nhan thong tin")
  If Ans = vbYes Then ActiveSheet.Range("B8:H60000").ClearContents
End Sub
---------------
Tôi thắc mắc: Đằng nào thì dữ liệu cũng sẽ được Import vào cột B, vậy tại sao bạn còn dùng cái Application.InputBox("Chon noi de dat", Type:=8) để làm gì?
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom