Đố vui về ADO, DAO.

Liên hệ QC
[chưa hiểu điều gì khiến a dị ứng]
Tôi không thích nói chuyện với những người dùng từ giao thiệp bằng tiếng Anh. VD chào thì nói là Hi, cám ơn thì nói là thanks, bạn thì nói là bro... Có 2 lý do: 1 là tôi thích nói tiếng Việt, 2 là có những lúc người ta dùng sai ngữ cảnh tôi chả hiểu là người ta khen hay chửi tôi (điểm này tôi đã từng chứng minh rồi)

[bài toán này dùng ADO là hay nhất]
ADO có cái bất lợi của nó. Chỉ khi nào lượng lợi áp đảo lượng bất lợi thì giải pháp mới được gọi là "hay". Muốn hay nhất thì tỉ số lợi/bất lợi phải là cao nhất.
Tôi hỏi bạn thấy nó hay chỗ nào là vì tôi không muốn chủ quan. Có thể bạn nhìn thấy một số lợi mà tôi không thấy.
Em thấy dùng ADO thì code nó dễ viết và đơn giản hơn ạ.
 
ADO là con dao 2 lưỡi, tuỳ theo từng CSDL để làm, nếu xài không khéo thì toi luôn, xài trên excel nên cẩn thận nhiều nhiều
Vâng, em cúng không biết nhiều về ADO, em chỉ thấy bài toán nào áp dụng đc ADO thì em dùng thui ạ.
 

File đính kèm

  • GPE.xlsm
    23.1 KB · Đọc: 15
Em thấy dùng ADO thì code nó dễ viết và đơn giản hơn ạ.

Chuyện dễ viết vfa đơn giản nó cũng chủ quan. Vì ở đây mọi người cho là dùng cái này trông nó "chiến" và "chuyên nghiệp" cho nên họ chịu khó viết rõ ràng. Nếu ta chịu khó nhìn các giải pháp khác dưới định kiến đó thì cũng sẽ thấy nó đơn giản và dễ viết.

Ở diễn đàn này, hầu hết các người viết code chỉ chú trọng tốc độ. Việc viết cho dễ hiểu dễ chỉnh sửa hầu như bị xem là thứ yếu. Việc viết theo từng khối độc lập (task/layer isolation) hầu như không xảy ra.

Nếu thích ADO thì nên viết hẳn một (hoặc một nhóm) hàm chuyên nhận tham số, trả về recordset. Sau đó chỉ việc gọi hàm, nạp tham số đại khái gồm workbook và câu sql string. Kết quả trả về ghi thẳng vào range. Như vậy, vấn đề chỉ còn là quan sát đầu vào, phân tích đầu ra, viết câu sql. Khoẻ ru.

Thời buổi bây giờ MS Office đã qua đến phiên bản 2016. Thay vì lẩn quẩn ở mấy cái trò này, đi nghiên cứu các loại kết nối dữ liệu mới có phải sướng hơn không? Chẳng hạn như một trường hợp mà bạn HLMT đã từng nói qua, 2016 dùng PowerQuery lấy dữ liệu khoẻ ru.

ADO là con dao 2 lưỡi, tuỳ theo từng CSDL để làm, nếu xài không khéo thì toi luôn, xài trên excel nên cẩn thận nhiều nhiều

Thường thường dùng Active Object là chuyện bất đắc dĩ. Làm việc thường xuyên thì cần phải biết những bất lợi của nó để đề phòng.
 
Để lấy tất cả dữ liệu từ 1 sheet khác có tên là Sheet1 trong workbook với phiên bản 2003 hoặc 2007.
Xin hỏi: Tôi viết code như thế nào cho nó ngắn gọn nhất mà ở Sheet2 khi chạy code vẫn lấy được dữ liệu cho dù dùng phiên bản nào?
 
Lần chỉnh sửa cuối:
Để lấy tất cả dữ liệu từ 1 sheet khác có tên là Sheet1 trong workbook với phiên bản 2003 hoặc 2007.
Xin hỏi: Tôi viết code như thế nào cho nó ngắn gọn nhất mà ở Sheet2 khi chạy code vẫn lấy được dữ liệu cho dù dùng phiên bản nào?
Tôi có thể viết trong vòng 4 dòng code (190 kí tự, không kể cách trắng) để ra được kết quả
 
Lần chỉnh sửa cuối:
Gia đình GPE giúp em bài tập này ạ: em có file tính giá thành cà phê như đính kèm. Từ sheet Nguon em vẫn dùng VBA lấy dữ liệu qua sheet Dich, em đang học ADO nên muốn dùng ADO để làm mà loay hoay mãi chưa xong.
 

File đính kèm

  • Giathanhcafe.rar
    54.4 KB · Đọc: 32
Gia đình GPE giúp em bài tập này ạ: em có file tính giá thành cà phê như đính kèm. Từ sheet Nguon em vẫn dùng VBA lấy dữ liệu qua sheet Dich, em đang học ADO nên muốn dùng ADO để làm mà loay hoay mãi chưa xong.
Bạn thử code này
Mã:
Sub ADOTest()
Dim i As Integer, query As String
Application.ScreenUpdating = False
For i = 4 To 16
    query = query + "select f1,f2,'" & Sheets("Nguon").Cells(2, i) & "',f" & i & " from [Nguon$A4:P273]" & Chr(10) & "union all " & Chr(10)
Next
    query = Left(query, Len(query) - 11)
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
     With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
        .Open
    End With
    rs.Open query, cn
    Range("F4").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
Application.ScreenUpdating = True
End Sub
 
Cám ơn bạn quanluu1989, thuật toán đơn giản nhưng ý tưởng mới quan trọng. Bạn trả lời nhanh và ý tưởng cũng nhanh, bạn quả là cao thủ
 
Bạn thử code này
Mã:
 Sub ADOTest()
 Dim i As Integer, query As String
 Application.ScreenUpdating = False
 For i = 4 To 16
     query = query + "select f1,f2,'" & Sheets("Nguon").Cells(2, i) & "',f" & i & " from [Nguon$A4:P273]" & Chr(10) & "union all " & Chr(10)
 Next
     query = Left(query, Len(query) - 11)
     Set cn = CreateObject("ADODB.Connection")
     Set rs = CreateObject("ADODB.Recordset")
      With cn
         .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
         .Open
     End With
     rs.Open query, cn
     Range("F4").CopyFromRecordset rs
     rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
 Application.ScreenUpdating = True
 End Sub
Có thể rút gọn lại code trên thành 8 dòng code. Nhưng vẫn ra kết quả giong nhau.
 
Chào gia đình GPE, Em có file data khách hàng gửi là file .DBF nhưng trước giờ em chỉ quen làm với excel, anh chị giúp em tạo code để kết nối tới dữ liệu dạng foxpro này ạ . Cám ơn gia đình
 
Chào gia đình GPE, Em có file data khách hàng gửi là file .DBF nhưng trước giờ em chỉ quen làm với excel, anh chị giúp em tạo code ADO để kết nối tới dữ liệu dạng foxpro để trích xuất dữ liệu ra excel được không ạ . Cám ơn gia đình
 
E gửi file gia đình GPE giúp em ạ
 
Các bạn nên vào mục hỏi đáp về ADO căn bản để thảo luận nhé. Ở đây sẽ chuyên về câu đố nhé.
 
Cám ơn anh, nảy giờ em hỏi lung tung ở mấy topic khác, hix
 
Để lấy tất cả dữ liệu từ 1 sheet khác có tên là Sheet1 trong workbook với phiên bản 2003 hoặc 2007.
Xin hỏi: Tôi viết code như thế nào cho nó ngắn gọn nhất mà ở Sheet2 khi chạy code vẫn lấy được dữ liệu cho dù dùng phiên bản nào?
Có thể ít có người quan tâm về câu đố này quá nhỉ
 
Mạnh cũng thử Góp vui một tí coi

I/ Có 50 File ở 50 Folder khác nhau ..và Ổ dĩa khác nhau VD: 25 Folder ở ổ E:\ và 25 Folder ở ổ D:\

1/ VD: E:\mm\1.xls
2/ VD: E:\mm\kk\2.xlsx
3/ VD: E:\hh\mm\kk\3.xls
.......................................
1/ VD: D:\mm\4.xls
2/ VD: D:\mm\kk\5.xlsb
3/ VD: D:\hh\mm\kk\6.xlsm
.......................................

II/ Có chung cấu trúc cần tổng Hợp như sau

1/ Tên Sheet cần tổng hợp là GPE

2/ Vùng dữ liệu cần tổng hợp là [A2:J100]

3/ Sử dụng ADO tổng hợp tất cả các file trên gán nối tiếp kết quả xuống 1 Sheet

4/ Không Sử dụng Array(file1,file2,file3 ......... To 50...........) để duyệt Files

5/ Không sử dụng cột phụ trên Sheet lấy đường dẫn của File xong chạy For Next ....

Rất mong các Bạn tham gia code chơi

xin cảm ơn
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom