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ài 13 viết lại sơ bộ như sau thấy hay mà vui đấy .... HLMT = số 1 he -0-0-0-

Mã:
Sub GetRs(ByVal dongdau As Long, ByVal dongcuoi As Long)
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move dongdau
        Sheet2.Range("A2").CopyFromRecordset .DataSource, dongcuoi
    End With
End Sub

Sub Main()
    Call GetRs(29, 70)
End Sub
trời còn cái tham số Range A2 để đi đâu ? sao khong truyền luôn
 
bài 13 viết lại sơ bộ như sau thấy hay mà vui đấy .... HLMT = số 1 he -0-0-0-

Mã:
Sub GetRs(ByVal dongdau As Long, ByVal dongcuoi As Long)
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move dongdau
        Sheet2.Range("A2").CopyFromRecordset .DataSource, dongcuoi
    End With
End Sub

Sub Main()
    Call GetRs(29, 70)
End Sub
Tùy biến sử dụng thôi anh. Thêm ít nhất 3 tham số nữa là cái đường dẫn đến file nguồn, câu lệnh truy vấn và vùng đổ dữ liệu.
 
bài 13 viết lại sơ bộ như sau thấy hay mà vui đấy .... HLMT = số 1 he -0-0-0-

Mã:
Sub GetRs(ByVal dongdau As Long, ByVal dongcuoi As Long)
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move dongdau
        Sheet2.Range("A2").CopyFromRecordset .DataSource, dongcuoi
    End With
End Sub

Sub Main()
    Call GetRs(29, 70)
End Sub
Anh lưu ý thêm là cái tham số dòng đầu nó bắt đầu từ 0 nhé. Do vậy để cho người dùng khỏi bỡ ngỡ anh nên xử lý nó trong hàm luôn.
 
Đừng nói thế anh ngại lắm em, chỉ biết thế nào chia sẻ thế ấy thôi. Anh nghĩ không ít người biết nhưng họ chưa có cơ hội chia sẻ thôi.
Em biết mà, trên diễn đàn nhiều người giỏi lắm có người về phân tích CSDL, có người giỏi về hệ thống..... mà chắc máy ảnh bận nên ít comment
 
Vậy cho ví dụ thực tiễn luôn cho mọi người học hỏi bác Hai Lúa ơi!
Gửi ví dụ dưới đây luôn, code dựa vào file mẫu bài 1. Ví dụ tôi lấy ví dụ là 17 dòng cho mỗi sheet, đổ khi nào hết thì thôi. Tùy biến sử dụng với dữ liệu lấy theo ý nhé.

Mã:
Sub LayDL_HLMT_2()
    Dim sht As Worksheet
    Dim SoSheet As Integer
    Const SoDong = 17
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        While Not .EOF
            SoSheet = SoSheet + 1
            Set sht = Worksheets.Add
            sht.Range("A1") = "Sheet: " & SoSheet
            sht.Name = "Sheet_" & SoSheet
            sht.Range("A2").CopyFromRecordset .DataSource, SoDong
        Wend
    End With
End Sub
 
Gửi ví dụ dưới đây luôn, code dựa vào file mẫu bài 1. Ví dụ tôi lấy ví dụ là 17 dòng cho mỗi sheet, đổ khi nào hết thì thôi. Tùy biến sử dụng với dữ liệu lấy theo ý nhé.

Mã:
Sub LayDL_HLMT_2()
    Dim sht As Worksheet
    Dim SoSheet As Integer
    Const SoDong = 17
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        While Not .EOF
            SoSheet = SoSheet + 1
            Set sht = Worksheets.Add
            sht.Range("A1") = "Sheet: " & SoSheet
            sht.Name = "Sheet_" & SoSheet
            sht.Range("A2").CopyFromRecordset .DataSource, SoDong
        Wend
    End With
End Sub
Cái .EOF và BOF đọc microsoft mà em chưa hiểu lắm, nhờ bác nói rõ cái này hơn tí được không?
1604980696073.png
 
Thêm nữa,anh Hai lúa cho em hỏi, như bài #13 em thấy ".move 29" mới lấy được dữ liêu từ 30 trở đi. Sao ở bài #28 này lại không thấy mà vẫn lấy đúng thứ tự ạ
 
Thông thường ta lấy dữ liệu từ Recordset đổ tất cả dữ liệu vào 1 địa chỉ nào đó bằng cách sau:

Rich (BB code):
Sub LayDL_HLMT()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select * from [Sheet1$]")
    End With
End Sub
Nhưng ta có thể có những tùy chọn để lấy dữ liệu theo ý. Ví dụ như lấy dữ liệu từng trang với số dòng quy định trước, và còn nhiều cái mà ta chưa khai thác đến. Vậy hôm nay tôi quyết định mở đề tài này để mọi người cùng nhau chia sẻ và thảo luận.
Lấy dữ liệu có hoặc không có tiêu đề thì ghi sao Sếp?
 
Cái .EOF và BOF đọc microsoft mà em chưa hiểu lắm, nhờ bác nói rõ cái này hơn tí được không?
View attachment 249000
Bạn đọc Bài này để tìm hiểu thêm
Thêm nữa,anh Hai lúa cho em hỏi, như bài #13 em thấy ".move 29" mới lấy được dữ liêu từ 30 trở đi. Sao ở bài #28 này lại không thấy mà vẫn lấy đúng thứ tự ạ

Khác nhau nhe bạn
 
Thiệt là em hỏng có hiểu cái ẩn ý của Sư Phụ luôn.
Có lẽ ý của Thầy là làm thêm cái lựa chọn, nếu muốn lấy dòng tiêu đề hoặc không muốn lấy thì code viết sao ấy anh Hai Lúa , nếu không phải ý của Thầy muốn vậy thì OT muốn vậy thì code sẽ viết thế nào vậy anh, phiền anh chỉ thêm ạ.
Cảm ơn anh Hai Lúa.
 
Có lẽ ý của Thầy là làm thêm cái lựa chọn, nếu muốn lấy dòng tiêu đề hoặc không muốn lấy thì code viết sao ấy anh Hai Lúa , nếu không phải ý của Thầy muốn vậy thì OT muốn vậy thì code sẽ viết thế nào vậy anh, phiền anh chỉ thêm ạ.
Cảm ơn anh Hai Lúa.
Nếu lấy tiêu đề cột thì thêm code sau vào em nhé, tùy biến đưa xuống sheet :
Mã:
        For i = 0 To .Fields.Count - 1
            MsgBox .Fields(i).Name
        Next
Anh ví dụ code anh đưa nó vào mỗi trang được tách ra như sau:

Mã:
Sub LayDL_HLMT_2()
    Dim sht As Worksheet
    Dim SoSheet As Integer, i As Integer
    Const SoDong = 17
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        While Not .EOF
            SoSheet = SoSheet + 1
            Set sht = Worksheets.Add
            sht.Range("A1") = "Sheet: " & SoSheet
            For i = 0 To .Fields.Count - 1
                sht.Cells(2, i + 1) = .Fields(i).Name
            Next
            sht.Name = "Sheet_" & SoSheet
            sht.Range("A3").CopyFromRecordset .DataSource, SoDong
        Wend
    End With
End Sub
 
Nếu lấy tiêu đề cột thì thêm code sau vào em nhé, tùy biến đưa xuống sheet :
Mã:
        For i = 0 To .Fields.Count - 1
            MsgBox .Fields(i).Name
        Next
Anh ví dụ code anh đưa nó vào mỗi trang được tách ra như sau:

Mã:
Sub LayDL_HLMT_2()
    Dim sht As Worksheet
    Dim SoSheet As Integer, i As Integer
    Const SoDong = 17
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        While Not .EOF
            SoSheet = SoSheet + 1
            Set sht = Worksheets.Add
            sht.Range("A1") = "Sheet: " & SoSheet
            For i = 0 To .Fields.Count - 1
                sht.Cells(2, i + 1) = .Fields(i).Name
            Next
            sht.Name = "Sheet_" & SoSheet
            sht.Range("A3").CopyFromRecordset .DataSource, SoDong
        Wend
    End With
End Sub
OT giờ mới chạy thử code tách dữ liệu thành nhiều trang,Ot có đọc bài 28 chỉ hiểu là code lấy từ dòng 17 nhưng chưa hiểu code tách dữ liệu từ dòng 17 sẽ lấy theo điều kiện nào cho mỗi sheet, anh Hai Lúa chỉ dẫn thêm cho OT với ạ.
Cảm ơn anh Hai Lúa nhiều ạ.
 
OT giờ mới chạy thử code tách dữ liệu thành nhiều trang,Ot có đọc bài 28 chỉ hiểu là code lấy từ dòng 17 nhưng chưa hiểu code tách dữ liệu từ dòng 17 sẽ lấy theo điều kiện nào cho mỗi sheet, anh Hai Lúa chỉ dẫn thêm cho OT với ạ.
Cảm ơn anh Hai Lúa nhiều ạ.
Không phải lấy dữ liệu từ dòng 17 mà là lấy hết dữ liệu, mỗi trang là 17 dòng, lấy đến khi hết dữ liệu. Code bài trên đúng yêu cầu của em rồi.
 
OT giờ mới chạy thử code tách dữ liệu thành nhiều trang,Ot có đọc bài 28 chỉ hiểu là code lấy từ dòng 17 nhưng chưa hiểu code tách dữ liệu từ dòng 17 sẽ lấy theo điều kiện nào cho mỗi sheet, anh Hai Lúa chỉ dẫn thêm cho OT với ạ.
Cảm ơn anh Hai Lúa nhiều ạ.
Ah OT hiểu rồi không phải lấy từ dòng 17 mà lấy mỗi sheet 17 dòng, sheet cuối là còn lại.. hihi
Lợi hại lợi hại.. anh Hai Lúa ạ
Bài đã được tự động gộp:

Không phải lấy dữ liệu từ dòng 17 mà là lấy hết dữ liệu, mỗi trang là 17 dòng, lấy đến khi hết dữ liệu. Code bài trên đúng yêu cầu của em rồi.
Dạ vâng, cảm ơn anh Hai Lúa nhiều nhiều.
 
Nếu lấy tiêu đề cột thì thêm code sau vào em nhé, tùy biến đưa xuống sheet :
Mã:
        For i = 0 To .Fields.Count - 1
            MsgBox .Fields(i).Name
        Next
Anh ví dụ code anh đưa nó vào mỗi trang được tách ra như sau:

Mã:
Sub LayDL_HLMT_2()
    Dim sht As Worksheet
    Dim SoSheet As Integer, i As Integer
    Const SoDong = 17
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        While Not .EOF
            SoSheet = SoSheet + 1
            Set sht = Worksheets.Add
            sht.Range("A1") = "Sheet: " & SoSheet
            For i = 0 To .Fields.Count - 1
                sht.Cells(2, i + 1) = .Fields(i).Name
            Next
            sht.Name = "Sheet_" & SoSheet
            sht.Range("A3").CopyFromRecordset .DataSource, SoDong
        Wend
    End With
End Sub
Tôi cứ tưởng là có chiêu gì đó giống như HDR=Yes, kiểu vậy chứ
 
Web KT
Back
Top Bottom