hoahuongduong1986
Thành viên thường trực
- Tham gia
- 14/11/18
- Bài viết
- 346
- Được thích
- 40
Cảm ơn anh,Anh thấy kết quả ví dụ nó khác với câu lệnh em viết, anh tạm chỉnh như sau:
Mã:= Table.Group(#"Changed Type", {"Code"}, {{"Quantity", each List.Sum([Quantity]), type nullable number}, {"Date", each List.Min([Date]), type nullable date}})
ADO thì như sau:
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Connection") .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0") Sheet1.Range("M2").CopyFromRecordset .Execute("Select [Code], Min([Date]), Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code]") End With End Sub
Ở đây em thấy kết quả cột Date mới chỉ lấy một ngày đầu tiên. Nếu Lấy tất cả ngày và có cộng dồn nếu trùng ngày thì có làm được bằng ADO không ạ !Vậy em bổ sung thêm thế này:
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Connection") .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0") Sheet1.Range("S2").CopyFromRecordset .Execute("Select [Code], Min([Date]), Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code]") If Sheet1.Range("S2") <> "" Then Sheet1.Range([S2], [S65536].End(3)).Offset(, -1) = [row(a:a)] End With End Sub
Qua 3 cái code e có chút cảm nhận, dù với rất ít dữ liệu thôi nhưng: Dic cực mượt, ADO và PQ có chút chờ đợi, PQ thì khá hơn chỉ mất thời gian chạy lần đầu, từ lần sau nhanh hơn, còn ADO như là lần nào cũng phải tạo kết nối nên hơi chậm.
Nên dựa vào số dòng trong Recordset rồi gán xuống luôn em. Về tốc độ thì nhanh chậm chút ít thời gian, nhiều khi phải cho mắt nghỉ ngơi, hoặc đi uống cà phê . Quen cái nào thì dùng cái ấy thôi em.Vậy em bổ sung thêm thế này:
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Connection") .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0") Sheet1.Range("S2").CopyFromRecordset .Execute("Select [Code], Min([Date]), Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code]") If Sheet1.Range("S2") <> "" Then Sheet1.Range([S2], [S65536].End(3)).Offset(, -1) = [row(a:a)] End With End Sub
Qua 3 cái code e có chút cảm nhận, dù với rất ít dữ liệu thôi nhưng: Dic cực mượt, ADO và PQ có chút chờ đợi, PQ thì khá hơn chỉ mất thời gian chạy lần đầu, từ lần sau nhanh hơn, còn ADO như là lần nào cũng phải tạo kết nối nên hơi chậm.
Code ADO bạn hỏi anh @Hai Lúa Miền TâyỞ đây em thấy kết quả cột Date mới chỉ lấy một ngày đầu tiên. Nếu Lấy tất cả ngày và có cộng dồn nếu trùng ngày thì có làm được bằng ADO không ạ !
Bỏ tính toán của cột Date, Group By cột này là được nhé.Ở đây em thấy kết quả cột Date mới chỉ lấy một ngày đầu tiên. Nếu Lấy tất cả ngày và có cộng dồn nếu trùng ngày thì có làm được bằng ADO không ạ !
Sub Gop_HLMT()
With CreateObject("ADODB.Connection")
.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0")
Sheet1.Range("S2").CopyFromRecordset .Execute("Select [Code], [Date], Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code],[Date]")
End With
End Sub
Bỏ tính toán của cột Date, Group By cột này là được nhé.
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Connection") .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0") Sheet1.Range("S2").CopyFromRecordset .Execute("Select [Code], [Date], Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code],[Date]") End With End Sub
Code chạy đúng rồi ạ ! ADO đúng là thỏa đam mê vừa dùng SQL vừa dùng VBA. Hay anh ạ !Bỏ tính toán của cột Date, Group By cột này là được nhé.
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Connection") .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0") Sheet1.Range("S2").CopyFromRecordset .Execute("Select [Code], [Date], Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code],[Date]") End With End Sub
Oái, vậy là phải sửa lại code File của bài #15, bạn tự sửa và hoàn thiện nha.Code chạy đúng rồi ạ ! ADO đúng là thỏa đam mê vừa dùng SQL vừa dùng VBA. Hay anh ạ !
Gán trực tiếp Recordset ví dụ như sau nhe em.Vậy em bổ sung thêm thế này:
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Connection") .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0") Sheet1.Range("S2").CopyFromRecordset .Execute("Select [Code], Min([Date]), Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code]") If Sheet1.Range("S2") <> "" Then Sheet1.Range([S2], [S65536].End(3)).Offset(, -1) = [row(a:a)] End With End Sub
Qua 3 cái code e có chút cảm nhận, dù với rất ít dữ liệu thôi nhưng: Dic cực mượt, ADO và PQ có chút chờ đợi, PQ thì khá hơn chỉ mất thời gian chạy lần đầu, từ lần sau nhanh hơn, còn ADO như là lần nào cũng phải tạo kết nối nên hơi chậm.
Sub Gop_HLMT()
With CreateObject("ADODB.Recordset")
.Open "Select [Code], [Date], Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code],[Date]", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0", 1
Sheet1.Range("L2:O100").ClearContents
Sheet1.Range("M2").CopyFromRecordset .DataSource
Sheet1.Range("L2:L" & .RecordCount + 1) = [row(a:a)]
End With
End Sub
Hi anh @Hai Lúa Miền Tây, đoạn code này:Gán trực tiếp Recordset ví dụ như sau nhe em.
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Recordset") .Open "Select [Code], [Date], Sum(Quantity) From [ArrayList$] where [Code] Is Not Null Group By [Code],[Date]", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0", 1 Sheet1.Range("L2:O100").ClearContents Sheet1.Range("M2").CopyFromRecordset .DataSource Sheet1.Range("L2:L" & .RecordCount + 1) = [row(a:a)] End With End Sub
From [ArrayList$]
Lấy hết dữ liệu có trong sheet đó em.Hi anh @Hai Lúa Miền Tây, đoạn code này:
Nó sẽ tạo connection đến vùng đầu tiên của sheet ArrayList đúng không anh?Mã:From [ArrayList$]
Em tạo 1 sheet mới và chạy code sau để đổ dữ liệu vào sheet mới. Từ đó nghiệm ra nhé.Trong sheet đó đang còn nhiều bảng mà anh nhỉ? e đang hiểu là nó chỉ connection đến vùng đầu tiên để tính toán.
View attachment 266062
Sub Gop_HLMT()
With CreateObject("ADODB.Recordset")
.Open "Select * From [ArrayList$] ", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0", 1
Sheet2.Range("M2").CopyFromRecordset .DataSource
Sheet2.Range("L2:L" & .RecordCount + 1) = [row(a:a)]
End With
End Sub
Em có tạo sheet mởi, xóa vùng đầu tiên đi, thì kết quả nó lấy ở vùng tiếp theo. (Đỏ là vùng kết quả)Em tạo 1 sheet mới và chạy code sau để đổ dữ liệu vào sheet mới. Từ đó nghiệm ra nhé.
Mã:Sub Gop_HLMT() With CreateObject("ADODB.Recordset") .Open "Select * From [ArrayList$] ", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0", 1 Sheet2.Range("L2:O100").ClearContents Sheet2.Range("M2").CopyFromRecordset .DataSource Sheet2.Range("L2:L" & .RecordCount + 1) = [row(a:a)] End With End Sub
Anh đoán là em đang (select tencot) chứ không phải (select *)Em có tạo sheet mởi, xóa vùng đầu tiên đi, thì kết quả nó lấy ở vùng tiếp theo. (Đỏ là vùng kết quả)
View attachment 266064
uhm, bạn phần Groupby thì bạn add thêm trường Date vào thôi, còn đến giờ tôi cũng chưa biết là sai hay là đúng? Chưa thấy chủ thớt chốt lại kết quả như thế nào là đúng í đó.video này sai đúng không bạn? Mình chỉ cần sửa là group theo code và date là được.