Nhờ sửa lỗi code không copy y nguyên định dạng format ngày giờ được

pinklove

Thành viên thường trực
Tham gia ngày
21 Tháng một 2008
Bài viết
309
Được thích
28
Điểm
685
Mình bó tay rồi ạ. Làm theo mọi cách các bạn nói vẫn bị. Các bạn giúp mình sửa hẳn trong file với, để xem ko biết mình sai chỗ nào nữa ko
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,103
Được thích
948
Điểm
560
Mình không hề định dạng mà ở sheet TAM nó tự định dạng cột I dang custom. chỉnh lại cũng ko được.

Mình làm theo cách của bạn cũng ko được luôn. Không hiểu do setup gì trên máy không? Nhưng trên máy DATE mình set theo chuẩn rồi.
Tôi chịu thôi!

Để giải thích cho bạn hiểu một tí.
1. Trong Excel phải chuyển ngày dạng Text thành Date của Excel để tính toán, khi tính toán để lấy ra ngày tháng năm, gồm các hàm Day, Month, Year
2. Nếu dữ nguyên là Text trong File của bạn chỉ cần bạn để CSTR(sArr(i, j)) là được.
Mã:
If sArr(i, j - 1) Like "*/*/*:*:*" Then
    dArr(k, j) = CSTR(sArr(i, j - 1))
Else
    dArr(k, j) = sArr(i, j - 1)
End If
Hoặc là:
Dim dArr() As String

Đừng trót dại lấy hàm Mid, Left, Right để tìm ngày tháng, phức tạp lắm nhé bạn.
 

pinklove

Thành viên thường trực
Tham gia ngày
21 Tháng một 2008
Bài viết
309
Được thích
28
Điểm
685
1575281948265.png
Khi em import file gốc có ngày lớn hơn tháng thì nó trả về đúng kiểu em cần. Em up lên đây 2 file gốc của em các bác xem giúp. Cái T11 là cái cuối tháng nên nó đúng. Cái T12 đầu tháng nó sai.
 

File đính kèm

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
1,103
Được thích
948
Điểm
560
Bạn thử thay thế Sub LDT_tam này vào. Lý do đi loằn ngoằn, lòng vòng, là do bạn đặt câu hỏi.
Vì sao không vào thẳng ý muốn của bạn trong bài viết.

PHP:
Public Sub LDT_tam()
  Dim sArr(), i As Long, j As Long, k As Long
  With Sheets("goc")
    sArr = .Range(.[A2], .[AC65536].End(xlUp)).Value
  End With
  ReDim dArr(1 To UBound(sArr, 1), 1 To 12)
  With Sheets("TAM")
    For i = 1 To UBound(sArr, 1)
      If sArr(i, 14) = "" Then
        If sArr(i, 15) = "" Then
          If sArr(i, 29) <> "" Then
            k = k + 1
            dArr(k, 1) = k
            For j = 2 To 10
              If sArr(i, j - 1) Like "*/*/*:*:*" Then
                dArr(k, j) = CDate(sArr(i, j - 1))
                dArr(k, 11) = ((CDate(.[L4].Value2) - CDate(sArr(i, j - 1))) * 1440) \ 1
                dArr(k, 12) = IIf(dArr(k, 11) > 240, "KH" & ChrW(212) & "NG ", "") & ChrW(272) & ChrW(7840) & "T"
              Else
                dArr(k, j) = sArr(i, j - 1)
              End If
            Next j
          End If
        End If
      End If
    Next i
    .Range("A5:L500").ClearContents
    If k Then
      .Range("A5").Resize(k, 12) = dArr
    End If
  End With
End Sub
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,503
Được thích
3,787
Điểm
560
Mình bó tay rồi ạ. Làm theo mọi cách các bạn nói vẫn bị.
Sao bạn không dùng Text to column? Sao không chuyển dữ lựu gốc thành ngày tháng chuẩn?

Lưu ý: khi bạn chỉ có ngày tháng không có thời gian thì Text to column thành công ngay. Khi có ngày tháng và thời gian thì phải kiểm tra trong Control Panel và: chọn Việt Nam với dd/MM/yyyy. Sau đó dùng Text to column thành công. Ít ra là trên máy tôi.
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,503
Được thích
3,787
Điểm
560
Để khỏi thành nói phét thì tôi đã làm như video đính kèm. Tôi không dùng bất cứ code nào cả. Chỉ Text to column thôi.


Trong tập tin video bạn thấy tôi thao tác lần lượt như sau:

- trước tiên kiểm tra thấy dữ liệu cột H ở goc được căn trái, công thức ở I1 trả về #VALUE!.

Tức là text giả bộ ngày tháng

- tôi chạy code của bạn

- tôi kiểm tra kết quả ở TAM thì thấy ngày tháng bị đổi chỗ.

- tôi chọn cột H trong goc và dùng Text to column

- kiểm tra thấy dữ liệu cột H ở goc được căn trái, công thức ở I1 trả về #VALUE!. Tức vẫn là

text giả bộ ngày tháng

- tuy nhiên tôi vẫn thử chạy code và kiểm tra kết quả ở TAM thì vẫn thấy ngày tháng bị đổi chỗ.

- tôi vào Control Panel thì rõ ràng thiết lập đang của Ba Lan.

- tôi chuyển sang chọn Việt Nam với dd/MM/rrrr - r là rok (Ba Lan) = y là year (English)

- kiểm tra thấy I1 không còn lỗi nhưng cột H vẫn bị canh trái, tức chưa chuẩn 100%.

- tôi lại chọn cột H và dùng Text to column.

- kiểm tra thấy dữ liệu cột H đã được canh trái.

- tôi chạy code rồi kiểm tra TAM. Bây giờ ngày tháng đã đúng chỗ.

Một khi ngày tháng đã chuẩn theo cách hiểu của Excel thì bây giờ có chọn gì trong Control

Panel thì Excel cũng sẽ hiển thị ngày tháng chuẩn theo thiết lập được chọn. Tức tôi lại chuyển

trong CP về Ba Lan. Trên máy tôi sẽ là 2019-12-02 ... Nhưng nếu tôi gửi tập tin cho ông ngoại

quốc là bạn thì bạn sẽ thấy 02/12/2019 ...

Nếu chỉ có ngày tháng mà không có thời gian thì tôi dùng Text to Column thành công ngay mà

không cần thay đổi thiết lập trong CP sang Việt Nam.
 

be09

TNMT_Đồng Nai
Tham gia ngày
9 Tháng tư 2011
Bài viết
8,395
Được thích
8,163
Điểm
560
Tuổi
62
Nơi ở
Biên Hòa, Đồng Nai
Nhờ các bạn xem giúp mình, dữ liệu mình import vào ở sheet "goc", sau đó code sẽ copy sang sheet "TAM". Nhưng ở khi sang sheet "TAM" cột ngày tháng cứ tự chuyển thành định dạng "tháng/ngày/năm" chứ ko giữ nguyên mặc định như ở sheet "goc" dẫn đến kết quả bị sai lệch.
Bạn 2 Nick hay sao mà File 2 bài viết của 2 Nick ở 2 nơi lại rập khuông nhau.
Vào Link này định dạng ngày giờ tải File về dùng thử.
 
Lần chỉnh sửa cuối:

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
6,276
Được thích
10,344
Điểm
1,860
Theo mình cách tốt nhất cho chủ bài đăng là tách từ nguồn (Trang 'Goc') thành 2 cột ở trang đích ('Tam'); 1 cột là MM/DD/yyyy & cột nữa là 'HH:mm:cc'
Thêm nữa cột 'MM/dd/yyyy' ta có thể định dạng thành 'DD/MM/yyyy' cho quen mắt

Tác giả bài đăng không nên 'muốn gì được nấy' cho cột chứa dữ liệu về ngày-tháng-năm; nhất là trong thời kỳ hội nhập!
 

pinklove

Thành viên thường trực
Tham gia ngày
21 Tháng một 2008
Bài viết
309
Được thích
28
Điểm
685
Bạn 2 Nick hay sao mà File 2 bài viết của 2 Nick ở 2 nơi lại rập khuông nhau.
Vào Link này định dạng ngày giờ tải File về dùng thử.
Cảm ơn các bạn đã giúp đỡ , hôm qua liên hoan cơ quan nên về ko biết gì để check nữa. Hôm nay e sẽ kiểm tra lại ạ.
Em chỉ dùng 1 nick này và chỉ đăng bài này ở đây thôi ạ
 

pinklove

Thành viên thường trực
Tham gia ngày
21 Tháng một 2008
Bài viết
309
Được thích
28
Điểm
685
Bạn thử thay thế Sub LDT_tam này vào. Lý do đi loằn ngoằn, lòng vòng, là do bạn đặt câu hỏi.
Vì sao không vào thẳng ý muốn của bạn trong bài viết.

PHP:
Public Sub LDT_tam()
  Dim sArr(), i As Long, j As Long, k As Long
  With Sheets("goc")
    sArr = .Range(.[A2], .[AC65536].End(xlUp)).Value
  End With
  ReDim dArr(1 To UBound(sArr, 1), 1 To 12)
  With Sheets("TAM")
    For i = 1 To UBound(sArr, 1)
      If sArr(i, 14) = "" Then
        If sArr(i, 15) = "" Then
          If sArr(i, 29) <> "" Then
            k = k + 1
            dArr(k, 1) = k
            For j = 2 To 10
              If sArr(i, j - 1) Like "*/*/*:*:*" Then
                dArr(k, j) = CDate(sArr(i, j - 1))
                dArr(k, 11) = ((CDate(.[L4].Value2) - CDate(sArr(i, j - 1))) * 1440) \ 1
                dArr(k, 12) = IIf(dArr(k, 11) > 240, "KH" & ChrW(212) & "NG ", "") & ChrW(272) & ChrW(7840) & "T"
              Else
                dArr(k, j) = sArr(i, j - 1)
              End If
            Next j
          End If
        End If
      End If
    Next i
    .Range("A5:L500").ClearContents
    If k Then
      .Range("A5").Resize(k, 12) = dArr
    End If
  End With
End Sub
Chân thành cảm ơn bạn, mình đã sửa theo code này và ok rồi ạ
 
Top Bottom