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
Kính gửi anh chị,
Code kèm theo File hiện mới chỉ lấy Date là ngày đầu tiên. Giờ sửa code thế nào để nó lấy tất cả ngày (có cộng dồn nếu trùng ngày) ạ. Em cảm ơn ạ.
Sub DictionaryFilter()
Dim Dic As Object
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
lRow = .Range("B" & Rows.Count).End(xlUp).Row
ArrData = .Range("B2:D" & lRow).Value2
lRow = UBound(ArrData, 1)
ReDim Result(1 To lRow, 1 To 4)
For i = 1 To lRow
sKey = ArrData(i, 1) & "|" & ArrData(i, 2)
If sKey <> "" Then
If Not Dic.Exists(sKey) Then
j = j + 1
Dic.Add sKey, j
Result(j, 1) = j
Result(j, 2) = ArrData(i, 1)
Result(j, 3) = ArrData(i, 2)
Result(j, 4) = ArrData(i, 3)
Else
Result(Dic.Item(sKey), 4) = Result(Dic.Item(sKey), 4) + ArrData(i, 3)
End If
End If
Next i
If j > 0 Then
.Range("H2").Resize(100, 4).ClearContents
.Range("H2").Resize(j, 4) = Result
End If
End With
End Sub
Đúng là em cần thế này rồi ạ ! Em cảm ơn anh nhiều !Không biết phải bạn đang muốn thế này không?Mã:Sub DictionaryFilter() Dim Dic As Object Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long Set Dic = CreateObject("Scripting.Dictionary") With Sheet1 lRow = .Range("B" & Rows.Count).End(xlUp).Row ArrData = .Range("B2:D" & lRow).Value2 lRow = UBound(ArrData, 1) ReDim Result(1 To lRow, 1 To 4) For i = 1 To lRow [ICODE] sKey = ArrData(i, 1) & "|" & ArrData(i, 2)[/ICODE] If sKey <> "" Then If Not Dic.Exists(sKey) Then j = j + 1 Dic.Add sKey, j Result(j, 1) = j Result(j, 2) = [ICODE]ArrData(i, 1)[/ICODE] Result(j, 3) = ArrData(i, 2) Result(j, 4) = ArrData(i, 3) Else Result(Dic.Item(sKey), 4) = Result(Dic.Item(sKey), 4) + ArrData(i, 3) End If End If Next i If j > 0 Then .Range("H2").Resize(100, 4).ClearContents .Range("H2").Resize(j, 4) = Result End If End With End Sub
Từ phiên bản excel 2016 thì PQ là tool có sẵn.Máy không có Power Query thì làm thế nào bạn?
Tôi mua bản quyền 2013 cứng theo máy. Chờ cái máy hư, sắm máy khác mới đổi bộ Office đượcTừ phiên bản excel 2016 thì PQ là tool có sẵn.
Còn từ 2013 trở về trước thì phải cài addin
Mà giờ đã ra mắt đến O2021 rồi thì chắc cũng nên up tối thiểu lên 2016 dùng cho đủ tính năng.
Thế thì chịu rồi. PQ là 1 tool, thêm được thì tốt. Kết hợp được cả VBA thì song kiếm hợp hợp tích càng mạnh mẽ hơn thôi.Tôi mua bản quyền 2013 cứng theo máy. Chờ cái máy hư, sắm máy khác mới đổi bộ Office được
O2013 không biết đã có power pivot chưa anh nhỉ? Nếu không có thì cũng đáng phải upgrade thật.Tôi mua bản quyền 2013 cứng theo máy. Chờ cái máy hư, sắm máy khác mới đổi bộ Office được
Vâng anh, thực tế mà có 5, 7 bảng liên kết với nhau thì làm báo cáo dùng nó cũng đỡ mệt hơn chút.Có rồi bạn. Đây là từ tài liệu của bác ptm0412 và tôi đã Enable nó. Nhưng xong rồi cũng để vậy thôi chứ tôi chưa dùng tới bao giờ.
View attachment 265862
1. Bạn đang dùng bộ Office năm nào? như có trao đổi ở trên, từ phiên bản 2016 thì Power Query có sẵn, còn trở về trước cần cài thêm Addin.Bác có thể hướng dẫn giúp em từng bước thao tác PW để ra được kết quả như trong file của bác không
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ột giải pháp dùng Power Query, chỉ cần thao tác chuột, không đụng đến một chút VBA nào.
Click Power Query nhé
= Table.Group(#"Changed Type", {"Code"}, {{"Quantity", each List.Sum([Quantity]), type nullable number}, {"Date", each List.Min([Date]), type nullable date}})
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
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
em đang dùng office 365, bài của e cũng tương tự giống vậy, đồng thời em cũng đang tìm hiểu về PW1. Bạn đang dùng bộ Office năm nào? như có trao đổi ở trên, từ phiên bản 2016 thì Power Query có sẵn, còn trở về trước cần cài thêm Addin.
2. File của bạn cũng giống File của chủ thớt? Vì mỗi bài sẽ có cách thao tác khác nhau, bạn nên mở hẳn một Topic khác hỏi, có khi ngoài PQ ra sẽ có nhiều giải pháp khác.
365 thì xịn xò nhất rồi. Tôi quay lại video nhé. Thử áp dụng xem sao.em đang dùng office 365, bài của e cũng tương tự giống vậy, đồng thời em cũng đang tìm hiểu về PW
Để làm thuần trong SQL phải dựa vào dữ liệu và hợi phức tạp. Có thể kết hợp với VBA để đánh số cho nó.Cảm ơn anh,
Thiếu xót quá, không thấy chủ Topic ý kiến gì? Vậy cả code bài #2 cũng chưa chuẩn. Chỉ Group theo Mã sản phẩm.
Em có sửa lại để File cả 3 giải pháp: Dictionary, PowerQuery, ADO.
Anh @Hai Lúa Miền Tây code thêm cho bạn trường số thứ tự nữa là đẹp ạ. Phần ADO em không biết code thế nào.
Vậy em bổ sung thêm thế này:Để làm thuần trong SQL phải dựa vào dữ liệu và hợi phức tạp. Có thể kết hợp với VBA để đánh số cho nó.
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