Đố vui về ADO, DAO.

Liên hệ QC
Lâu quá không thấy ai tham dự đề tài đố vui về ADO/DAO, để khởi động lại. nay tôi xin đố các bạn là không dùng vòng lặp, clipboard mà ta có thể đổ dữ liệu thành 1 bảng ở trình soạn email outlook.
1. Bảng dữ liệu:

upload_2018-1-3_9-44-6.png

2. Điều kiện để đưa dữ liệu vào outlook là TP=B.
3. Kết quả như sau:

upload_2018-1-3_9-42-55.png

 

File đính kèm

  • Dovui.xlsx
    13.8 KB · Đọc: 9
Lần chỉnh sửa cuối:
Lâu quá không thấy ai tham dự đề tài đố vui về ADO/DAO, để khởi động lại. nay tôi xin đố các bạn là không dùng vòng lặp, clipboard mà ta có thể đổ dữ liệu thành 1 bảng ở trình soạn email outlook.
1. Bảng dữ liệu:

View attachment 189195

2. Điều kiện để đưa dữ liệu vào outlook là TP=B.
3. Kết quả như sau:

View attachment 189194

1 tuần = 7 ngày đã trôi qua, nhưng chỉ thấy có 2 lần tải, có vẻ như mọi người không quan tâm đến đề bài này. :(
 
DAO và ADO đã được đưa vào sách Lập trình VBA tập 2 một cách hệ thống ở mức độ cơ bản nhất. Khi đó sẽ nhiều người nghiên cứu món này hơn, anh chuẩn bị tinh thần đi :)
 
1 tuần = 7 ngày đã trôi qua, nhưng chỉ thấy có 2 lần tải, có vẻ như mọi người không quan tâm đến đề bài này. :(

Office của bà con là phiên bản lậu cho nên ngại dùng Outlook để thử.
Bạn ra luôn lời giải cho rồi. Sau khi có lời giải, bà con sẽ đố tiếp về việc dùng lời giải ấy để áp dụng vào cái khác.
 
Office của bà con là phiên bản lậu cho nên ngại dùng Outlook để thử.
Bạn ra luôn lời giải cho rồi. Sau khi có lời giải, bà con sẽ đố tiếp về việc dùng lời giải ấy để áp dụng vào cái khác.
Nếu vậy em gửi đáp án luôn.

Code này sẽ rất quen thuộc nếu ai đã từng lập trình web để đổ dữ liệu xuống table từ CSDL.

Mã:
Sub DoVui_ADO()
    Dim objOutlook, objOutlookMsg, cn, rst As Object
    Set objOutlook = CreateObject("Outlook.Application")
    Set objOutlookMsg = objOutlook.CreateItem(0)
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    rst.Open ("select * from [Sheet1$] where TP='B'"), cn
    With objOutlookMsg
        .To = "hailuamientay@giaiphapexcel.com"
        .Subject = Sheet2.[B1]
        .HTMLBody = "<strong>Xin chào các ban ,</strong> <br><br>" & Sheet2.[B2] & "<br><table border='1'><th>No</th><th>TP</th><th>ITEM NAME</th><th>SPEC</th><th>COLOR</th><th>Q'TY</th> <tr>" & rst.GetString(, , "</td><td>", "</tr><tr>") & "</tr></table><br><a href=http://www.giaiphapexcel.com/diendan/threads/%C4%90%E1%BB%91-vui-v%E1%BB%81-ado-dao.80367/page-15#post-835345/>Xem thêm tai dây</a><br><strong>Hai Lúa Miên Tây</strong>"
        .Display
    End With
End Sub
 

File đính kèm

  • DoVuiADO_DapAn.xlsm
    25.1 KB · Đọc: 18
Để tiếp tục, tôi xin ra tiếp câu đố là không dùng vòng lặp, làm sao ta có thể đưa kết quả vào Shape như hình bên dưới:

upload_2018-1-22_11-9-7.png
 

File đính kèm

  • DoVuiADO_2.xlsb
    14.8 KB · Đọc: 21
Cũng đã gần cuối tuần rồi, mọi người chuẩn bị đi bão nên cũng không mấy quan tâm nhỉ. Các bạn giải đáp nhanh để ta tiếp tục với câu đố tiếp theo nhé.
Giờ người ta không thích kiểu đố đố như thế này nữa, có thể vì:
Hoặc là giúp bài có ích - thành viên đang chờ
Hoặc là làm hoạt động gì đó ra tiền
Hoặc là bài đố phải có ứng dụng thực tiễn thật sự, thay vì chỉ vui
 
Giờ người ta không thích kiểu đố đố như thế này nữa, có thể vì:
Hoặc là giúp bài có ích - thành viên đang chờ
Hoặc là làm hoạt động gì đó ra tiền
Hoặc là bài đố phải có ứng dụng thực tiễn thật sự, thay vì chỉ vui
Vậy GPE mình cần thêm mục "Đố vui có thưởng" rồi. :p:p
 
Giờ người ta không thích kiểu đố đố như thế này nữa, có thể vì:
Hoặc là giúp bài có ích - thành viên đang chờ
Hoặc là làm hoạt động gì đó ra tiền
Hoặc là bài đố phải có ứng dụng thực tiễn thật sự, thay vì chỉ vui
Ứng dụng cho bài này là có thể lấy dữ liệu đưa vào một cái nút nhấn được tạo = Shape, hoặc có thể dùng shape để trình bày dữ liệu.
 
Để tiếp tục, tôi xin ra tiếp câu đố là không dùng vòng lặp, làm sao ta có thể đưa kết quả vào Shape như hình bên dưới:

View attachment 190543
Em xin đưa phương án như sau, anh góp ý nhé
Mã:
Sub DoVui_ADO()
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    lsql = "SELECT DISTINCT [TP] & '-> ' & [GR] & '-> ' & Sum([QTY]) & 'PCS' AS [Sum Of QTY] FROM [Sheet1$] GROUP BY TP, GR"
    rst.Open lsql, cn
    Do While rst.EOF = False
        strValue = strValue & rst.Fields("Sum Of QTY").Value & Chr(10)
        rst.MoveNext
    Loop
    ActiveSheet.Shapes("Rec").TextFrame2.TextRange.Characters.Text = strValue
End Sub
 
Em xin đưa phương án như sau, anh góp ý nhé
Mã:
Sub DoVui_ADO()
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    lsql = "SELECT DISTINCT [TP] & '-> ' & [GR] & '-> ' & Sum([QTY]) & 'PCS' AS [Sum Of QTY] FROM [Sheet1$] GROUP BY TP, GR"
    rst.Open lsql, cn
    Do While rst.EOF = False
        strValue = strValue & rst.Fields("Sum Of QTY").Value & Chr(10)
        rst.MoveNext
    Loop
    ActiveSheet.Shapes("Rec").TextFrame2.TextRange.Characters.Text = strValue
End Sub
Rất cám ơn bạn đã tham gia. Nên thử lại là ta không dùng vòng lặp nhé bạn.
 
Rất cám ơn bạn đã tham gia. Nên thử lại là ta không dùng vòng lặp nhé bạn.
Nếu không vòng lặp em mạnh dạn đưa đáp án như thế này, anh xem và góp ý nhé.
Mã:
Sub DoVui_ADO()
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    lsql = "SELECT DISTINCT [TP] & '-> ' & [GR] & '-> ' & Sum([QTY]) & 'PCS' AS [Sum Of QTY] FROM [Sheet1$] GROUP BY TP, GR"
    rst.Open lsql, cn
    strValue = rst.GetString(, , , Chr(10))
    ActiveSheet.Shapes("Rec").TextFrame2.TextRange.Characters.Text = strValue
End Sub
 
Nếu không vòng lặp em mạnh dạn đưa đáp án như thế này, anh xem và góp ý nhé.
Mã:
Sub DoVui_ADO()
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    lsql = "SELECT DISTINCT [TP] & '-> ' & [GR] & '-> ' & Sum([QTY]) & 'PCS' AS [Sum Of QTY] FROM [Sheet1$] GROUP BY TP, GR"
    rst.Open lsql, cn
    strValue = rst.GetString(, , , Chr(10))
    ActiveSheet.Shapes("Rec").TextFrame2.TextRange.Characters.Text = strValue
End Sub
Đúng là như vầy rồi. Thật ra đây là cái mà mình muốn truyền tải cho mọi người (rst.GetString), nó ứng dụng rất nhiều chứ không phải đơn thuần chỉ là đố vui như bạn @Gió Đông nói.
Cám ơn bạn.
 
Nếu không vòng lặp em mạnh dạn đưa đáp án như thế này, anh xem và góp ý nhé.
Mã:
Sub DoVui_ADO()
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    lsql = "SELECT DISTINCT [TP] & '-> ' & [GR] & '-> ' & Sum([QTY]) & 'PCS' AS [Sum Of QTY] FROM [Sheet1$] GROUP BY TP, GR"
    rst.Open lsql, cn
    strValue = rst.GetString(, , , Chr(10))
    ActiveSheet.Shapes("Rec").TextFrame2.TextRange.Characters.Text = strValue
End Sub
Thật ra câu lệnh SQL như sau là đủ, bạn chỉnh sửa lại chút xíu nhé.

"select TP,GR,SUM(QTY) from [Sheet1$] GROUP BY TP,GR"
 
Web KT
Back
Top Bottom