Gán dữ liệu từ mảng xuống Range bị thừa dòng không cần thiết và Vấn đề giới hạn Recordset khi sử dụng ADODB

Liên hệ QC

Đình Phán

Thành viên thường trực
Tham gia
23/11/10
Bài viết
232
Được thích
68
Giới tính
Nam
Nghề nghiệp
kt
Chào các anh, chị.

Hiện em có dữ liệu gần 300000 dòng. Với dữ liệu có số lượng lớn như này, em sử dụng ADODB để truy vấn dữ liệu thì không ra kết quả.
Em không rõ là ADODB (kết nối đến chính sheet khác trong cùng 1 workbook) cho phép số lượng là bao nhiêu bản ghi, nhưng với các dữ liệu ít thì truy vấn nhanh, kết quả chính xác. Nhưng dữ liệu lớn thì không cho kết quả
Sau đó em có chuyển qua Mảng để lọc dữ liệu, tuy nhiên lại gặp 1 vấn đề mới là Kết quả trả ra bị thừa thêm 01 dòng ở tận cuối.
Các anh, chị xem giúp em là sai ở chỗ nào ạ.
Em cảm ơn!

Capture.JPG

Mã:
Public Sub Search_Credit1()

Dim MyCnn As Object
Dim MyRs As Object
Dim MySQL As String
Dim iLastRow As Long
iLastRow = ThisWorkbook.Sheets("Data").Range("A" & Rows.Count).End(xlUp).Row
    
Set MyCnn = CreateObject("ADODB.Connection")
Set MyRs = CreateObject("ADODB.Recordset")
    'ConnectionString Excel *xlsb
    'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myBinaryExcel2007file.xlsb;Extended Properties="Excel 12.0;HDR=YES";
MyCnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES"";"

MySQL = "SELECT [Ma_Doi_Tuong],[Ngay_Thang],[So_Chung_Tu],[Dien_Giai],[User],[So_Tien] FROM [Credit$A:F] WHERE ([Ma_Doi_Tuong] = ""VN1"") ;"


MyRs.Open MySQL, MyCnn
Sheets("Data").Range("A" & iLastRow + 1).CopyFromRecordset MyRs


MyCnn.Close
Set MyRs = Nothing
Set MyCnn = Nothing

End Sub

Mã:
Sub Search_Credit_Arr1()
    Dim Arr(), Res(), i As Long, k As Long, a As Long
    Dim DongCuoi As Long
    
    With ThisWorkbook.Sheets("Credit")
        Arr = .Range("A1").CurrentRegion.Value
        ReDim Res(1 To UBound(Arr), 1 To 6)
        For i = 1 To UBound(Arr)
            If Arr(i, 1) = "VN1" Then
                k = k + 1
                For a = 1 To 6
                    Res(k, a) = Arr(i, a)
                Next a
            End If
        Next i
    End With
    DongCuoi = ThisWorkbook.Sheets("Data").Range("A" & Rows.Count).End(xlUp).Row
    ThisWorkbook.Sheets("Data").Range("A" & DongCuoi + 1).Resize(i, 6).Value = Res
End Sub
 

File đính kèm

  • aaaaaaaaaaaa.xlsb
    2.9 MB · Đọc: 13
Chào các anh, chị.
em có chuyển qua Mảng để lọc dữ liệu, tuy nhiên lại gặp 1 vấn đề mới là Kết quả trả ra bị thừa thêm 01 dòng ở tận cuối.
ThisWorkbook.Sheets("Data").Range("A" & DongCuoi + 1).Resize(i, 6).Value = Res
Bạn thử thay:
ThisWorkbook.Sheets("Data").Range("A" & DongCuoi + 1).Resize(i, 6).Value = Res
Thành:
ThisWorkbook.Sheets("Data").Range("A" & DongCuoi + 1).Resize(i-1, 6).Value = Res
Xem thế nào nhé.
 
Upvote 0
Hiện em có dữ liệu gần 300000 dòng. Với dữ liệu có số lượng lớn như này, em sử dụng ADODB để truy vấn dữ liệu thì không ra kết quả.
Em không rõ là ADODB (kết nối đến chính sheet khác trong cùng 1 workbook) cho phép số lượng là bao nhiêu bản ghi, nhưng với các dữ liệu ít thì truy vấn nhanh, kết quả chính xác. Nhưng dữ liệu lớn thì không cho kết quả

Mã:
Public Sub Search_Credit1()

...
MyCnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Macro;HDR=YES"";"

MySQL = "SELECT [Ma_Doi_Tuong],[Ngay_Thang],[So_Chung_Tu],[Dien_Giai],[User],[So_Tien] FROM [Credit$] WHERE [Ma_Doi_Tuong] = 'VN1'"


MyRs.Open MySQL, MyCnn
Sheets("Data").Range("A2").CopyFromRecordset MyRs


End Sub
Sửa lại code trên thì chạy ra kết quả bình thường nhé. Không có chuyện ADODB giới hạn số dòng mà chỉ là khả năng bộ nhớ chứa được bao nhiêu thôi.
 
Upvote 0
Bạn thử thay:

Thành:

Xem thế nào nhé.
Cảm ơn anh Hoàng Tuấn 868, đúng là những chi tiết nhỏ nhưng không có người chỉ điểm thì mất cả ngày không tìm ra lỗi, sửa xong tốc độ tăng đáng kể.
Bài đã được tự động gộp:

Sửa lại code trên thì chạy ra kết quả bình thường nhé. Không có chuyện ADODB giới hạn số dòng mà chỉ là khả năng bộ nhớ chứa được bao nhiêu thôi.
Cảm ơn anh Ongke0711,
Em có đọc qua chỗ connectionstring nhưng đang hiểu Excel 12.0 Macro là chỉ dành cho file *xlsm thôi.
Đồng thời FROM [Credit$] em đang hiểu là vùng tìm kiếm nhiều hơn về mặt Field so với [Credit$A:F] nhưng kết quả lại bình thường.
Em cần học hỏi thêm nhiều ạ.
 
Upvote 0
Upvote 0
Cảm ơn anh Hoàng Tuấn 868, đúng là những chi tiết nhỏ nhưng không có người chỉ điểm thì mất cả ngày không tìm ra lỗi, sửa xong tốc độ tăng đáng kể.
Tôi không hiểu tại sao sửa như bài #2 thì tốc độ tăng đáng kể? Và 1 chuyện nữa: bạn có thể giải thích tại sao chuyện sửa như thế lại có thể giải quyết vấn đề của bạn 1 cách hoàn hảo được?
 
Upvote 0
Tôi không hiểu tại sao sửa như bài #2 thì tốc độ tăng đáng kể?
Thì thớt đã nói code 1 có ra kết quả đâu. Như vậy code 2 dẫu có chạy thế nào cũng là "tốc độ tăng đáng kể".

Và 1 chuyện nữa: bạn có thể giải thích tại sao chuyện sửa như thế lại có thể giải quyết vấn đề của bạn 1 cách hoàn hảo được?
Dân GPE này đặt bặng vấn đề tốc độ. Như ở trên, có tốc độ tăng đáng kể là coi như hoàn hảo.

Dân thích rườm rà (thay vì bấm một phát) như tôi thì dùng Advanced Filter. Tốc độ chắc chắn là "không bì lại mảng" rồi, khỏi cần đo.
 
Upvote 0
et MyCnn = CreateObject("ADODB.Connectio
Chào các anh, chị.

Hiện em có dữ liệu gần 300000 dòng. Với dữ liệu có số lượng lớn như này, em sử dụng ADODB để truy vấn dữ liệu thì không ra kết quả.
Em không rõ là ADODB (kết nối đến chính sheet khác trong cùng 1 workbook) cho phép số lượng là bao nhiêu bản ghi, nhưng với các dữ liệu ít thì truy vấn nhanh, kết quả chính xác. Nhưng dữ liệu lớn thì không cho kết quả
Sau đó em có chuyển qua Mảng để lọc dữ liệu, tuy nhiên lại gặp 1 vấn đề mới là Kết quả trả ra bị thừa thêm 01 dòng ở tận cuối.
Các anh, chị xem giúp em là sai ở chỗ nào ạ.
Em cảm ơn!

View attachment 289085

Mã:
Public Sub Search_Credit1()

Dim MyCnn As Object
Dim MyRs As Object
Dim MySQL As String
Dim iLastRow As Long
iLastRow = ThisWorkbook.Sheets("Data").Range("A" & Rows.Count).End(xlUp).Row
 
Set MyCnn = CreateObject("ADODB.Connection")
Set MyRs = CreateObject("ADODB.Recordset")
    'ConnectionString Excel *xlsb
    'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myBinaryExcel2007file.xlsb;Extended Properties="Excel 12.0;HDR=YES";
MyCnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=YES"";"

MySQL = "SELECT [Ma_Doi_Tuong],[Ngay_Thang],[So_Chung_Tu],[Dien_Giai],[User],[So_Tien] FROM [Credit$A:F] WHERE ([Ma_Doi_Tuong] = ""VN1"") ;"


MyRs.Open MySQL, MyCnn
Sheets("Data").Range("A" & iLastRow + 1).CopyFromRecordset MyRs


MyCnn.Close
Set MyRs = Nothing
Set MyCnn = Nothing

End Sub

Mã:
Sub Search_Credit_Arr1()
    Dim Arr(), Res(), i As Long, k As Long, a As Long
    Dim DongCuoi As Long
 
    With ThisWorkbook.Sheets("Credit")
        Arr = .Range("A1").CurrentRegion.Value
        ReDim Res(1 To UBound(Arr), 1 To 6)
        For i = 1 To UBound(Arr)
            If Arr(i, 1) = "VN1" Then
                k = k + 1
                For a = 1 To 6
                    Res(k, a) = Arr(i, a)
                Next a
            End If
        Next i
    End With
    DongCuoi = ThisWorkbook.Sheets("Data").Range("A" & Rows.Count).End(xlUp).Row
    ThisWorkbook.Sheets("Data").Range("A" & DongCuoi + 1).Resize(i, 6).Value = Res
End Sub
Option Explicit

Sub BaoCao()
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim ws_Credit, ws_Data As Worksheet
Dim Source, SQL_Command As String

Set ws_Credit = ThisWorkbook.Worksheets(SHEET_Credit)
Set ws_Data = ThisWorkbook.Worksheets(SHEET_Data)

Source = ThisWorkbook.FullName

SQL_Command = "SELECT * " & _
"FROM [Credit$] " & _
"WHERE [Ma_Doi_Tuong] = 'VN1' "
SQL_QUERY Source, SQL_Command, SHEET_Data, "A1"

Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

SQL bạn viết code sai rồi
 

File đính kèm

  • aaaaaaaaaaaa.xlsm
    9 MB · Đọc: 9
Upvote 0
Tôi không hiểu tại sao sửa như bài #2 thì tốc độ tăng đáng kể? Và 1 chuyện nữa: bạn có thể giải thích tại sao chuyện sửa như thế lại có thể giải quyết vấn đề của bạn 1 cách hoàn hảo được?
Là thế này ạ.

Nếu em để là Resize(i, 6) thì nó ra kết quả, nhưng xuất hiện dòng thừa #N/A ở tận dưới cùng (bằng với số dòng của sheet Credit) em có ảnh đính kèm ở bài #1, đồng thời nó quay quay mãi mới ra kết quả. Nhưng thay bằng Resize(i-1, 6) hoặc Resize(k, 6) thì ra kết quả nhanh.
 
Upvote 0
Web KT
Back
Top Bottom