Import dữ liệu từ File đang đóng bị lỗi trường Ngày tháng năm

Liên hệ QC

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT
Moderator
Tham gia
1/1/08
Bài viết
2,579
Được thích
3,715
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Quan hệ.. và quan hệ..
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:
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
 

File đính kèm

  • Import Data.rar
    52.6 KB · Đọc: 27
Bạn xóa dữ liệu file nguồn rồi nhập lại dữ liệu mới thử xem. Tôi làm như vậy chạy đúng mà. không bị lỗi.
 
Nếu bạn Format cột C của bạn là dạng Date trước khi dán kết quả từ sql thì có thể đúng theo file nguồn. Để bình thường (General) thì sẽ bị
Còn vì sao thì mình nghĩ do ông Mi ông tài lanh đó mà...
 
Bạn xóa dữ liệu file nguồn rồi nhập lại dữ liệu mới thử xem. Tôi làm như vậy chạy đúng mà. không bị lỗi.
Cảm ơn bạn,
Dữ liệu cả chục nghìn bản ghi có vẻ hơi căng bạn ơi
Bài đã được tự động gộp:

Nếu bạn Format cột C của bạn là dạng Date trước khi dán kết quả từ sql thì có thể đúng theo file nguồn. Để bình thường (General) thì sẽ bị
Còn vì sao thì mình nghĩ do ông Mi ông tài lanh đó mà...
Có làm Forrmat dạng Date trước khi import mà anh.
 
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.
 
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 ạ.
 
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.
 
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.
 
Em thử file source đã sửa này:
 

File đính kèm

  • Source.xlsm
    33.9 KB · Đọc: 6
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.

Bây giờ Run chắc chắn sẽ cho kết quả đúng.
 
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.

Bây giờ Run chắc chắn sẽ cho kết quả đúng.
Đú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.
 
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.

Bây giờ Run chắc chắn sẽ cho kết quả đúng.
Cảm ơn bác rất nhiều.
Nhưng thực sự làm phải làm thêm 1 bước này nữa thì vô cùng khó chịu.
Thêm nữa nếu mở file Soure rồi mới Run thì kết quả lại chuẩn.
Haizaaa.
 
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.
 
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.
Dùng giải pháp text to columns chuẩn a ơi. Vì file nguồn xuất ra ở dạng text.
Phương án cộng với 0 bị đảo lộn hết (ko sử dụng được trong tình huống này)
 
Dùng giải pháp text to columns chuẩn a ơi. Vì file nguồn xuất ra ở dạng text.
Phương án cộng với 0 bị đảo lộn hết (ko sử dụng được trong tình huống này)

Đôi khi phải vậy. Và bắt buộc phải dùng tính năng Fix ở text to columns của Excel.
Ví như bài này tôi cũng phải xài khi code.Link
 
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.
 
Web KT
Back
Top Bottom