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
Như vậy ngắn gọn hơn chứ anh Hai Lúa
Mã:
Sub Page_HLMT_2()
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .pagesize = 20
        While Not .EOF
            Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(2).CopyFromRecordset .DataSource, .pagesize
        Wend
    End With
End Sub
Nó trở lại giống những bài trên, ý tôi muốn khai thác rộng ra thêm để tùy biến người dùng sử dụng.
 
Như vậy ngắn gọn hơn chứ anh Hai Lúa
Mã:
Sub Page_HLMT_2()
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .pagesize = 20
        While Not .EOF
            Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(2).CopyFromRecordset .DataSource, .pagesize
        Wend
    End With
End Sub
Bài đó anh Hai Lúa trích dẫn bài của OT nên có thể bài đó muốn viết rõ ràng hơn để OT hiểu thêm nên code phải thêm 1 số dòng, OT thấy viết như vậy OT dễ hiểu đc là cột nào đưa xuống cột nào và dựa vào đó có thể tùy biến vào mẫu báo cáo mình muốn hihi.
Cảm ơn Nhattanktnn đã chỉ thêm cho OT thêm một cách để tham khảo ạ.
 
OT đã hiểu ứng dụng như chắc muốn viết thêm dòng tổng cộng thì phải thêm 1 sub bằng VBA thôi ạ chứ chư biết cách thêm trong đoạn code ADO này của Anh, hihi
Đã có vòng lặp rồi thì ta cộng vào thêm thôi em. Anh tạo dòng tổng, còn tổng cộng thì em thử tự thêm vào nhé.

Mã:
Sub Page_HLMT_3()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    Dim lngTotal 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, 1
        .PageSize = 20
        Sheet2.Cells.ClearContents
        For intPage = 1 To .PageCount
            lngTotal = 0
            For intRecord = 1 To .PageSize
                i = i + 1
                intSq = intSq + 1
                Sheet2.Range("A" & i) = intSq
                Sheet2.Range("B" & i) = !ID
                Sheet2.Range("C" & i) = !Code
                Sheet2.Range("D" & i) = !Price
                lngTotal = lngTotal + !Price
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
            Sheet2.Range("C" & i) = "Total:"
            Sheet2.Range("D" & i) = lngTotal
        Next
    End With
End Sub
 
Đã có vòng lặp rồi thì ta cộng vào thêm thôi em. Anh tạo dòng tổng, còn tổng cộng thì em thử tự thêm vào nhé.

Mã:
Sub Page_HLMT_3()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    Dim lngTotal 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, 1
        .PageSize = 20
        Sheet2.Cells.ClearContents
        For intPage = 1 To .PageCount
            lngTotal = 0
            For intRecord = 1 To .PageSize
                i = i + 1
                intSq = intSq + 1
                Sheet2.Range("A" & i) = intSq
                Sheet2.Range("B" & i) = !ID
                Sheet2.Range("C" & i) = !Code
                Sheet2.Range("D" & i) = !Price
                lngTotal = lngTotal + !Price
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
            Sheet2.Range("C" & i) = "Total:"
            Sheet2.Range("D" & i) = lngTotal
        Next
    End With
End Sub
Ôi cảm ơn anh Hai Lúa nhiều ạ, để OT xem ứng dụng đc vào chỗ nào để OT ứng dụng ạ. Hihi
 
Đã có vòng lặp rồi thì ta cộng vào thêm thôi em. Anh tạo dòng tổng, còn tổng cộng thì em thử tự thêm vào nhé.

Mã:
Sub Page_HLMT_3()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    Dim lngTotal 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, 1
        .PageSize = 20
        Sheet2.Cells.ClearContents
        For intPage = 1 To .PageCount
            lngTotal = 0
            For intRecord = 1 To .PageSize
                i = i + 1
                intSq = intSq + 1
                Sheet2.Range("A" & i) = intSq
                Sheet2.Range("B" & i) = !ID
                Sheet2.Range("C" & i) = !Code
                Sheet2.Range("D" & i) = !Price
                lngTotal = lngTotal + !Price
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
            Sheet2.Range("C" & i) = "Total:"
            Sheet2.Range("D" & i) = lngTotal
        Next
    End With
End Sub
Hay đấy ... Mạnh copy ý tưởng viết thành Hàm cho vào SQL thêm tùy biến cho nó phong phú chút
 
Ôi cảm ơn anh Hai Lúa nhiều ạ, để OT xem ứng dụng đc vào chỗ nào để OT ứng dụng ạ. Hihi
Thử như này xem Oanh Thơ:
Mã:
Sub Page_HLMT_2_2() ' Giong sub tren
Dim a As Long, b 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, 1
        .pagesize = 20
        While Not .EOF
            a = a + 1: If a = .pagecount Then b = .RecordCount - (.pagecount - 1) * .pagesize Else b = .pagesize
            Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(2).CopyFromRecordset .DataSource, .pagesize
            Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(1, 2).FormulaR1C1 = "=sum(R[-" & b & "]C:R[-1]C)"
        Wend
    End With
End Sub
 
Thử như này xem Oanh Thơ:
Mã:
Sub Page_HLMT_2_2() ' Giong sub tren
Dim a As Long, b 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, 1
        .pagesize = 20
        While Not .EOF
            a = a + 1: If a = .pagecount Then b = .RecordCount - (.pagecount - 1) * .pagesize Else b = .pagesize
            Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(2).CopyFromRecordset .DataSource, .pagesize
            Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(1, 2).FormulaR1C1 = "=sum(R[-" & b & "]C:R[-1]C)"
        Wend
    End With
End Sub
Cảm ơn bạn Nhattanktnn đã quan tâm, hình như cách này code sẽ nhanh hơn thì phải, OT cảm nhận vậy thôi ạ. hihi
 
Cảm ơn bạn Nhattanktnn đã quan tâm, hình như cách này code sẽ nhanh hơn thì phải, OT cảm nhận vậy thôi ạ. hihi
Mình hổng biết đâu, theo suy nghĩ sao thì làm vậy thôi. Mình đang học hỏi từ bác Hai Lúa mà. Bạn muốn biết nhanh hay chậm thử set timer xem sao
 
Cảm ơn bạn Nhattanktnn đã quan tâm, hình như cách này code sẽ nhanh hơn thì phải, OT cảm nhận vậy thôi ạ. hihi
Dĩ nhiên rồi em, nó không duyệt và ghi từng dòng dữ liệu. Như anh đã nói là anh đưa ra từng phương án và khai thác nó để tùy từng trường hợp mà ta có thể ứng dụng vào bài toán thực tế của mình.
 
Nó trở lại giống những bài trên, ý tôi muốn khai thác rộng ra thêm để tùy biến người dùng sử dụng.
Ví dụ ta định dạng dữ liệu, nối cột, thực hiện phép tính khi đưa xuống sheet như sau:

Rich (BB code):
Sub Page_HLMT_4()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    Dim lngTotal 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, 1
        .PageSize = 20
        Sheet2.Cells.ClearContents
        For intPage = 1 To .PageCount
            lngTotal = 0
            For intRecord = 1 To .PageSize
                i = i + 1
                intSq = intSq + 1
                Sheet2.Range("A" & i) = intSq
                Sheet2.Range("B" & i) = !ID & " >> " & !Code
                Sheet2.Range("C" & i) = !Code
                Sheet2.Range("D" & i) = Format(!Price, "0,#")
                lngTotal = lngTotal + !Price
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
            Sheet2.Range("C" & i) = "Total:"
            Sheet2.Range("D" & i) = Format(lngTotal, "0,#")
        Next
    End With
End Sub
 
Ví dụ ta định dạng dữ liệu, nối cột, thực hiện phép tính khi đưa xuống sheet như sau:

Rich (BB code):
Sub Page_HLMT_4()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    Dim lngTotal 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, 1
        .PageSize = 20
        Sheet2.Cells.ClearContents
        For intPage = 1 To .PageCount
            lngTotal = 0
            For intRecord = 1 To .PageSize
                i = i + 1
                intSq = intSq + 1
                Sheet2.Range("A" & i) = intSq
                Sheet2.Range("B" & i) = !ID & " >> " & !Code
                Sheet2.Range("C" & i) = !Code
                Sheet2.Range("D" & i) = Format(!Price, "0,#")
                lngTotal = lngTotal + !Price
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
            Sheet2.Range("C" & i) = "Total:"
            Sheet2.Range("D" & i) = Format(lngTotal, "0,#")
        Next
    End With
End Sub
Uây đúng cái OT muốn xử lý từ trong ADO, mọi khi OT hay lấy dữ liệu về sau đó OT mới sử dụng vba để định dạng.
Cảm ơn anh Hai Lúa nhiều ạ
 
Cảm ơn anh @Hai Lúa Miền Tây về bài em viết em đang quan tâm.
Em có nhu cầu đưa dữ liệu ra màn hình. Do dữ liệu dài mà muốn hiển thị đầy đủ nên cần đưa dữ liệu theo cách trôi dần từng dòng lên trên màn hình 1 cách tự động.
Màn hình hiển thị được 10 dòng, lần đầu em đưa 10 record đầu tiên (record 0-9), sau 5s sẽ hiển thị từ record 1 đến 10, sau 5s tiếp theo lại query từ record 2-11, cứ thế cho đến khi hết dữ liệu. (Bản chất 1 muốn trượt dữ liệu 1 cách mượt nhất và trượt tự động thông qua lệnh Application.Ontime)
Qua những bài viết đầu tiên em cũng đã hiểu 1 chút tuy nhiên vẫn còn lúng túng. Anh hướng dẫn giúp tình huống trên nhé.
Cảm ơn anh

Giống vậy không? Nhìn giống gọi tên + số trong bệnh viện :)
Thêm vài đoạn code vô code của bác HLMT là được.

 
Giống 99.1 % rồi anh.

0.9% còn lại là lặp lại từ đầu khi hết 1 lượt. Cứ như vậy cho tới khi tắt điện. :p

À tôi cho ngưng tại muốn giống trong bệnh viện Saint Paul mà tôi thấy :) . Nó hiện tên bệnh nhân chờ trước phòng khám, nó phải hết để người kế tiếp mình là bệnh nhân kế cuối rồi..hehe...
 
À tôi cho ngưng tại muốn giống trong bệnh viện Saint Paul mà tôi thấy :) . Nó hiện tên bệnh nhân chờ trước phòng khám, nó phải hết để người kế tiếp mình là bệnh nhân kế cuối rồi..hehe...
Nó phải lặp lại giống như @befaint nói, vì đâu phải mình dùng nút bấm để chờ đến lượt. Khi chạy đến cuối thì phải quay ngược lại. :D
 
Không phải rồi anh.
Tác giả có cái màn hình treo ở giữa lối đi, hiện chữ thật to, được 10 dòng.
Giờ muốn kết quả chạy trôi trôi theo phương thẳng đứng, trượt từng dòng một theo thời gian. Kiểu như trình diễn PowerPoint, như kiểu đoạn kết thúc bộ phim có chạy nội dung tác giả kịch bản, đạo diễn, diễn viên, kỹ thuật âm thanh/ sánh sáng ấy. :)
Bạn nói đúng ý của mình muốn. Đây là màn hình hiển thị thông tin ở chỗ công cộng
Hiện mình đang làm được như vậy, nhưng theo vài cách rất lòng vòng. Dữ liệu chạy rất giật. (Mình đổ tất cả dữ liệu ra 1 chỗ. Tại chỗ hiển thị, dùng hàm Vlookup, cho code chạy cái lookup value tăng dần để dữ liệu được hiện dần dần).
Cảm ơn bạn
Bài đã được tự động gộp:

Không khéo làm kiểu này chỉ khó chịu cho người dùng hơn và chưa chắc là thời gian đợi ít hơn so với thời gian đổ dữ liệu 1 lần.
Diễn giải của befain đúng ý em muốn.
Cái màn hình này để hiển thị dữ liệu nơi công cộng và code được viết để chạy lặp lại cho đến khi mất điện. Cần sửa dữ liệu, em sửa trên database mà ko cần chạm vào cái màn hình kia.
Bài đã được tự động gộp:

Giống 99.1 % rồi anh.

0.9% còn lại là lặp lại từ đầu khi hết 1 lượt. Cứ như vậy cho tới khi tắt điện. :p
Đúng là giống, nhưng giống có 98% thôi.
1% chưa giống là nó cần lặp lại vô hạn cho đến khi mất điện (khỏi cần hiện cái thông báo xong)
1% còn lại là nó cần quay lại từ đầu ngay khi dòng cuối cùng của màn hình là trống (trong clip có đẩy cả vài dòng trống lên).
Cảm ơn @befaint@ongke0711
 
Lần chỉnh sửa cuối:
1% chưa giống là nó cần lặp lại vô hạn cho đến khi mất điện (khỏi cần hiện cái thông báo xong)
1% còn lại là nó cần quay lại từ đầu ngay khi dòng cuối cùng của màn hình là trống (trong clip có đẩy cả vài dòng trống lên).

:) làm chơi chơi thôi chứ không có làm kỹ như yêu cầu của bạn.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom