Khai thác và tùy biến thêm, sửa, xuất file và lấy dữ liệu từ Recordset

Liên hệ QC
Bạn mượn bài của anh @ongke0711 thêm cáu Array(2,3,5) vô
Bài đã được tự động gộp:

Mã:
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName, 1, 1
        .Move .RecordCount - 5
        ArrData = Application.Transpose(.GetRows(, , Array(1, 2, 4)))
        Sheet2.Cells(1).Resize(UBound(ArrData), UBound(ArrData, 2)).Value = ArrData
    End With
Chị gái hay quá!
 
Bạn mượn bài của anh @ongke0711 thêm cáu Array(2,3,5) vô
Bài đã được tự động gộp:

Mã:
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName, 1, 1
        .Move .RecordCount - 5
        ArrData = Application.Transpose(.GetRows(, , Array(1, 2, 4)))
        Sheet2.Cells(1).Resize(UBound(ArrData), UBound(ArrData, 2)).Value = ArrData
    End With
OT thử code này thì bị lỗi tại dòng.
ArrData = Application.Transpose(.GetRows(, , Array(1, 2, 4)))
Tên lỗi là:
Item cannot be found in the collection corresponding to the requested name or ordinal.
 
OT thử code này thì bị lỗi tại dòng.
ArrData = Application.Transpose(.GetRows(, , Array(1, 2, 4)))
Tên lỗi là:
Item cannot be found in the collection corresponding to the requested name or ordinal.
Không biết chị đã thêm dữ liệu vào sheet1 hay chưa
 
OT thử code này thì bị lỗi tại dòng.
ArrData = Application.Transpose(.GetRows(, , Array(1, 2, 4)))
Tên lỗi là:
Item cannot be found in the collection corresponding to the requested name or ordinal.
Lỗi này xảy ra khi Fields không có trong bảng truy cập. Bạn kiểm tra lại trên Sheet bạn có bao nhiêu cột.
Mãng ADO bắt đầu tính từ 0 nhé ví dụ 5 cột là từ 0,1,2,3,4,
 
Thường thì em dùng như thế này.
PHP:
  Set cn = New ADODB.Connection
  cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDb & ";"
  Set rs = New ADODB.Recordset
 With rs
    .Open "SELECT ***** WHERE **** ", cn, , , adCmdText
    .MoveFirst
 End With
Sau đó thì tùy biến đưa ra các thông tin như :
PHP:
rs.Fields.Count
Rồi sau em mới
PHP:
.CopyFromRecordset rs
 
Thường thì em dùng như thế này.
PHP:
  Set cn = New ADODB.Connection
  cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDb & ";"
  Set rs = New ADODB.Recordset
With rs
    .Open "SELECT ***** WHERE **** ", cn, , , adCmdText
    .MoveFirst
End With
Sau đó thì tùy biến đưa ra các thông tin như :
PHP:
rs.Fields.Count
Rồi sau em mới
PHP:
.CopyFromRecordset rs
Đang nói đến xử lý Recordset nhé bạn, có nghĩa là với lý do nào đó mà ta muốn xử lý dữ liệu sau khi đã truy vấn.
Nhưng bàn chút, bạn ghi.
PHP:
.MoveFirst
Nếu chỉ đơn thuần là lấy dữ liệu ra sheet hoặc đếm số cột thì có cần?
 
Đang nói đến xử lý Recordset nhé bạn, có nghĩa là với lý do nào đó mà ta muốn xử lý dữ liệu sau khi đã truy vấn.
Nhưng bàn chút, bạn ghi.
PHP:
.MoveFirst
Nếu chỉ đơn thuần là lấy dữ liệu ra sheet hoặc đếm số cột thì có cần?
Thêm tên cột có vòng lặp gì không anh ơi, gợi ý chút xíu với
 
Vòng lặp hay không vòng lặp đều được bạn nhé. Vì trường hợp này chỉ có 2 cột.
Làm đại chứ em nghĩ ý anh không phải vậy:
Mã:
With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName, 1, 1
        .Move .RecordCount - 5
        Sheet2.Range("A1") = .Fields(0).Name: Sheet2.Range("B1") = .Fields(1).Name
        Sheet2.Range("A2").CopyFromRecordset .DataSource, 5, 2
End With
 
Mã:
Sub LaydulieuWithSever()
    Dim cnn As ConnectionDataHub
    Dim myRst  As Object
On Error GoTo ErrorProcess
    
    Application.ScreenUpdating = False
    If isconnect Then GoTo EndSub
    Set cnn = appClient.OpenConnection("D:\SampleData - Copy.accdb")
    Range("A5:L1000").ClearContents
    Set myRst = cnn.GetdataServer("SELECT * FROM Data")
    'myRst.MoveFirst
    For i = 0 To myRst.Fields.Count - 1
        Cells(5, 1 + i).Value = myRst.Fields(i).Name
    Next i
    Range("A6").CopyFromRecordset myRst
    
GoTo EndSub
ErrorProcess:
    MsgBox Err.Number & ": " & Err.Description
EndSub:

Set myRst = Nothing
Set cnn = Nothing

Application.ScreenUpdating = True
End Sub

Chuẩn bị ra lò đây anh ;)
 
Làm đại chứ em nghĩ ý anh không phải vậy:
Mã:
With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName, 1, 1
        .Move .RecordCount - 5
        Sheet2.Range("A1") = .Fields(0).Name: Sheet2.Range("B1") = .Fields(1).Name
        Sheet2.Range("A2").CopyFromRecordset .DataSource, 5, 2
End With
Đúng là thế, từ những cái đơn giản để người mới có thể hiểu và vận dụng một cách dễ dàng vào bài toán của riêng mình.
 
Mã:
Sub LaydulieuWithSever()
    Dim cnn As ConnectionDataHub
    Dim myRst  As Object
On Error GoTo ErrorProcess
   
    Application.ScreenUpdating = False
    If isconnect Then GoTo EndSub
    Set cnn = appClient.OpenConnection("D:\SampleData - Copy.accdb")
    Range("A5:L1000").ClearContents
    Set myRst = cnn.GetdataServer("SELECT * FROM Data")
    'myRst.MoveFirst
    For i = 0 To myRst.Fields.Count - 1
        Cells(5, 1 + i).Value = myRst.Fields(i).Name
    Next i
    Range("A6").CopyFromRecordset myRst
   
GoTo EndSub
ErrorProcess:
    MsgBox Err.Number & ": " & Err.Description
EndSub:

Set myRst = Nothing
Set cnn = Nothing

Application.ScreenUpdating = True
End Sub

Chuẩn bị ra lò đây anh ;)
Chúc mừng em. Khi nào "ra lò" nhớ mở tiệc mừng nhé.
 
Web KT
Back
Top Bottom