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

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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 SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    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.

    Đú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.

    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)

    Đô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.[URL='www.giaiphapexcel.com/diendan/threads/code-vba-l%E1%BA%A5y-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-txt-sang-excel.135473/#post-864376']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.

    Không được a ơi,
    Phải text to columns ngay từ File nguồn.
    Nếu Import luôn khi sang File đích nó đảo lộn hết cả.

    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 đề.

    Hôm nay e chạy code import bị lỗi này: Unspecified error.
    Có phải do Ram hết bộ nhớ.
    Tắt hệt các File excel đi, mở lại và Import thì được.

    2843

    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.

    Private Sub CommandButton1_Click()
        Dim I, J        As Long
        J = Sheets("Sheet1").UsedRange.Rows.Count
        For I = 3 To J
            If Sheets("Sheet1").Cells(I, 3).Value = "" Then
                Sheets("Sheet1").Cells(I, 3).Value = ""
            Else
                Sheets("Sheet1").Cells(I, 3).Value = DateValue(ExtractNumber(Sheets("Sheet1").Cells(I, 3).Value))
            End If
        Next
    End Sub
    
    'trong modul1
    ' ham chuyen doi ngay thang nam
    Function ExtractNumber(rCell As String)
        Dim lCount      As Long
        Dim sText       As String
        Dim lNum        As String
        sText = rCell
        For lCount = Len(sText) To 1 Step -1
            If IsNumeric(Mid(sText, lCount, 1)) Then
                lNum = Mid(sText, lCount, 1) & lNum
            End If
        Next lCount
        lNum = Left(lNum, 2) & "/" & Mid(lNum, 3, 2) & "/" & Right(lNum, 4)
        ExtractNumber = lNum
    End Function

    http://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/post-882609

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm