Import dữ liệu từ File đang đóng bị lỗi trường Ngày tháng năm
Gửi các thành viên GPE,
Em có sử dụng Code ADO để ImPort dữ liệu từ File đang đóng. Code sưu tầm của sư phụ @ndu96081631
Mọi người giải nén Folder Import Data về máy, Click RUN để Import dữ liệu:Có một thực trạng như sau:
(1) Tại File nguồn (Source) những bản ghi có tháng <=12 thì khi Import về File đích bị đảo vị chí thành ngày, ví dụ 03/12/2018 thành 12/03/2018.
(2) Nhưng nếu mở File Nguồn, Click RUN thì trường ngày lại đúng.Hình như thực trạng này có nói ở đâu đó trên GPE rồi mà em mò không ra.
Rất mong mọi người hỗ trợ chỉnh sửa.Chi tiết Code sưu tầm:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _ ByVal HasTitle As Boolean, ByVal UseTitle As Boolean) 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(HasTitle, "Yes", "No") & ";IMEX=1"";" Else szConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _ "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "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) - UseTitle, UBound(tmpArr, 1)) If UseTitle Then For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1) Arr(0, lC) = rsData.Fields(lC).Name Next End If rsData.Close: cnn.Close For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2) For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1) Arr(lR - UseTitle, 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 Sub Data() Application.ScreenUpdating = False Sheet1.[A2:C5000].ClearContents Dim FileName As String, SheetName As String, RangeAddress As String Dim Arr FileName = ActiveWorkbook.Path & "" & "Source.xlsm" SheetName = "Sheet1" RangeAddress = "A1:C5000" Arr = GetData(FileName, SheetName, RangeAddress, True, True) If IsArray(Arr) Then ThisWorkbook.Sheets("sheet1").[A1].Resize(UBound(Arr, 1) + 1, _ UBound(Arr, 2) + 1).Value = Arr End If Application.ScreenUpdating = True End Sub Sub Xoa() Application.ScreenUpdating = False Sheet1.[A2:C5000].ClearContents Application.ScreenUpdating = True End Sub
Cách khắc phục: trong file source em dùng text to column để chuyển cột date về dmy hoặc copy 1 ô trống rồi paste special value + add vào cột date.
Nguyên nhân tại sao thì chịu, trường hợp này anh thấy 1 số phần mềm xuất file excel hay bị, có thể do xung đột giữa định dạng ngày tháng năm của hệ thống và excel.
Tks a
Lâu quá ko gặp a.
Việc paste 0 vào dữ liệu e đã thực hiện ngay từ nguồn để ra file Source rồi ạ.
Sau khi file source chuyển như vậy thì tất cả ngày tháng ra đều đúng kể cả khi source đã đóng. Anh đoán có sự xung đột giữa định dạng của hệ thống và excel vì file source của em mặc dù đúng là date dạng ddmmyyyy nhưng có 1 số ô căn lề trái như text, số còn lại căn lề phải.
Căn trái (dạng text) với những ô có mm>12
Em chuyển định dạng ngày tháng năm trong control panel – regional settings và trong excel về dạng ddmmyyyy trước rồi mới dùng text to column hoặc cộng thêm 0.
Cái này e vẫn để mặc định vậy mà.
Em thử file source đã sửa này:
Em chưa xem,
Nhưng đang nghĩ hay thôi ko chơi kiểu hiện đại này mà chơi kiểu cổ điển: (1) mở file nguồn (2) copy dữ liệu (3) đóng file nguồn (4) paste vào file đích.
Đúng đấy, bỏ hết code đi. Copy paste thủ công!
www.giaiphapexcel.com/diendan/threads/import-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-file-%C4%91ang-%C4%91%C3%B3ng-b%E1%BB%8B-l%E1%BB%97i-tr%C6%B0%E1%BB%9Dng-ng%C3%A0y-th%C3%A1ng-n%C4%83m.135873/
Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM
Khóa học “Thiết kế Tổng phần thưởng (Total Reward) chuẩn khung SHRM” giúp bạn nắm vững toàn bộ hệ thống đãi ngộ theo chuẩn...
Xem khóa học
Theo tôi nguyên nhân là có nhiều ô chỉ trông giống ngày tháng chứ không là ngày tháng theo triết lý của Excel. Vd. các ô C4, C8-C11, C15, C18, C22-C23, C25, C27-C28, C30-C31, C34, C36-C38, … là "hàng" nhái. Công thức vd. =C4+1 chắc chắn trả về lỗi. Tức "hàng" nhái.
Chọn cột C -> Data -> Text to columns -> Next -> Next -> chọn Date và DMY -> Finish -> lưu tập tin -> đóng tập tin.
Đúng vậy nhưng em đang muốn biết nguyên nhân tại sao lại có ô dạng date, ô dạng text. Em đoán là file source xuất ra từ phần mềm nào đó sử dụng định dạng ngày hệ thống không giống excel, hoặc phần mềm đó xuất ra định dạng ngày tháng cố định không phụ thuộc vào hệ thống lẫn excel. Vì thế những ô nào có ngày <13 thì ngày tháng bị đổi chỗ (trong dữ liệu có cả tháng 12/2018). Còn những ô có ngày >12 đổi chỗ không có tác dụng nên tự chuyển thành text. Em chưa gặp phần mềm như thế nhưng kết quả từ phần mềm xuất ra kiểu này thì em thấy rồi, ngày tháng bị đảo ngược hết.
Anh lại nghĩ khi file đóng thì kết quả mới đúng. Dữ liệu của em những ô text thì đúng ngày tháng, những ô dạng date thì ngày tháng đang đổi chỗ nên mới có những ngày trong tương lai như 3/12/2018 (dòng 5), 6/11/2018 (dòng 11). Nếu em lấy dữ liệu này khi file mở thì kết quả sẽ bị sai. Nếu file source đóng thì ngày tháng lại đổi ngược lại, 2 lần sai thành 1 lần đúng.
Em kiểm tra nếu đúng là ngày tháng trong file source bị đảo ngược (ví dụ ngày thực tế là 12 tháng 3 nhưng file lại là ngày 3 tháng 12) thì dùng text to column hoặc cộng 0 vào cột vẫn bị sai, tốt nhất làm sạch file này bằng định dạng date ddmmyyyy ở cột C, công thức D2=IFERROR(IF(ISTEXT(C2),DATEVALUE(C2),DATE(YEAR(C2),DAY(C2),MONTH(C2))),"") fill xuống, copy paste value vào cột C rồi xóa cột D.
File nguồn dạng text nếu tất cả có dạng dd/mm/yyyy thì em cứ để nguyên. Lấy sang file đích sẽ giữ nguyên text dd/mm/yyyy, dùng text to column trong code file đích thôi.
Tôi mở tập tin Source rồi Run cũng kết quả sai tương tự. Tất nhiên thiết lập của tôi khác của bạn.
Nhưng nếu là tập tin chuẩn thì dù đóng hay mở chưa bao giờ tôi thấy có vấn đề.
Của bạn đây, cái này có thể xử lý dữ liệu ngày trong file source trước
Mình làm thêm 1 nút trong file Data. Trong đó có hàm chuyển đổi dữ liệu ngày tháng trong modul1.