Không lấy đủ dữ liệu bằng kết nối ADO

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

shnhatha221108

Thành viên chính thức
Tham gia
2/10/18
Bài viết
72
Được thích
13
Tôi sử dung code của bác Hai Lúa Miền Tây lấy dữ liều từ File_Nguon vào file DATA .Kết quả hiển thị dữ liệu tại sheets(TH) cột E của file DATA không có dữ liệu so với dữ liệu nguồn
Mong anh chị em diễm đàn kiểm tra chỉ bảo giúp
 

File đính kèm

  • DL_DATA.xlsm
    164.1 KB · Đọc: 11
  • DL_Nguon.xlsm
    64.8 KB · Đọc: 11
Tôi sử dung code của bác Hai Lúa Miền Tây lấy dữ liều từ File_Nguon vào file DATA .Kết quả hiển thị dữ liệu tại sheets(TH) cột E của file DATA không có dữ liệu so với dữ liệu nguồn
Mong anh chị em diễm đàn kiểm tra chỉ bảo giúp
Tôi kiểm tra lại thấy bình thường mà, bạn nói thiếu dữ liệu là thiếu cái gì?
 
Upvote 0
Tôi kiểm tra lại thấy bình thường mà, bạn nói thiếu dữ liệu là thiếu cái gì?
Chào anh cảm ơn anh đã xem bài..
Khi lấy dữ liệu về thì cột E không có dữ liệu..
Nhờ anh xem giúp mặc dù đã để Imex=1.Nếu định dạng lại file nguồn thì sẽ lấy được đủ dữ liệu nhưng do file nguồn được trính xuất từ một phần mềm khác cập nhật theo ngày.Nếu mỗi lần thay đổi cập nhật dữ liệu lại phải định dạng lại file nguồn thì sẽ rất bất tiện.Nên muốn nhờ anh chị em tìm hiểu lỗi giúp.
Ảnh chụp màn hình 2024-04-28 123705.png
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh cảm ơn anh đã xem bài..
Khi lấy dữ liệu về thì cột E không có dữ liệu..
Nhờ anh xem giúp mặc dù đã để Imex=1.Nếu định dạng lại file nguồn thì sẽ lấy được đủ dữ liệu nhưng do file nguồn được trính xuất từ một phần mềm khác cập nhật theo ngày.Nếu mỗi lần thay đổi cập nhật dữ liệu lại phải định dạng lại file nguồn thì sẽ rất bất tiện.Nên muốn nhờ anh chị em tìm hiểu lỗi giúp.
Sủa lại vầy nha bạn:

Mã:
            With cnn
                If Val(Application.Version) < 12 Then
                    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                                      & "Data Source=" & Fname & ";Extended Properties=""Excel 8.0;HDR=Yes;Imex=0"";"
                Else
           '    Fname = .SelectedItems
                    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                                      & "Data Source=" & Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) & ";Extended Properties=""Excel 12.0;HDR=Yes;Imex=0"";"
                End If
                .Open
            
            'For i = 0 To UBound(shNameNguon)
          
                lsSQL = "SELECT * FROM [DATA$A1:AG65536]"

Có 2 điểm cần sửa:

1) Cho HDR tất cả bằng Yes

2) [DATA$A1:AG65536]" sửa số 2 thành số 1 nha.
 
Upvote 0
Sủa lại vầy nha bạn:

Mã:
            With cnn
                If Val(Application.Version) < 12 Then
                    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                                      & "Data Source=" & Fname & ";Extended Properties=""Excel 8.0;HDR=Yes;Imex=0"";"
                Else
           '    Fname = .SelectedItems
                    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                                      & "Data Source=" & Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) & ";Extended Properties=""Excel 12.0;HDR=Yes;Imex=0"";"
                End If
                .Open
           
            'For i = 0 To UBound(shNameNguon)
         
                lsSQL = "SELECT * FROM [DATA$A1:AG65536]"

Có 2 điểm cần sửa:

1) Cho HDR tất cả bằng Yes

2) [DATA$A1:AG65536]" sửa số 2 thành số 1 nha.
Tôi đã thử nhưng tại sao vẫn không được nhỉ vùng dữ liệu vẫn bị trắng.
Tôi đã thử bằng cách chọn toàn bộ trang dữ liệu Nguon chọn định dạng Chung (General) rồi copy pase 123 toàn bộ trang tính lưu lại.Khi đó có thể lấy đủ dữ liệu côt E.Anh xem lại giúp
 
Upvote 0
Tôi đã thử nhưng tại sao vẫn không được nhỉ vùng dữ liệu vẫn bị trắng.
Tôi đã thử bằng cách chọn toàn bộ trang dữ liệu Nguon chọn định dạng Chung (General) rồi copy pase 123 toàn bộ trang tính lưu lại.Khi đó có thể lấy đủ dữ liệu côt E.Anh xem lại giúp
Tôi nghĩ ra rồi, khi dùng ADO với Excel nếu cột nào mà nó dò trong vòng 8 hàng đầu tiên mà không có dữ liệu, mặc nhiên nó hiểu cột đó không có gì và nó sẽ bỏ qua. Khắc phục bằng cách nếu kiểm tra dữ liệu gốc, thấy cột nào có hơn 8 hàng bị rỗng, thì điền gì đó vào hàng đầu tiên của cột đó (lưu ý, nếu cột đó dạng Text thì ghi bằng chữ, cột đó dạng Number thì ghi bằng số, trường hợp này là số trong định dạng chuỗi, nên ghi vào hàng đầu tiên là chữ).
 
Lần chỉnh sửa cuối:
Upvote 0
Chắc bạn ấy quên kéo thanh cuộn xuống để xem các dòng bên dưới...:D

Tôi nghĩ ra rồi, khi dùng ADO với Excel nếu cột nào mà nó dò trong vòng 8 hàng đầu tiên mà không có dữ liệu, mặc nhiên nó hiểu cột đó không có gì và nó sẽ bỏ qua. Khắc phục bằng cách nếu kiểm tra dữ liệu gốc, thấy cột nào có hơn 8 hàng bị rỗng, thì điền gì đó vào hàng đầu tiên của cột đó (lưu ý, nếu cột đó dạng Text thì ghi bằng chữ, cột đó dạng Number thì ghi bằng số, trường hợp này là số trong định dạng chuỗi, nên ghi vào hàng đầu tiên là chữ).
Vâng e hiểu rồi..cảm ơn bác chỉ bảo.Em đã thử phương pháp của bác kết quả là OK kể cả khi xóa đi dữ liệu thêm vào và lưu lại thì vẫn cho kết quả đúng,tức là vẫn phải tác động vào file nguồn.Ngoài phương pháp đó có thể khắc phục bằng phương pháp nào không phải tác động file Nguon hoặc code nào khác có thể mở ngầm lấy dữ liệu khộng ạ?
Mong bác và anh chị em tìm hiểu giúp.
Chúc bác và anh chị em diễn dàn có ngày nghỉ thoải mái vui vẻ!
 
Upvote 0
Vâng e hiểu rồi..cảm ơn bác chỉ bảo.Em đã thử phương pháp của bác kết quả là OK kể cả khi xóa đi dữ liệu thêm vào và lưu lại thì vẫn cho kết quả đúng,tức là vẫn phải tác động vào file nguồn.Ngoài phương pháp đó có thể khắc phục bằng phương pháp nào không phải tác động file Nguon hoặc code nào khác có thể mở ngầm lấy dữ liệu khộng ạ?
Mong bác và anh chị em tìm hiểu giúp.
Chúc bác và anh chị em diễn dàn có ngày nghỉ thoải mái vui vẻ!
Chỉ có cách dùng workbooks.open ...
Rồi đọc dữ liệu trực tiếp
Hoặc hiệu chỉnh cột E bằng code vba thay vì tay rồi đóng file save, sau đó đọc ADO
 
Upvote 0
Xin nhờ bạn chỉnh giúp câu lệnh trong mã code file đính kèm #1 giúp ạ..!
Theo mình thì khi mà chưa đủ sức thì hãy làm những việc nhẹ trước
Code vầy cũng lấy được dữ liệu rồi. Chú ý lưu file nguồn vào chung thư mục
Mã:
Sub Tong_Hop()
Dim sArr(),  FilePath As String
FilePath = ThisWorkbook.Path & "\DL_Nguon.xlsm" 'Chú ý câu lệnh này
With Workbooks.Open(FilePath, 0)
    With .Sheets("Data")
        sArr = .Range("A2", .Range("A" & Rows.Count).End(3).Resize(, 7)).Value
    End With
    .Close fasle
End With
With Sheets("TH")
    .Range("A2", .Range("A" & Rows.Count).End(3)).Resize(, 7).ClearContents
    .Range("A2").Resize(UBound(sArr), UBound(sArr, 2)) = sArr
End With
End Sub
 
Upvote 0
Xin nhờ bạn chỉnh giúp câu lệnh trong mã code file đính kèm #1 giúp ạ..!
Trường hợp này cũng không giải quyết cho bạn nếu dùng Cstr(F5) được. Giải pháp cho bạn đây:
Mình "lách luật" chút, bảng nguồn có tiêu đề nên khi lấy dữ liệu, ADO mình cho HDR=NO, sau đó mình quét dữ liệu từ ô A1 luôn, code chạy nó hiểu tiêu đề là một Record chứa dữ liệu nên nó "hốt" toàn bộ dữ liệu bên dưới. Sheet TH cho nó xóa từ hàng 1 đến 65536 (Excel 2003). Sau đó gán dữ liệu, nó sẽ bao gồm tiêu đề.

Mã:
Sub TongHop3()
    Dim cnn As Object, lsSQL As String, lrs As Object ', Fname
    Dim Fso As Object, Link As String ', shNameNguon, i As Long
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    'shNameNguon = Array("aaa")
    Application.ScreenUpdating = False

    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Filters.Add "Microsoft Excel Files", "*.xls; *.xlsx; *.xlsb; *.xlsm", 1
        If .Show = -1 Then
            Link = .InitialFileName
        Else
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
       
        'For Each Fname In .SelectedItems
         
            With cnn
                If Val(Application.Version) < 12 Then
                    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                                      & "Data Source=" & Fname & ";Extended Properties=""Excel 8.0;HDR=No;Imex=1"";"
                Else
           '    Fname = .SelectedItems
                    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                                      & "Data Source=" & Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) & ";Extended Properties=""Excel 12.0 Xml;HDR=No;Imex=1"";"
                End If
                .Open
           
            'For i = 0 To UBound(shNameNguon)
                lsSQL = "SELECT * FROM [DATA$A1:AG65536]"
                lrs.Open lsSQL, cnn, 3, 1
                Sheets("TH").Range("A1:AG65536").ClearContents
                Sheets("TH").Range("A1").CopyFromRecordset lrs
                lrs.Close
            'Next
            End With
        'Next
    End With
 
    Application.ScreenUpdating = True
    cnn.Close
    Set lrs = Nothing
    Set cnn = Nothing
End Sub

Tôi có một thắc mắc, tại sao không cho nó chạy ngầm luôn (cho đường dẫn cố định), mà mỗi lần chạy code mỗi lần chọn mở file?
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy kiểu dữ liệu đúng (chuẩn) nhất của cột D, E mà bạn muốn thiết kế bảng tính là kiểu gì? Tôi không nghĩ nó là kiểu Number.
Nó là kiểu số trong định dạng chuỗi (kiểu mã số, số hóa đơn, số vận đơn v.v...).
 
Upvote 0
Vâng đúng ạ..kiểu ký tự của tôi có thể là dạng định dạng chung cũng có thể là chuỗi ký tự tetx
Nó là kiểu số trong định dạng chuỗi (kiểu mã số, số hóa đơn, số vận đơn v.v...).
Vậy kiểu dữ liệu đúng (chuẩn) nhất của cột D, E mà bạn muốn thiết kế bảng tính là kiểu gì? Tôi không nghĩ nó là kiểu Number.
Lý do tôi sử dụng chạy ngầm là vì nếu sử dụng open wordbook có vấn đề ở chỗ file nguồn trích suất bởi một phần mềm trung gian..khi mở có cảnh báo cập nhật.và lỗi nữa có code tự đông..trường hợp lỗi code khi mở phải tắt lỗi file nguồn như phương pháp bác @Quang_Hải đưa ra rồi thực thi lại code.Còn mở bằng phương pháp ngầm sẽ không phải tác động gì file nguồn ạ
 
Upvote 0
Vâng đúng ạ..kiểu ký tự của tôi có thể là dạng định dạng chung cũng có thể là chuỗi ký tự tetx


Lý do tôi sử dụng chạy ngầm là vì nếu sử dụng open wordbook có vấn đề ở chỗ file nguồn trích suất bởi một phần mềm trung gian..khi mở có cảnh báo cập nhật.và lỗi nữa có code tự đông..trường hợp lỗi code khi mở phải tắt lỗi file nguồn như phương pháp bác @Quang_Hải đưa ra rồi thực thi lại code.Còn mở bằng phương pháp ngầm sẽ không phải tác động gì file nguồn ạ
Ở bài #14 tôi nghĩ đã giải quyết vấn đề của bạn rồi phải không?
 
Upvote 0
Ở bài #14 tôi nghĩ đã giải quyết vấn đề của bạn rồi phải không?
Vâng anh ..tôi trả lời câu hỏi phụ của anh ..tại sao phải sử dụng phương pháp mở ẩn ..ngoài ra nếu để HDR=No khi muốn lọc dữ liệu tại mệnh đề Where thay vì f1,f2,f3...sẽ phải nêu rõ tiêu đề đúng kg ạ
 
Upvote 0
Vâng anh ..tôi trả lời câu hỏi phụ của anh ..tại sao phải sử dụng phương pháp mở ẩn ..ngoài ra nếu để HDR=No khi muốn lọc dữ liệu tại mệnh đề Where thay vì f1,f2,f3...sẽ phải nêu rõ tiêu đề đúng kg ạ
F1, F2, ... Fn là tên gọi cột không được xác định tiêu đề, vì vậy bạn có thể dùng nó để xử lý dữ liệu theo điều kiện đặt ra. Nhưng với bài #14 mà tôi gọi là "lách luật", nó sẽ gặp khó khăn cho bạn nếu ORDER BY vì rất có thể tiêu đề của nó không còn nằm ở vị trí đầu tiên.
 
Upvote 0
Web KT
Back
Top Bottom