Đố vui về ADO, DAO.

Liên hệ QC
Chế lại code của bản kia nhưng chưa tìm ra cách sắp sếp sao cho giống file mẫu

Mã:
Sub GPE()    Dim Query As String
    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
  Query = "SELECT A.f1, A.f2,SWITCH(A.f1 = A.f2, B.f2, A.f1 <> A.f2, null)" & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "RIGHT JOIN [A2:B6] As B ON B.f1 = A.f1 "
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
 
Chế lại code của bản kia nhưng chưa tìm ra cách sắp sếp sao cho giống file mẫu

Mã:
Sub GPE()    Dim Query As String
    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
  Query = "SELECT A.f1, A.f2,SWITCH(A.f1 = A.f2, B.f2, A.f1 <> A.f2, null)" & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "RIGHT JOIN [A2:B6] As B ON B.f1 = A.f1 "
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
Thế này thì lại càng sai so với mẫu (lúc đầu mình dùng iff rùi, thấy ko ổn nên để kiểu đó)
 
Kết quả mình có dc từ code

FWT166.1Khung mặt
FWT166.1FWT166.1Red
FWT166.1Chân
FWT034Khung mặt
FWT034FWT034white
FWT034Chân
FWT034Khung mặt
FWT034FWT034Grey
FWT034Chân
WCF015WCF015white
WCF015Mặt ngồi
WCF015Chân dài
WCF015WCF015Grey
WCF015Mặt ngồi
WCF015Chân dài
 
Kết quả mình có dc từ code

FWT166.1Khung mặt
FWT166.1FWT166.1Red
FWT166.1Chân
FWT034Khung mặt
FWT034FWT034white
FWT034Chân
FWT034Khung mặt
FWT034FWT034Grey
FWT034Chân
WCF015WCF015white
WCF015Mặt ngồi
WCF015Chân dài
WCF015WCF015Grey
WCF015Mặt ngồi
WCF015Chân dài
Mình biết là nó sẽ ntn, nhưng bạn so sánh với bản mẫu là khác nhau nhiều, nó theo quy luật sắp xếp, còn kết quả này chỉ là có đủ dòng và hiện màu với những dòng có f1 = f2 thui, chứ ko theo quy luật của Color detail
 
Mình biết là nó sẽ ntn, nhưng bạn so sánh với bản mẫu là khác nhau nhiều, nó theo quy luật sắp xếp, còn kết quả này chỉ là có đủ dòng và hiện màu với những dòng có f1 = f2 thui, chứ ko theo quy luật của Color detail
thì mình thêm mấy cái Order by zô nữa cho giống . hi hi /-*+//-*+/
 
Kết quả mình có dc từ code

FWT166.1Khung mặt
FWT166.1FWT166.1Red
FWT166.1Chân
FWT034Khung mặt
FWT034FWT034white
FWT034Chân
FWT034Khung mặt
FWT034FWT034Grey
FWT034Chân
WCF015WCF015white
WCF015Mặt ngồi
WCF015Chân dài
WCF015WCF015Grey
WCF015Mặt ngồi
WCF015Chân dài
RÁng chút nữa đi bạn, gần được rồi đó.
 
cái bảng đâu có nhiều cột lắm đâu , cứ nghịch dại vài cột thử xem sao ? xếp vài ba cột 1 lúc xem sao ? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Em vẫn chưa nghĩ ra cách order, nhưng em dùng mẹo 1 chút để ra kết quả giống đề bài vậy.

Mong 2 pro @Hai Ly Mien Tay và @doveandrose chỉ giáo thêm.

Mã:
Sub GPE()
    Dim Query As String
    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
  Query = "select f1,f2, iif(f1=f2,f3,null) from (SELECT A.f1, A.f2, iif(a.f1 = a.f2,B.f2, b.f2 + '1') as f3 " & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "LEFT JOIN [A2:B6] As B ON B.f1 = A.f1) order by f1,f3"
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
 
Em vẫn chưa nghĩ ra cách order, nhưng em dùng mẹo 1 chút để ra kết quả giống đề bài vậy.

Mong 2 pro @Hai Ly Mien Tay và @doveandrose chỉ giáo thêm.

Mã:
Sub GPE()
    Dim Query As String
    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
  Query = "select f1,f2, iif(f1=f2,f3,null) from (SELECT A.f1, A.f2, iif(a.f1 = a.f2,B.f2, b.f2 + '1') as f3 " & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "LEFT JOIN [A2:B6] As B ON B.f1 = A.f1) order by f1,f3"
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
Kết quả đúng rồi, tuy nhiên nên tìm cách nào đó dùng 1 sub query thôi.
 
Kết quả đúng rồi, tuy nhiên nên tìm cách nào đó dùng 1 sub query thôi.
Hóa ra order cũng dùng đc công thức. Em sửa lại ntn ạ.
Mã:
Sub GPE()
    Dim Query As String
    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
  Query = "SELECT A.f1, A.f2, iif(a.f1=a.f2,B.f2,null) " & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "LEFT JOIN [A2:B6] As B ON B.f1 = A.f1 ORDER BY a.f1, IIF(A.f1 = a.f2,b.f2,b.f2 + '1')"
 
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing


End Sub
 
Hóa ra order cũng dùng đc công thức. Em sửa lại ntn ạ.
Mã:
Sub GPE()
    Dim Query As String
    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
  Query = "SELECT A.f1, A.f2, iif(a.f1=a.f2,B.f2,null) " & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "LEFT JOIN [A2:B6] As B ON B.f1 = A.f1 ORDER BY a.f1, IIF(A.f1 = a.f2,b.f2,b.f2 + '1')"
 
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing


End Sub
Chính xác là như vậy, cảm ơn bạn đã tham gia, mong rằng đề tài này tiếp tục có nhiều thành viên quan tâm giống như bạn.
 
Tiện đây em cũng xin góp vui 1 bài toán về Tính tiền điện.
Các bạn coi file để rõ bài toán.
 

File đính kèm

  • Power.xls
    26.5 KB · Đọc: 19
Lần chỉnh sửa cuối:
Tiện đây em cũng xin góp vui 1 bài toán: Tính tiền điện bằng ADO.
Các bạn coi file để rõ bài toán.

Mình thấy cách đặt vấn đề có gì đó không ổn?

ADO là công cụ quản trị dữ liệu kết nối và khai thác CSDL từ các nguồn có hỗ trợ chứ đâu có tham gia tính toán.
Cái mà bạn nói là kết quả của SQL đấy chứ. Vậy nên, 1 chủ đề thảo luận nó cũng cần có mức độ chính xác nhất định kẻo "thiên hạ" đánh giá nhà ta.
 
Mình thấy cách đặt vấn đề có gì đó không ổn?

ADO là công cụ quản trị dữ liệu kết nối và khai thác CSDL từ các nguồn có hỗ trợ chứ đâu có tham gia tính toán.
Cái mà bạn nói là kết quả của SQL đấy chứ. Vậy nên, 1 chủ đề thảo luận nó cũng cần có mức độ chính xác nhất định kẻo "thiên hạ" đánh giá nhà ta.
Em cảm ơn anh đã góp ý, em đã sửa bài rùi ạ.
 
Em cảm ơn anh đã góp ý, em đã sửa bài rùi ạ.
Cái này cho vào hàm iif, kết hợp phép toán +,-,* là ra.
Đại loại ví dụ như sau:
IIf([SoDien]<=100,[SoDien]*2000,IIf([SoDien]<=200,100*2000+([SoDien]-100)*1600,IIf([SoDien]<=300,100*2000+100*1600+([SoDien]-200)*1200,IIf([SoDien]<=500,100*2000+100*1600+100*1200+([SoDien]-300)*1000,100*2000+100*1600+100*1200+200*1000+([SoDien]-500)*700))))

BẠn test thử nhé, xin lỗi vì chưa kiểm tra.
 
Web KT
Back
Top Bottom