Lỗi tạo bảng dữ liệu/ mở recordset trong ADO (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

hvnhpro

Thành viên hoạt động
Tham gia
3/3/11
Bài viết
163
Được thích
92
Giới tính
Nam
Xin chào các Anh/Chị trong diễn đàn GPE,
Em đang tập tành học ADO để phục vụ cho công việc, em có nhờ Chat GPT tạo code nhưng khi áp dụng vào thì bị lỗi.

Nếu trường dữ liệu ở sheet "TT35" là A3: D57198 và sheet2 là D3:H58579 thì code chạy ngon,
nhưng nếu mở rộng dữ liệu, tăng số lượng dòng lên, cụ thể là sheet "TT35" lên A3: D657198 và sheet2 là D3:H658579 thì code báo lỗi khi mở recordset như hình đính kèm.
Do ở công ty không cho phép tải file lên, nên nếu cần file mẫu thì tối về em sẽ giả lập đính kèm lên ạ.
Nhờ Anh/ Chị GPE xem sửa lỗi giúp em với.
Em xin cảm ơn.
1732503526704.png

Mã:
Sub CompareAmounts()
    Dim conn As Object
    Dim rs As Object
    Dim sql As String
    Dim ws As Worksheet
    Dim lastRow As Long

    ' Tao ket noi ADO
    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    conn.Open
    If Err.Number <> 0 Then
        MsgBox "Loi khi mat ket noi: " & Err.Description
        Exit Sub
    End If
    On Error GoTo 0

    ' Truy van SQL de so sanh amount_fcy tu hai sheet
    sql = "SELECT TT35.contract_no, TT35.amount_fcy AS Amount_TT35, Sheet2.AMOUNT_FCY AS Amount_Sheet2 " & _
          "FROM [TT35$A3:D657198] AS TT35 " & _
          "LEFT JOIN [Sheet2$D3:H658579] AS Sheet2 " & _
          "ON TT35.contract_no = Sheet2.CONTRACT_NO"

    ' Mo recordset
    Set rs = CreateObject("ADODB.Recordset")
    On Error Resume Next
    rs.Open sql, conn, 1, 1
    If Err.Number <> 0 Then
        MsgBox "Loi khi mo recordset: " & Err.Description

---dang bi loi o day a**

        conn.Close
        Set conn = Nothing
        Exit Sub
    End If
    On Error GoTo 0

    ' Tao bang ket qua tren mot sheet moi
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets("Comparison")
    On Error GoTo 0
    If ws Is Nothing Then
        Set ws = ThisWorkbook.Sheets.Add
        ws.Name = "Comparison"
    End If

    ' Dat Tieu de cho bang ket qua
    ws.Cells(1, 1).Value = "contract_no"
    ws.Cells(1, 2).Value = "Amount_TT35"
    ws.Cells(1, 3).Value = "Amount_Sheet2"

    ' Dien du lieu tu recordset vào bang
    lastRow = 2
    Do While Not rs.EOF
        ws.Cells(lastRow, 1).Value = rs.Fields("contract_no").Value
        ws.Cells(lastRow, 2).Value = rs.Fields("Amount_TT35").Value
        ws.Cells(lastRow, 3).Value = rs.Fields("Amount_Sheet2").Value
        rs.MoveNext
        lastRow = lastRow + 1
    Loop

    ' Dong ket noi và recordset
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
End Sub
 
Nếu trường dữ liệu ở sheet "TT35" là A3: D57198 và sheet2 là D3:H58579 thì code chạy ngon,
nhưng nếu mở rộng dữ liệu, tăng số lượng dòng lên, cụ thể là sheet "TT35" lên A3: D657198 và sheet2 là D3:H658579 thì code báo lỗi khi mở recordset như hình đính kèm.
Bạn dùng CursorLocation = adUseClient (3) và CursorType = adOpenStatic (3) hoặc adOpenForwardOnly(0) xem thử.
 
Cảm ơn Anh đã gợi ý. Để em tìm tòi và áp dụng lại xem sao.
Nếu bạn thường xuyên sử dụng bảng tính Excel để lưu và xử lý dữ liệu thì nên dùng cái tool nào nó phù hơn với Excel như: Power Query, Data model, Dax...để xử lý số lượng dòng dữ liệu lớn.
Tôi thường dùng ADODB để lấy dữ liệu từ SQL Server nhưng chỉ là gửi lệnh cho SQV server chạy các stored procedure, hàm, view trên máy chủ rồi ADO chỉ việc lấy dữ liệu về thôi chứ không gửi câu lệnh truy vấn trực tiếp như vậy.
 
cụ thể là sheet "TT35" lên A3: D657198 và sheet2 là D3:H658579
Bạn thử sửa vùng dữ liệu trên thành A3 : D cho sheet TT35 và D3 : H cho Sheet2 thử rồi báo kết quả xem sao nhé.
Mã:
"FROM [TT35$A3:D] AS TT35 " & _

          "LEFT JOIN [Sheet2$D3:H] AS Sheet2 " & _
 
cụ thể là sheet "TT35" lên A3: D657198 và sheet2 là D3:H658579
Bạn thử sửa vùng dữ liệu trên thành A3 : D cho sheet TT35 và D3 : H cho Sheet2 thử rồi báo kết quả xem sao nhé.
Mã:
"FROM [TT35$A3:D] AS TT35 " & _

          "LEFT JOIN [Sheet2$D3:H] AS Sheet2 " & _
Em cảm ơn Anh Hai Lúa Miền Tây ạ
E sửa và code chạy được rồi ạ. Thật thần kỳ.
 
Nếu bạn thường xuyên sử dụng bảng tính Excel để lưu và xử lý dữ liệu thì nên dùng cái tool nào nó phù hơn với Excel như: Power Query, Data model, Dax...để xử lý số lượng dòng dữ liệu lớn.
Tôi thường dùng ADODB để lấy dữ liệu từ SQL Server nhưng chỉ là gửi lệnh cho SQV server chạy các stored procedure, hàm, view trên máy chủ rồi ADO chỉ việc lấy dữ liệu về thôi chứ không gửi câu lệnh truy vấn trực tiếp như vậy.
Dạ đúng như Anh nói là dữ liệu lớn thì nên dùng tool khác sẽ phù hợp hơn. Cơ quan có xài SQL server để xử lý các trường hợp phát sinh thường xuyên.
Trường hợp này của em là thỉnh thoảng có việc so sánh 2 bảng ở các Phòng khác gửi hay phần mềm khác nhau lấy xuống. Em hay dùng 1 công cụ Anh chia sẻ trên GPE để upload dữ liệu lên SQL server, nhưng sau này tìm hiểu thềm về ADO thì e thấy khâu upload lên server hơi mất thời gian. Nên em đang tìm cách xử lý luôn trên excel bằng ADO để xem có rút gọn thời gian được không ạ.
 
Sau khi áp dụng và tìm lại hiểu lại trên google thì em thấy file bản excel 2016 em đang xài, nếu dùng ADO sẽ bị giới hạn số lượng dòng là 65.536.
Thôi em lại tìm sang nghiên cứu cách khác theo các tool gợi ý của Anh Ongke0711 ở trên vậy.
 
Web KT

Bài viết mới nhất

Back
Top Bottom