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
Có gì đâu mà ăn mừng anh, máy hôm nay chưa có thời gian với lại em dang nghiên cứu cái encryption nên chưa đưa hội đồng sư phạm xem trước hihihi
Vẫn theo kiểu truyền thống là gửi và nhận gói tin hay là kiểu mới JSON? Hay là cả hay đều không phải? Có thể bật mí chút không em :::"""><
 
Vẫn theo kiểu truyền thống là gửi và nhận gói tin hay là kiểu mới JSON? Hay là cả hay đều không phải? Có thể bật mí chút không em :::"""><
hihih có gì ghê gớm đâu anh, ai hiểu sao cứ làm vậy, mỗi người mỗi kiểu mà, đã làm trên Win thì cứ bám theo ông MS mà làm. trên android thì theo ông Google, trên Linux thì theo Linux
 
Cũng tương tự với bài tách dữ liệu ở Bài #28 nhưng dưới đây ta khai thác đến 'Page' trong Recordset như sau:

Mã:
Sub Page_HLMT_1()
    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
        MsgBox .PageCount
    End With
End Sub
Tôi đưa ví dụ chia mỗi trang ra 20 dòng và sau đó chạy code trên với dữ liệu bài số 1 thì ta được 6 trang. Như vậy ta có thể khai thác thêm để đưa dữ liệu trong Recordset cho từng trang xuống sheet.
 
Cũng tương tự với bài tách dữ liệu ở Bài #28 nhưng dưới đây ta khai thác đến 'Page' trong Recordset như sau:

Mã:
Sub Page_HLMT_1()
    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
        MsgBox .PageCount
    End With
End Sub
Tôi đưa ví dụ chia mỗi trang ra 20 dòng và sau đó chạy code trên với dữ liệu bài số 1 thì ta được 6 trang. Như vậy ta có thể khai thác thêm để đưa dữ liệu trong Recordset cho từng trang xuống sheet.

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
 
Mình oánh dấu thớt này để theo dõi chứ hông phải sì pem đâu á.
 
Cũng tương tự với bài tách dữ liệu ở Bài #28 nhưng dưới đây ta khai thác đến 'Page' trong Recordset như sau:

Mã:
Sub Page_HLMT_1()
    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
        MsgBox .PageCount
    End With
End Sub
Tôi đưa ví dụ chia mỗi trang ra 20 dòng và sau đó chạy code trên với dữ liệu bài số 1 thì ta được 6 trang. Như vậy ta có thể khai thác thêm để đưa dữ liệu trong Recordset cho từng trang xuống sheet.
Đoạn này không có tác dụng ghi dữ liệu xuống bảng tính ở sheet khác à anh Hai Lúa ơi T_T
 
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
Ý bạn là làm theo kiểu "Lazy loading"? Để đơn giản hơn thì bạn tạo một nút gọi nôm na là nút "Xem Thêm", bạn quy định đổ dữ liệu bao nhiêu dòng xuống sheet thì hiện cái nút đó phìa bên dưới của vùng dữ liệu, nếu người dùng thích thì click vào đó xem tiếp, đến khi đổ hết dữ liệu thì nút đó không hiện lên nữa.
 
Đoạn này không có tác dụng ghi dữ liệu xuống bảng tính ở sheet khác
Ghi xuống đâu thì mình ghi thôi. @@

'Người ta' ghi chú code đó có tác dụng gì rồi mà. Tức là nếu kết quả query trả về 99 dòng, thì chia 99 thành n phần, trong đó (n-1) phần = 20 dòng, phần n có 99 - 20*(n-1) dòng

1605236110713.png
 
Ghi xuống đâu thì mình ghi thôi. @@

'Người ta' ghi chú code đó có tác dụng gì rồi mà. Tức là nếu kết quả query trả về 99 dòng, thì chia 99 thành n phần, trong đó (n-1) phần = 20 dòng, phần n có 99 - 20*(n-1) dòng

View attachment 249238
Cảm ơn befaint, với OT thì những trao đổi liên quan đến lập trìn OT rất khó hiểu chỉ biết chạy code xem kết quả là cái gì bạn ạ.. hic hic
 
Ý bạn là làm theo kiểu "Lazy loading"?
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. :)
 
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. :)
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.
 
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.
Em chỉ diễn giải giúp tác giả thôi. :D

Tác giả cần làm vậy để cung cấp thông tin cho những người cần đọc nó. Kiểu như sàn chứng khoán đó anh.

Và tất nhiên không quan tâm lắm về thời gian đổ dữ liệu kia, chỉ quan tâm kết quả cuối cùng là dữ liệu chạy chạy trên màn hình thôi.

----
Phương án có thể là 30 phút, hay vài tiếng gì đó mới truy vấn 1 lần. Kết quả ghi vào sheet tạm hoặc biến tạm, sau đó mới đẩy ra màn hình theo ý tác giả.
 
Em chỉ diễn giải giúp tác giả thôi. :D

Tác giả cần làm vậy để cung cấp thông tin cho những người cần đọc nó. Kiểu như sàn chứng khoán đó anh.

Và tất nhiên không quan tâm lắm về thời gian đổ dữ liệu kia, chỉ quan tâm kết quả cuối cùng là dữ liệu chạy chạy trên màn hình thôi.

----
Phương án có thể là 30 phút, hay vài tiếng gì đó mới truy vấn 1 lần. Kết quả ghi vào sheet tạm hoặc biến tạm, sau đó mới đẩy ra màn hình theo ý tác giả.
Nếu có thời gian em thử giúp bạn ấy vấn đề này nhé :)
 
Cảm ơn befaint, với OT thì những trao đổi liên quan đến lập trìn OT rất khó hiểu chỉ biết chạy code xem kết quả là cái gì bạn ạ.. hic hic
Anh ghi dữ liệu xuống Sheet2 theo file mẫu bài 1 nhé

Mã:
Sub Page_HLMT_2()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    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
            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
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
        Next
    End With
End Sub

Em có thể thêm dòng tổng cho mỗi trang và dòng tổng cộng của cột 'Price' cho toàn bộ trang qua code đơn giản trên để dễ hình dung.
 
Anh ghi dữ liệu xuống Sheet2 theo file mẫu bài 1 nhé

Mã:
Sub Page_HLMT_2()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    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
            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
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
        Next
    End With
End Sub

Em có thể thêm dòng tổng cho mỗi trang và dòng tổng cộng của cột 'Price' cho toàn bộ trang qua code đơn giản trên để dễ hình dung.
Cảm ơn anh Hai Lúa, OT test thử thấy kết quả rồi , dữ liệu xen lẫn 1 dòng trống 20 dòng một bảng, như vậy mỗi dòng trống là ta có thể thêm dòng tổng hợp vào những dòng này phải không anh, cảm ơn anh Hai Lúa, 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
 
Anh ghi dữ liệu xuống Sheet2 theo file mẫu bài 1 nhé

Mã:
Sub Page_HLMT_2()
    Dim intPage As Integer, i As Integer, intSq As Integer, intRecord As Integer
    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
            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
                .MoveNext
                If .EOF Then Exit For
            Next
            i = i + 1
        Next
    End With
End Sub

Em có thể thêm dòng tổng cho mỗi trang và dòng tổng cộng của cột 'Price' cho toàn bộ trang qua code đơn giản trên để dễ hình dung.
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
 
Web KT
Back
Top Bottom