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
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.
Vâng cảm ơn anh đúng là vậy phương pháp lách luật của a cũng là một phương pháp hay để tránh 8 dòng trống đầu tiên...nếu không còn phương pháp khác thì thực cảm ơn bác và anh chị e đã tận tình chỉ bảo.
Trươc e có đọc một bài của bác Hai lúa liên quan đến mở ẩn đưa dữ liệu hoặc chỉnh sửa file nguồn bằng cách định dạng cột E rồi lấy dữ liệu ..nhưng do hiểu biết còn hạn hẹp chưa thể tự sửa được code theo ý.!
 
Lần chỉnh sửa cuối:
Upvote 0
nếu không còn phương pháp khác thì thực cảm ơn bác và anh chị e đã tận tình chỉ bảo.
Trươc e có đọc một bài của bác Hai lúa liên quan đến mở ẩn đưa dữ liệu hoặc chỉnh sửa file nguồn bằng cách định dạng cột E rồi lấy dữ liệu ..nhưng do hiểu biết còn hạn hẹp chưa thể tự sửa được code theo ý.!
Dùng ADO lấy dữ liệu Excel nó vẫn còn nhiều hạn chế do đó phải chấp nhận có sự điều chỉnh hoặc dùng phương pháp khác.
Nếu bạn muốn dùng ADO cho Excel, khi gặp file Excel có cột rỗng thì"
- Lấy luôn dòng tiêu đề (như bạn @Hoàng Trọng Nghĩa đã hướng dẫn để ADO nhận dạng là cột Text.
- Mở file nguồn, định chọn định dạng cho từng cột theo yêu cầu (bấm chọn hết cột - Format - chọn Text là được rồi, không cần gõ ký tự mẫu)
Nếu dùng ADO cho file Text thì sẽ dễ dàng hơn trong việc định dạng cột là chỉ cần thêm 1 file text Shema.ini để lưu thông tin kiểu định dạng cho từng cột và ADO tự tìm và đọc file này để lấy dữ liệu chính xác kiểu định dạng vào Recordset.
Do đó nếu được thì tốt nhất bạn nói bên phần mềm xuất ra file Text (.txt, .csv) để để lấy dữ liệu hơn và nhẹ hơn nhiều so với định dạng Excel.
 
Upvote 0
Dùng ADO lấy dữ liệu Excel nó vẫn còn nhiều hạn chế do đó phải chấp nhận có sự điều chỉnh hoặc dùng phương pháp khác.
Nếu bạn muốn dùng ADO cho Excel, khi gặp file Excel có cột rỗng thì"
- Lấy luôn dòng tiêu đề (như bạn @Hoàng Trọng Nghĩa đã hướng dẫn để ADO nhận dạng là cột Text.
- Mở file nguồn, định chọn định dạng cho từng cột theo yêu cầu (bấm chọn hết cột - Format - chọn Text là được rồi, không cần gõ ký tự mẫu)
Nếu dùng ADO cho file Text thì sẽ dễ dàng hơn trong việc định dạng cột là chỉ cần thêm 1 file text Shema.ini để lưu thông tin kiểu định dạng cho từng cột và ADO tự tìm và đọc file này để lấy dữ liệu chính xác kiểu định dạng vào Recordset.
Do đó nếu được thì tốt nhất bạn nói bên phần mềm xuất ra file Text (.txt, .csv) để để lấy dữ liệu hơn và nhẹ hơn nhiều so với định dạng
Vâng tôi hiểu rồi ạ..Xin cảm anh chị em đã chỉ bảo!
 
Upvote 0
Dùng ADO lấy dữ liệu Excel nó vẫn còn nhiều hạn chế do đó phải chấp nhận có sự điều chỉnh hoặc dùng phương pháp khác.
Nếu bạn muốn dùng ADO cho Excel, khi gặp file Excel có cột rỗng thì"
- Lấy luôn dòng tiêu đề (như bạn @Hoàng Trọng Nghĩa đã hướng dẫn để ADO nhận dạng là cột Text.
- Mở file nguồn, định chọn định dạng cho từng cột theo yêu cầu (bấm chọn hết cột - Format - chọn Text là được rồi, không cần gõ ký tự mẫu)
Nếu dùng ADO cho file Text thì sẽ dễ dàng hơn trong việc định dạng cột là chỉ cần thêm 1 file text Shema.ini để lưu thông tin kiểu định dạng cho từng cột và ADO tự tìm và đọc file này để lấy dữ liệu chính xác kiểu định dạng vào Recordset.
Do đó nếu được thì tốt nhất bạn nói bên phần mềm xuất ra file Text (.txt, .csv) để để lấy dữ liệu hơn và nhẹ hơn nhiều so với định dạng
Vâng tôi hiểu rồi ạ..Xin hỏi bạn và anh chị em một vấn đề cuối.
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
Nhờ bác @Quang_Hải xem giúp.Với code trên khi đến dòng lệnh mỏ file nguồn(Workbooks.Open) file nguồn được mở lên và hiện cảnh báo lỗi code như hình dưới.Vậy mình phải sử dụng câu lệnh gì để bỏ qua lỗi đó thay vì phải bấm END để đồng thời mở 2 file rồi thực thi lại code trên mới lấy được dữ liệu ạ!
 

File đính kèm

  • Screenshot 2024-04-30 171015.png
    Screenshot 2024-04-30 171015.png
    52.1 KB · Đọc: 9
Upvote 0
Vâng tôi hiểu rồi ạ..Xin hỏi bạn và anh chị em một vấn đề cuối.

Nhờ bác @Quang_Hải xem giúp.Với code trên khi đến dòng lệnh mỏ file nguồn(Workbooks.Open) file nguồn được mở lên và hiện cảnh báo lỗi code như hình dưới.Vậy mình phải sử dụng câu lệnh gì để bỏ qua lỗi đó thay vì phải bấm END để đồng thời mở 2 file rồi thực thi lại code trên mới lấy được dữ liệu ạ!
Trong câu lệnh này dưới đây trong thủ tục đó:

sArr = .Range("A2", .Range("A" & Rows.Count).End(3).Resize(, 7)).Value
.Range("A2", .Range("A" & Rows.Count).End(3)).Resize(, 7).ClearContents

Bạn thử thêm dấu chấm (.) tại Rows.Count xem thế nào:

sArr = .Range("A2", .Range("A" & .Rows.Count).End(3).Resize(, 7)).Value

.Range("A2", .Range("A" & .Rows.Count).End(3)).Resize(, 7).ClearContents
 
Upvote 0
Trong câu lệnh này dưới đây trong thủ tục đó:

sArr = .Range("A2", .Range("A" & Rows.Count).End(3).Resize(, 7)).Value
.Range("A2", .Range("A" & Rows.Count).End(3)).Resize(, 7).ClearContents

Bạn thử thêm dấu chấm (.) tại Rows.Count xem thế nào:

sArr = .Range("A2", .Range("A" & .Rows.Count).End(3).Resize(, 7)).Value

.Range("A2", .Range("A" & .Rows.Count).End(3)).Resize(, 7).ClearContents
Cảm ơn anh tôi đã thử nhưng không có kết quả.Bảng thông báo đó là lỗi của File nguồn khi được kích hoạt mở,tự chạy code chứ không phải lỗi code thực thi.Tôi muốn nhờ đặt câu lệnh để ngăn không cho file nguồn mở lên chạy code..Tôi gửi file cả nhà mình xem giúp.
 

File đính kèm

  • DL_DATA.xlsm
    60.3 KB · Đọc: 3
  • Nguon.xlsm
    78.9 KB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh tôi đã thử nhưng không có kết quả.Bảng thông báo đó là lỗi của File nguồn khi được kích hoạt mở,tự chạy code chứ không phải lỗi code thực thi.Tôi muốn nhờ đặt câu lệnh để ngăn không cho file nguồn mở lên chạy code..Tôi gửi file cả nhà mình xem giúp.
Lỗi do code của file nguồn chứ liên quan gì đến code của Quang Hải đâu bạn?
 
Upvote 0
Bạn xuất file ở dạng xlsx, csv ấy. Sao lại chọn xlsm làm gì.
Mở file ở dạng read only, ignore mọi thứ...
Từ excel 2007 dữ liệu được lưu ở tập tin xml. Vậy lôi cổ cái tập tin xml đó ra để lấy dữ liệu thôi.
 
Upvote 0
Upvote 0
C
Bạn xuất file ở dạng xlsx, csv ấy. Sao lại chọn xlsm làm gì.
Mở file ở dạng read only, ignore mọi thứ...
Từ excel 2007 dữ liệu được lưu ở tập tin xml. Vậy lôi cổ cái tập tin xml đó ra để lấy dữ liệu thôi.
Cảm ơn bạn đã quan tâm..bản chất file nguồn được xuất bằng phần mềm tự động của công ty luôn chứa mã code để chạy các định dạng khác trong file nên mới sảy ra lỗi như trên..
 
Upvote 0
Vâng ạ..tôi vẫn giải thích là lỗi file nguồn nên muốn nhờ đặt câu lệnh trong đoạn code Quang Hải để bỏ qua báo lỗi đó và tiếp tục thực thi code lấy dữ liệu ạ
Có nhiều cách, nhưng bạn thử cách đơn giản nhất là copy đoạn code này vào xem:

Sub Tong_Hop()
On Error Resume Next
 
Upvote 0
Có nhiều cách, nhưng bạn thử cách đơn giản nhất là copy đoạn code này vào xem:

Sub Tong_Hop()
On Error Resume Next
Phương pháp này hình như không có tác dụng tôi cũng đã nghĩ đến và đã thử..bởi khi code nguồn kích hoạt thì code thực thi bị ngắt kg hoạt động
 
Upvote 0
Phương pháp này hình như không có tác dụng tôi cũng đã nghĩ đến và đã thử..bởi khi code nguồn kích hoạt thì code thực thi bị ngắt kg hoạt động
Gán câu lệnh đó trong code sheet Nguon xem sao.

Public Sub pFomulaCopy(ows As Worksheet)
On Error Resume Next
 
Upvote 0
Code lỗi thì ngay khi compile lăn ra ngỏm rồi.
On error resume next làm gì có tác dụng gì.
 
Upvote 0
Vâng tôi hiểu rồi ạ..Xin hỏi bạn và anh chị em một vấn đề cuối.

Nhờ bác @Quang_Hải xem giúp.Với code trên khi đến dòng lệnh mỏ file nguồn(Workbooks.Open) file nguồn được mở lên và hiện cảnh báo lỗi code như hình dưới.Vậy mình phải sử dụng câu lệnh gì để bỏ qua lỗi đó thay vì phải bấm END để đồng thời mở 2 file rồi thực thi lại code trên mới lấy được dữ liệu ạ!
Hình như sự việc cũng không ghê gớm lắm đâu
Mã:
Sub Tong_Hop()
Application.EnableEvents = False 'câu lệnh này sẽ chặn sự kiện của file nguồn
Dim sArr(), i As Long, FilePath As String
FilePath = ThisWorkbook.Path & "\DL_Nguon.xlsm"
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
Application.EnableEvents = True
End Sub
 
Upvote 0
Hình như sự việc cũng không ghê gớm lắm đâu
Mã:
Sub Tong_Hop()
Application.EnableEvents = False 'câu lệnh này sẽ chặn sự kiện của file nguồn
Dim sArr(), i As Long, FilePath As String
FilePath = ThisWorkbook.Path & "\DL_Nguon.xlsm"
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
Application.EnableEvents = True
End Sub
Đúng là không ghê gớm đối với nhiều người ghê gớm như các bác...
Em xin cảm ơn sự nhiệt tình giải đáp của bác @Hoàng Trọng Nghĩa,bác @Quang_Hải chúc các bác luôn mạnh khỏe công tác tốt..!
 
Upvote 0
Web KT
Back
Top Bottom