Định dạng ngày tháng năm (1 người xem)

Liên hệ QC

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

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT
Moderator
Tham gia
1/1/08
Bài viết
2,579
Được thích
3,723
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Quan hệ.. và quan hệ..
Em có sử dụng lệnh import dữ liệu của thầy NDU, có phát sinh vấn đề sau
Mọi người giải nén và Copy folder “Hoi GPE” về ổ D của máy tính
Mở file Data, ở sheet 1 có nút Import để lấy dữ liệu từ file 123.xlsx về sheet 123 của file data
Câu hỏi như sau:
Ở file 123.xlsx các trường ngày tháng cột: F, G, H, I, J đều thuộc định dạng dd/mm/yyyy
Tuy nhiên, sau khi import sang sheet 123 thì một số nó chuyển ngược lại thành mm/dd/yyyy (ví dụ F4:F7 của sheet 123 e đã bôi vàng)
Việc chuyển ngược lại làm báo cáo sai lệch hết cả
Mong các thành viên giúp đỡ
 

File đính kèm

Office 2003 có thể ko bị lỗi này. Nhưng O2007 2010 bị lỗi này...
 
Trên máy của các thành viên có bị thế này ko ạh? Hay chỉ là lỗi tại máy của e ?
 
36 lượt tải mà chưa thấy hồi âm. Mong các thành viên hỗ trợ
P/s: nhờ admin gộp mấy bài trên làm một đc ko ahj ?
 
Sao bạn không hỏi chính tác giả của code đó???

????
 
Tôi chỉ bạn một cách tạm thời đơn giản nhất (mà không phải vứt code đó đi),

Đó là bạn đổi định dạng ngày tháng hệ thống --> bằng cách: trong control panel\ Region đổi FORMAT- về English (United States) sau đó mở excel chạy CODE đó --> kết quả được như ý

(tôi đoán ngay cả excel 2003 cũng bị lỗi đó , bạn thử với máy khác nên tưởng đúng mà thôi)
 
Lần chỉnh sửa cuối:
E vẫn để format ở dạng english (united states) ah
e thấy nếu dd < 15 thì bị hiện tượng này. Còn dd>=15 thì ko bị ạh
 
Lần chỉnh sửa cuối:
E vẫn để format ở dạng english (united states) ah
e thấy nếu dd < 15 thì bị hiện tượng này. Còn dd>15 thì ko bị ạh

chính xác là dd>12 --> kết quả nó hiểu là text --> sai
còn dd<=12 --> biến thành tháng luôn, ah, --> sai

Kiểm tra lại format ngày tháng hệ thống bạn có đặt đúng mặc định không?, excel có theo hệ thống không?
 
chính xác là dd>12 --> kết quả nó hiểu là text --> sai
còn dd<=12 --> biến thành tháng luôn, ah, --> sai

Kiểm tra lại format ngày tháng hệ thống bạn có đặt đúng mặc định không?, excel có theo hệ thống không?
Khả năng file nguồn 123.xlsx có cái j đó ko thể giải thích
vì nếu e xoá và tạo 1 file 123.xlsx mới hoàn toàn, nhập ngày tháng năm 1 loạt -> import -> kết quả chuẩn
 
Ở file 123.xlsx các trường ngày tháng cột: F, G, H, I, J đều thuộc định dạng dd/mm/yyyy

Trong file 123.xlsx, các giá trị ô đó đều định dạng mm/d/yyyy. Em nên sử dụng hàm Day, Month, Year trong Excel để kiểm tra cho chắc.
 
Vậy có nghĩa là bạn không cần phải lo nữa không?

Vứt file 123.xlsx là xong???
Dạ. Vấn đề là xoá file 123 thì đơn giản. Nhưng file nguồn thực tế rất nhiều dữ liệu ko thể xoá và nhập lại đơn giản đc ạh...
 
Dạ. Vấn đề là xoá file 123 thì đơn giản. Nhưng file nguồn thực tế rất nhiều dữ liệu ko thể xoá và nhập lại đơn giản đc ạh...

Vậy thử cách này,

Bạn sửa đoạn code sau (màu đỏ) trong function GetData

Mã:
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
        [COLOR="#FF0000"]arr(lR, lC) = tmpArr(lC, lR)[/COLOR]
    Next
  Next
thành như sau (màu xanh)

Mã:
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)    
[COLOR="#0000FF"]        If IsDate(tmpArr(lC, lR)) Then
            arr(lR, lC) = CDate(tmpArr(lC, lR))
        Else
            arr(lR, lC) = tmpArr(lC, lR)
        End If[/COLOR]
    Next
  Next

chắc là được như ý
 
Vấn đề ở đây là ngày tháng năm ở nhiều nơi không thống nhất nhau. Nếu không thì việc copy dữ liệu rất đơn giản. Copy --> Paste vùng có dữ liệu thôi. Mình có thể xây dựng thủ tục kiểu khác, nhận diện chính xác ngày tháng năm từ gốc rồi copy sang. Không hiểu ý Tú thế nào?
 
Vấn đề ở đây là ngày tháng năm ở nhiều nơi không thống nhất nhau. Nếu không thì việc copy dữ liệu rất đơn giản. Copy --> Paste vùng có dữ liệu thôi. Mình có thể xây dựng thủ tục kiểu khác, nhận diện chính xác ngày tháng năm từ gốc rồi copy sang. Không hiểu ý Tú thế nào?
Vâng ạh. Có lẽ quay về cách truyền thống..copy/paste thôi ạh
 
Vậy thử cách này,

Bạn sửa đoạn code sau (màu đỏ) trong function GetData

Mã:
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
        [COLOR=#FF0000]arr(lR, lC) = tmpArr(lC, lR)[/COLOR]
    Next
  Next
thành như sau (màu xanh)

Mã:
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)    
[COLOR=#0000FF]        If IsDate(tmpArr(lC, lR)) Then
            arr(lR, lC) = CDate(tmpArr(lC, lR))
        Else
            arr(lR, lC) = tmpArr(lC, lR)
        End If[/COLOR]
    Next
  Next

chắc là được như ý
Code của thầy NDU có lẽ là tối ưu rồi ạh...chỉ do file nguồn của e có vấn đe thôi ạh
e có sửa theo của a thì rất chuẩn r ạh... Tuy nhiên gặp phải tình huống dữ liệu ko có ngày tháng năm code báo lỗi ngay ạh...
e cảm ơn a nhiều
 
Lần chỉnh sửa cuối:
Code của thầy NDU có lẽ là tối ưu rồi ạh...chỉ do file nguồn của e có vấn đe thôi ạh

Ấy ấy... bạn đừng có nghĩ vậy!
Nói thật là ADO tôi chỉ biết đến đó thôi nên cũng không biết phải trả lời bạn thế nào nữa
Để xem chú Hai Lúa nói gì
 
Code của thầy NDU có lẽ là tối ưu rồi ạh...chỉ do file nguồn của e có vấn đe thôi ạh
e có sửa theo của a thì rất chuẩn r ạh... Tuy nhiên gặp phải tình huống dữ liệu ko có ngày tháng năm code báo lỗi ngay ạh...
e cảm ơn a nhiều

Đó là cách tôi chữa cháy tạm thời cho file của bạn, dưới đây là sửa vấn đề code lõi

Không có gì nặng nề vậy đâu

Function GetData còn thiếu chưa xét đến có/không Header thôi (đang mặc định là không có : HDR=No) nhưng trong dữ liệu 123 của bạn là có --> dẫn đến sai lệch về Kiểu của các trường thôi (hiểu là trường string hết)

Giải pháp là sửa 1 chút như sau, là được (Bạn là người đã biết VBA , vậy để bạn so sánh ra sự thay đổi nhé , dễ nhìn thấy ngay mà và test lại dùm cùng nhận xét)

PHP:
Function GetData(ByVal FileName As String, _
                 Optional ByVal SheetName As String = "", _
                 Optional ByVal RangeAddress As String = "", _
                 Optional ByVal HasHDR As Boolean = True)
            
  Dim cnn As Object, rsData As Object
  Dim tmpArr, arr
  Dim szConn As String, szSQL As String, tmp As String
  Dim lR As Long, lC As Long, lVersn As Long
  On Error GoTo ErrHandler
  lVersn = Val(Application.Version)
  Set cnn = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  
  If lVersn < 12 Then
    szConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasHDR, "YES", "NO") & ";IMEX=1"";"
  Else
    szConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR= " & IIf(HasHDR, "YES", "NO") & " ;IMEX=1"";"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVersn < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, "''", "'")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  Else
    SheetName = SheetName & "$"
  End If
  cnn.Open szConn
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, cnn, 1, 1
  tmpArr = rsData.GetRows
  ReDim arr(UBound(tmpArr, 2), UBound(tmpArr, 1))
  rsData.Close: cnn.Close
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      arr(lR, lC) = tmpArr(lC, lR)
    Next
  Next
  GetData = arr
  Set rsData = Nothing: Set cnn = Nothing
  Exit Function
ErrHandler:
  MsgBox Err.Description
  Set rsData = Nothing: Set cnn = Nothing
End Function
 
Function GetData còn thiếu chưa xét đến có/không Header thôi (đang mặc định là không có : HDR=No) nhưng trong dữ liệu 123 của bạn là có --> dẫn đến sai lệch về Kiểu của các trường thôi (hiểu là trường string hết)

Lần đầu viết hàm này tôi có dùng đến đối số HasTitle. Sau đó lại nghĩ là không cần thiết: Cùng lắm mình viết địa chỉ tới đâu thì lấy dữ liệu đến nấy (vì chưa rành ADO)
Bây giờ mới thấy cái biến này quả thật không phải chỉ để chơi cho vui, nó có cái "lợi hại" bên trong
Cảm ơn bạn
 
Web KT

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

Back
Top Bottom