Tính toán và đếm hàng hóa xuất nhập khẩu dùng Dictionary (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
346
Được thích
40
Kính gửi anh chị,
Em mới tham khảo và làm được code lọc cột C, D, E tại sheet DIC.
=> Nhờ a chị và các bạn hỗ trợ tính, đếm thêm cột F và G như ví dụ em có làm cho mã WLD với điều kiện trường Reporter ISO tại sheet Data bỏ toàn bộ các khách mã có ký tự bắt đầu bằng chữ A và kết quả xuất ra theo thứ tự lớn giảm dần của tổng Trade Value (US$). Em cảm ơn ạ !
 

File đính kèm

Sao không thử dùng Power Query bạn nhỉ? Có đếm, có tính tổng, có cả sắp xếp luôn.
 
Upvote 0
Sao bạn không làm báo cáo kiểu như thế này? sẽ dễ dàng cho việc thống kê, tính toán (và khả năng bạn cũng sẽ tự code được luôn)

Snag_31917.png
 
Upvote 0
mọi người cho em hỏi bài 2 sheet Index và 3 cột cuối của sheet bài 3 với ạ. Em mới tham gia nên chưa biết đăng bài mà giờ em cần gấp huhu
 

File đính kèm

Upvote 0
Sao bạn không làm báo cáo kiểu như thế này? sẽ dễ dàng cho việc thống kê, tính toán (và khả năng bạn cũng sẽ tự code được luôn)

View attachment 266143
Theo bạn í, hình như còn điều kiện trong cột Reporter ISO bỏ toàn bộ các khách mã có ký tự bắt đầu bằng chữ A nữa mà, nếu vậy cột tổng Trade Value (US$) ra đâu đúng phải không em
Thí dụ của bạn í hình như cũng không đúng
 
Upvote 0
Theo bạn í, hình như còn điều kiện trong cột Reporter ISO bỏ toàn bộ các khách mã có ký tự bắt đầu bằng chữ A nữa mà, nếu vậy cột tổng Trade Value (US$) ra đâu đúng phải không em
Thí dụ của bạn í hình như cũng không đúng
Ví dụ của em là em mới làm được code tính cho tất cả thôi ạ. Em chưa biết loại bỏ nếu dùng DIC ạ.
Bài đã được tự động gộp:

mọi người cho em hỏi bài 2 sheet Index và 3 cột cuối của sheet bài 3 với ạ. Em mới tham gia nên chưa biết đăng bài mà giờ em cần gấp huhu
Của bạn đây nhé. Lần sau đăng bài mới nhé, đừng xen vào bài tớ như thế.he
 

File đính kèm

Upvote 0
Kính gửi anh chị,
Em mới tham khảo và làm được code lọc cột C, D, E tại sheet DIC.
=> Nhờ a chị và các bạn hỗ trợ tính, đếm thêm cột F và G như ví dụ em có làm cho mã WLD với điều kiện trường Reporter ISO tại sheet Data bỏ toàn bộ các khách mã có ký tự bắt đầu bằng chữ A và kết quả xuất ra theo thứ tự lớn giảm dần của tổng Trade Value (US$). Em cảm ơn ạ !
Bài này làm xong mà kiểm tra được mình...chết liền, riêng số tiền thằng đầu tiên thì hoàn toàn chính xác, mấy thằng sau không biết. Bài gì mà ghê quá
Bạn kiểm tra nhé, có gì chưa ưng ý thì tự sửa
Trời, đang hỏi bài tranh thủ trả lời luôn, quá dữ
Thân, còn cái sắp xếp thì tự Sort đi nhé bạn
 

File đính kèm

Upvote 0
Bài này làm xong mà kiểm tra được mình...chết liền, riêng số tiền thằng đầu tiên thì hoàn toàn chính xác, mấy thằng sau không biết. Bài gì mà ghê quá
Bạn kiểm tra nhé, có gì chưa ưng ý thì tự sửa
Trời, đang hỏi bài tranh thủ trả lời luôn, quá dữ
Thân, còn cái sắp xếp thì tự Sort đi nhé bạn
hi. Em cảm ơn Anh nhiều ạ !!! Em sẽ tự vọc vạch phần còn lại ạ.
 
Upvote 0
Kính gửi anh chị,
Em mới tham khảo và làm được code lọc cột C, D, E tại sheet DIC.
=> Nhờ a chị và các bạn hỗ trợ tính, đếm thêm cột F và G như ví dụ em có làm cho mã WLD với điều kiện trường Reporter ISO tại sheet Data bỏ toàn bộ các khách mã có ký tự bắt đầu bằng chữ A và kết quả xuất ra theo thứ tự lớn giảm dần của tổng Trade Value (US$). Em cảm ơn ạ !
Góp vui chống dịch. Xem thử xem.
 

File đính kèm

Upvote 0
Kính gửi anh chị,
Em mới tham khảo và làm được code lọc cột C, D, E tại sheet DIC.
=> Nhờ a chị và các bạn hỗ trợ tính, đếm thêm cột F và G như ví dụ em có làm cho mã WLD với điều kiện trường Reporter ISO tại sheet Data bỏ toàn bộ các khách mã có ký tự bắt đầu bằng chữ A và kết quả xuất ra theo thứ tự lớn giảm dần của tổng Trade Value (US$). Em cảm ơn ạ !
Góp vui
Mã:
Sub XYZ()
  Dim dic As Scripting.Dictionary, sArr(), Res()
  Dim iKey$, sRow&, i&, k&, ik&, c&
 
  With Sheets("Data")
    sArr = .Range("D2", .Range("J" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 11)
  Set dic = CreateObject("Scripting.Dictionary")
  dic.Add "Export", 4:        dic.Add "Import", 5
  dic.Add "Re-Export", 6:    dic.Add "Re-Import", 7
  For i = 1 To UBound(sArr)
    iKey = sArr(i, 5)
    If Not IsEmpty(iKey) Then
      If Mid(sArr(i, 3), 1, 1) <> "A" Then 'Loai Khach Hang "A.."
        If Not dic.Exists(iKey) Then
          k = k + 1
          dic.Add iKey, k
          Res(k, 1) = k
          Res(k, 2) = iKey
        End If
        ik = dic.Item(iKey)
        Res(ik, 3) = Res(ik, 3) + sArr(i, 7)
        c = dic.Item(sArr(i, 1))
        Res(ik, c) = Res(ik, c) + 1 'Dem So Luong
        Res(ik, c + 4) = Res(ik, c + 4) + sArr(i, 7) 'Tong gia tri
      End If
    End If
  Next i
  For i = 1 To k
    Res(i, 4) = "Export: " & Res(i, 4) & " /Import: " & Res(i, 5) & _
                "/Re-Export: " & Res(i, 6) & " /Re-Import: " & Res(i, 7)
    Res(i, 5) = "Export: " & Replace(Format(Res(i, 8), "#,###"), ",", ".") & _
                " /Import: " & Replace(Format(Res(i, 9), "#,###"), ",", ".") & _
                "/Re-Export: " & Replace(Format(Res(i, 10), "#,###"), ",", ".") & _
                " /Re-Import: " & Replace(Format(Res(i, 11), "#,###"), ",", ".")
  Next i
  Sheets("Dic").Range("C2").Resize(k, 5).Value = Res
End Sub
 
Upvote 0
Góp vui
Mã:
Sub XYZ()
  Dim dic As Scripting.Dictionary, sArr(), Res()
  Dim iKey$, sRow&, i&, k&, ik&, c&
 
  With Sheets("Data")
    sArr = .Range("D2", .Range("J" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 11)
  Set dic = CreateObject("Scripting.Dictionary")
  dic.Add "Export", 4:        dic.Add "Import", 5
  dic.Add "Re-Export", 6:    dic.Add "Re-Import", 7
  For i = 1 To UBound(sArr)
    iKey = sArr(i, 5)
    If Not IsEmpty(iKey) Then
      If Mid(sArr(i, 3), 1, 1) <> "A" Then 'Loai Khach Hang "A.."
        If Not dic.Exists(iKey) Then
          k = k + 1
          dic.Add iKey, k
          Res(k, 1) = k
          Res(k, 2) = iKey
        End If
        ik = dic.Item(iKey)
        Res(ik, 3) = Res(ik, 3) + sArr(i, 7)
        c = dic.Item(sArr(i, 1))
        Res(ik, c) = Res(ik, c) + 1 'Dem So Luong
        Res(ik, c + 4) = Res(ik, c + 4) + sArr(i, 7) 'Tong gia tri
      End If
    End If
  Next i
  For i = 1 To k
    Res(i, 4) = "Export: " & Res(i, 4) & " /Import: " & Res(i, 5) & _
                "/Re-Export: " & Res(i, 6) & " /Re-Import: " & Res(i, 7)
    Res(i, 5) = "Export: " & Replace(Format(Res(i, 8), "#,###"), ",", ".") & _
                " /Import: " & Replace(Format(Res(i, 9), "#,###"), ",", ".") & _
                "/Re-Export: " & Replace(Format(Res(i, 10), "#,###"), ",", ".") & _
                " /Re-Import: " & Replace(Format(Res(i, 11), "#,###"), ",", ".")
  Next i
  Sheets("Dic").Range("C2").Resize(k, 5).Value = Res
End Sub
Vẫn chỉ là 1 đít sần. Quá hay ạ !!!
 
Upvote 0
Hoa hướng dương nên được mặt trời chiếu --=0

Hic, mấy bữa nay cái laptop bị loạn phím, phải dùng On-screen Keyboard, nên chẳng làm được gì cả
 
Upvote 0
Upvote 0
Bài này dùng Pivot table đơn giản cũng được, mà Power query cũng được. Nhờ dùng công cụ có sẵn nên phát hiện vô số dòng bị bỏ trống cột Partner ISO, trong khi code VBA nếu không cẩn thận sẽ bỏ qua
 

File đính kèm

Upvote 0
Power query thêm 2 cột nối chuỗi thì y hệt kết quả mong muốn
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Source1= Table.SelectRows(Source, each Text.Start([Reporter ISO],1) <> "A"),
    Source2 = Table.SelectColumns(Source1,{"Partner ISO","Trade Flow","Trade Value (US$)"}),
    GroupBy1 = Table.Group(Source2, {"Partner ISO", "Trade Flow"}, {{"Count", each Table.RowCount(_), Int64.Type}, {"Total", each
 List.Sum([#"Trade Value (US$)"]), type number}}),
    AddTradeFlow = Table.AddColumn(GroupBy1, "TradeFlow2", each [Trade Flow] & "C"),
    PivotTable = Table.Pivot(AddTradeFlow,{"Import","Export","Re-Import","Re-Export"},"Trade Flow","Total"),
    PivotTable2 =  Table.Pivot(PivotTable,{"ImportC","ExportC","Re-ImportC","Re-ExportC"},"TradeFlow2","Count"),
    GroupBy2 = Table.Group(PivotTable2, {"Partner ISO"}, {{"SumImport", each List.Sum([Import]), type nullable number}, {"SumExport", each
 List.Sum([Export]), type nullable number}, {"SumReImport", each List.Sum([#"Re-Import"]), type nullable number}, {"SumReExport", each
 List.Sum([#"Re-Export"]), type nullable number}, {"CountImport", each List.Sum([ImportC]), type nullable number}, {"CountExport", each
 List.Sum([ExportC]), type nullable number}, {"CountReImport", each List.Sum([#"Re-ImportC"]), type nullable number}, {"CountReExport", 
each List.Sum([#"Re-ExportC"]), type nullable number}}),
    ReplaceNull = Table.ReplaceValue(GroupBy2,null,0,Replacer.ReplaceValue,{"SumImport", "SumExport", "SumReImport", "SumReExport",
 "CountImport", "CountExport", "CountReImport", "CountReExport"}),
    ExtraColumn1 = Table.AddColumn(ReplaceNull, "CountTradeFlow", each "Export: " & Text.From([CountExport]) & "; Import: " &
        Text.From([CountImport]) & "; Re-Export: " &     Text.From([CountReExport]) & "; Re-Import: " & Text.From([CountReImport])),
    ExtraColumn2 = Table.AddColumn(ExtraColumn1, "Total US$", each "Export: " & Text.From([SumExport]) & "; Import: " &
        Text.From([SumImport]) & "; Re-Export: " &     Text.From([SumReExport]) & "; Re-Import: " & Text.From([SumReImport])),
   SelectColumn = Table.SelectColumns(ExtraColumn2,{"Partner ISO","CountTradeFlow","Total US$"}),
    AddIndex = Table.AddIndexColumn(SelectColumn, "Index", 1, 1, Int64.Type),
    ReOrder = Table.ReorderColumns(AddIndex,{"Index", "Partner ISO", "CountTradeFlow", "Total US$"})
in
    ReOrder
1631764617633.png
 
Lần chỉnh sửa cuối:
Upvote 0
Hoa hướng dương nên được mặt trời chiếu --=0

Hic, mấy bữa nay cái laptop bị loạn phím, phải dùng On-screen Keyboard, nên chẳng làm được gì cả
Công nhận ạ, em không thấy anh Maika lại nghĩ chắc anh bận gì đó nên không thấy
Power query thêm 2 cột nối chuỗi thì y hệt kết quả mong muốn
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Source1= Table.SelectRows(Source, each Text.Start([Reporter ISO],1) <> "A"),
    Source2 = Table.SelectColumns(Source1,{"Partner ISO","Trade Flow","Trade Value (US$)"}),
    GroupBy1 = Table.Group(Source2, {"Partner ISO", "Trade Flow"}, {{"Count", each Table.RowCount(_), Int64.Type}, {"Total", each
 List.Sum([#"Trade Value (US$)"]), type number}}),
    AddTradeFlow = Table.AddColumn(GroupBy1, "TradeFlow2", each [Trade Flow] & "C"),
    PivotTable = Table.Pivot(AddTradeFlow,{"Import","Export","Re-Import","Re-Export"},"Trade Flow","Total"),
    PivotTable2 =  Table.Pivot(PivotTable,{"ImportC","ExportC","Re-ImportC","Re-ExportC"},"TradeFlow2","Count"),
    GroupBy2 = Table.Group(PivotTable2, {"Partner ISO"}, {{"SumImport", each List.Sum([Import]), type nullable number}, {"SumExport", each
 List.Sum([Export]), type nullable number}, {"SumReImport", each List.Sum([#"Re-Import"]), type nullable number}, {"SumReExport", each
 List.Sum([#"Re-Export"]), type nullable number}, {"CountImport", each List.Sum([ImportC]), type nullable number}, {"CountExport", each
 List.Sum([ExportC]), type nullable number}, {"CountReImport", each List.Sum([#"Re-ImportC"]), type nullable number}, {"CountReExport",
each List.Sum([#"Re-ExportC"]), type nullable number}}),
    ReplaceNull = Table.ReplaceValue(GroupBy2,null,0,Replacer.ReplaceValue,{"SumImport", "SumExport", "SumReImport", "SumReExport",
 "CountImport", "CountExport", "CountReImport", "CountReExport"}),
    ExtraColumn1 = Table.AddColumn(ReplaceNull, "CountTradeFlow", each "Export: " & Text.From([CountExport]) & "; Import: " &
        Text.From([CountImport]) & "; Re-Export: " &     Text.From([CountReExport]) & "; Re-Import: " & Text.From([CountReImport])),
    ExtraColumn2 = Table.AddColumn(ExtraColumn1, "Total US$", each "Export: " & Text.From([SumExport]) & "; Import: " &
        Text.From([SumImport]) & "; Re-Export: " &     Text.From([SumReExport]) & "; Re-Import: " & Text.From([SumReImport])),
   SelectColumn = Table.SelectColumns(ExtraColumn2,{"Partner ISO","CountTradeFlow","Total US$"}),
    AddIndex = Table.AddIndexColumn(SelectColumn, "Index", 1, 1, Int64.Type),
    ReOrder = Table.ReorderColumns(AddIndex,{"Index", "Partner ISO", "CountTradeFlow", "Total US$"})
in
    ReOrder
View attachment 266187
hay quá anh ạ. Thế làm bằng ADO có được không ạ, kiểu như SQL ấy ạ. Em thấy một số anh chị cũng hay dùng ADO ạ.
 
Upvote 0
hay quá anh ạ. Thế làm bằng ADO có được không ạ, kiểu như SQL ấy ạ. Em thấy một số anh chị cũng hay dùng ADO ạ.
Chắc là làm được. Riêng bài này xài ADO không hay lắm, câu SQL sẽ khá phức tạp. Power query thì xé nhỏ sự phức tạp thành những steps.
 
Upvote 0
Công nhận ạ, em không thấy anh Maika lại nghĩ chắc anh bận gì đó nên không thấy

hay quá anh ạ. Thế làm bằng ADO có được không ạ, kiểu như SQL ấy ạ. Em thấy một số anh chị cũng hay dùng ADO ạ.
Bài này Dictionary chắc là vô địch rồi. Cẩn thận lại loạn chưởng đó bạn
 
Upvote 0
Phần M code để soạn được như sư phụ @ptm0412 quá khó thật.
Tôi cũng làm bằng PowerQuery nhưng các bước tường minh như những gì bài toán đặt ra:
B1: Khởi tạo Query để tính tổng theo Partner ISO (có bỏ đi chữ A đầu của Reporter ISO)
B2: Khởi tạo 3 Query để tính tổng theo Partner ISO và Trade Flow
B3: Merge 3 Query của B2 vào B1. Thêm chút gia vị nối chuỗi, add index, remove một số cột không cần thiết.

Đường có vẻ hơi xa, nhưng vẫn đến đích. Hy vọng có thêm giải pháp cho bạn.
 

File đính kèm

Upvote 0
Upvote 0
Góp vui
Mã:
Sub XYZ()
  Dim dic As Scripting.Dictionary, sArr(), Res()
  Dim iKey$, sRow&, i&, k&, ik&, c&
 
  With Sheets("Data")
    sArr = .Range("D2", .Range("J" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 11)
  Set dic = CreateObject("Scripting.Dictionary")
  dic.Add "Export", 4:        dic.Add "Import", 5
  dic.Add "Re-Export", 6:    dic.Add "Re-Import", 7
  For i = 1 To UBound(sArr)
    iKey = sArr(i, 5)
    If Not IsEmpty(iKey) Then
      If Mid(sArr(i, 3), 1, 1) <> "A" Then 'Loai Khach Hang "A.."
        If Not dic.Exists(iKey) Then
          k = k + 1
          dic.Add iKey, k
          Res(k, 1) = k
          Res(k, 2) = iKey
        End If
        ik = dic.Item(iKey)
        Res(ik, 3) = Res(ik, 3) + sArr(i, 7)
        c = dic.Item(sArr(i, 1))
        Res(ik, c) = Res(ik, c) + 1 'Dem So Luong
        Res(ik, c + 4) = Res(ik, c + 4) + sArr(i, 7) 'Tong gia tri
      End If
    End If
  Next i
  For i = 1 To k
    Res(i, 4) = "Export: " & Res(i, 4) & " /Import: " & Res(i, 5) & _
                "/Re-Export: " & Res(i, 6) & " /Re-Import: " & Res(i, 7)
    Res(i, 5) = "Export: " & Replace(Format(Res(i, 8), "#,###"), ",", ".") & _
                " /Import: " & Replace(Format(Res(i, 9), "#,###"), ",", ".") & _
                "/Re-Export: " & Replace(Format(Res(i, 10), "#,###"), ",", ".") & _
                " /Re-Import: " & Replace(Format(Res(i, 11), "#,###"), ",", ".")
  Next i
  Sheets("Dic").Range("C2").Resize(k, 5).Value = Res
End Sub
Cảm ơn Anh đã trợ giúp code hay ạ !
Góp vui
Mã:
Sub XYZ()
  Dim dic As Scripting.Dictionary, sArr(), Res()
  Dim iKey$, sRow&, i&, k&, ik&, c&
 
  With Sheets("Data")
    sArr = .Range("D2", .Range("J" & Rows.Count).End(xlUp)).Value
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 11)
  Set dic = CreateObject("Scripting.Dictionary")
  dic.Add "Export", 4:        dic.Add "Import", 5
  dic.Add "Re-Export", 6:    dic.Add "Re-Import", 7
  For i = 1 To UBound(sArr)
    iKey = sArr(i, 5)
    If Not IsEmpty(iKey) Then
      If Mid(sArr(i, 3), 1, 1) <> "A" Then 'Loai Khach Hang "A.."
        If Not dic.Exists(iKey) Then
          k = k + 1
          dic.Add iKey, k
          Res(k, 1) = k
          Res(k, 2) = iKey
        End If
        ik = dic.Item(iKey)
        Res(ik, 3) = Res(ik, 3) + sArr(i, 7)
        c = dic.Item(sArr(i, 1))
        Res(ik, c) = Res(ik, c) + 1 'Dem So Luong
        Res(ik, c + 4) = Res(ik, c + 4) + sArr(i, 7) 'Tong gia tri
      End If
    End If
  Next i
  For i = 1 To k
    Res(i, 4) = "Export: " & Res(i, 4) & " /Import: " & Res(i, 5) & _
                "/Re-Export: " & Res(i, 6) & " /Re-Import: " & Res(i, 7)
    Res(i, 5) = "Export: " & Replace(Format(Res(i, 8), "#,###"), ",", ".") & _
                " /Import: " & Replace(Format(Res(i, 9), "#,###"), ",", ".") & _
                "/Re-Export: " & Replace(Format(Res(i, 10), "#,###"), ",", ".") & _
                " /Re-Import: " & Replace(Format(Res(i, 11), "#,###"), ",", ".")
  Next i
  Sheets("Dic").Range("C2").Resize(k, 5).Value = Res
End Sub
Anh cho em hỏi. Việt add thêm item 4,5,6,7 là ý nghĩa gì ạ. Em đọc code khá dễ hiểu nhưng chỗ này em không hiểu ạ. Em cảm ơn anh.
dic.Add "Export", 4
dic.Add "Import", 5
dic.Add "Re-Export", 6
dic.Add "Re-Import", 7
 
Upvote 0

File đính kèm

Upvote 0
Bài này dùng Pivot table đơn giản cũng được, mà Power query cũng được. Nhờ dùng công cụ có sẵn nên phát hiện vô số dòng bị bỏ trống cột Partner ISO, trong khi code VBA nếu không cẩn thận sẽ bỏ qua
Cái vụ dùng VBA phải kiểm soát dữ liệu trước tôi đã khuyến cáo mấy năm trước rồi.
Nhưng ở đây bà con thần thánh nó quá nên không thèm để ý.

... Thế làm bằng ADO có được không ạ, kiểu như SQL ấy ạ. Em thấy một số anh chị cũng hay dùng ADO ạ.
Cho biết bạn có tất cả mấy bảng, và muốn trích những trường nào, lọc theo trường nào.
Muốn "học [lời của bạn]" SQL thì ít nhất phải làm được điều trên.
 
Upvote 0
Cái vụ dùng VBA phải kiểm soát dữ liệu trước tôi đã khuyến cáo mấy năm trước rồi.
Cột Partner ISO có những dòng bị bỏ trống, nếu tạo Dic dựa vào cột này thường sẽ bị bỏ qua. Vì thường là có
If abc <> "" Then Dic.Add abc, ""
 
Lần chỉnh sửa cuối:
Upvote 0
Power query thêm 2 cột nối chuỗi thì y hệt kết quả mong muốn
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Source1= Table.SelectRows(Source, each Text.Start([Reporter ISO],1) <> "A"),
    Source2 = Table.SelectColumns(Source1,{"Partner ISO","Trade Flow","Trade Value (US$)"}),
    GroupBy1 = Table.Group(Source2, {"Partner ISO", "Trade Flow"}, {{"Count", each Table.RowCount(_), Int64.Type}, {"Total", each
 List.Sum([#"Trade Value (US$)"]), type number}}),
    AddTradeFlow = Table.AddColumn(GroupBy1, "TradeFlow2", each [Trade Flow] & "C"),
    PivotTable = Table.Pivot(AddTradeFlow,{"Import","Export","Re-Import","Re-Export"},"Trade Flow","Total"),
    PivotTable2 =  Table.Pivot(PivotTable,{"ImportC","ExportC","Re-ImportC","Re-ExportC"},"TradeFlow2","Count"),
    GroupBy2 = Table.Group(PivotTable2, {"Partner ISO"}, {{"SumImport", each List.Sum([Import]), type nullable number}, {"SumExport", each
 List.Sum([Export]), type nullable number}, {"SumReImport", each List.Sum([#"Re-Import"]), type nullable number}, {"SumReExport", each
 List.Sum([#"Re-Export"]), type nullable number}, {"CountImport", each List.Sum([ImportC]), type nullable number}, {"CountExport", each
 List.Sum([ExportC]), type nullable number}, {"CountReImport", each List.Sum([#"Re-ImportC"]), type nullable number}, {"CountReExport",
each List.Sum([#"Re-ExportC"]), type nullable number}}),
    ReplaceNull = Table.ReplaceValue(GroupBy2,null,0,Replacer.ReplaceValue,{"SumImport", "SumExport", "SumReImport", "SumReExport",
 "CountImport", "CountExport", "CountReImport", "CountReExport"}),
    ExtraColumn1 = Table.AddColumn(ReplaceNull, "CountTradeFlow", each "Export: " & Text.From([CountExport]) & "; Import: " &
        Text.From([CountImport]) & "; Re-Export: " &     Text.From([CountReExport]) & "; Re-Import: " & Text.From([CountReImport])),
    ExtraColumn2 = Table.AddColumn(ExtraColumn1, "Total US$", each "Export: " & Text.From([SumExport]) & "; Import: " &
        Text.From([SumImport]) & "; Re-Export: " &     Text.From([SumReExport]) & "; Re-Import: " & Text.From([SumReImport])),
   SelectColumn = Table.SelectColumns(ExtraColumn2,{"Partner ISO","CountTradeFlow","Total US$"}),
    AddIndex = Table.AddIndexColumn(SelectColumn, "Index", 1, 1, Int64.Type),
    ReOrder = Table.ReorderColumns(AddIndex,{"Index", "Partner ISO", "CountTradeFlow", "Total US$"})
in
    ReOrder
View attachment 266187
Có thể xử lý chuỗi ngay bước group luôn bạn, viết kiểu vầy
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Classification", type text}, {"Year", Int64.Type}, {"Trade Flow Code", Int64.Type}, {"Trade Flow", type text}, {"Reporter Code", Int64.Type}, {"Reporter ISO", type text}, {"Partner", type text}, {"Partner ISO", type text}, {"Commodity Code", Int64.Type}, {"Trade Value (US$)", Int64.Type}}),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each (Text.Start([Reporter ISO],1) <> "A")),
    #"Grouped Rows" = Table.Group(#"Filtered Rows", {"Partner ISO", "Trade Flow"}, {{"Count", each Table.RowCount(_), Int64.Type}, {"Value", each List.Sum([#"Trade Value (US$)"]), type nullable number}}),
    #"Grouped Rows1" = Table.Group(#"Grouped Rows", {"Partner ISO"}, 
        {
            {"Count", each 
            let
                lst_trans=List.Transform(List.Positions([Trade Flow]),(i)=>[Trade Flow]{i}&": "& Text.From([Count]{i}))
            in
                Text.Combine(lst_trans,", "),Text.Type},
            {"Value", each 
            let
                lst_trans=List.Transform(List.Positions([Trade Flow]),(i)=>[Trade Flow]{i}&": "& Text.From([Value]{i}))
            in
                Text.Combine(lst_trans,", "),Text.Type}

         })
in
    #"Grouped Rows1"
 
Upvote 0
Công nhận ạ, em không thấy anh Maika lại nghĩ chắc anh bận gì đó nên không thấy

hay quá anh ạ. Thế làm bằng ADO có được không ạ, kiểu như SQL ấy ạ. Em thấy một số anh chị cũng hay dùng ADO ạ.
Bạn dùng code này, thêm sheet3 để lưu kết quả:
Mã:
Sub ADOTest()
    Dim cnn As ADODB.Connection, rs As Recordset
    Dim s As String
    Set cnn = New Connection
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Macro;HDR=YES"";"
    cnn.Open s
    Set rs = New Recordset
    s = "SELECT [Partner ISO], sum([trade value (us$)]), sum(L_Import) &  '/'  & sum(L_Export) & '/' &  sum([L_Re-Import]) & '/' &  sum([L_Re-Export]) as SL, sum(T_Import) &  '/'  & sum(T_Export) & '/' &  sum([T_Re-Import]) & '/' &  sum([T_Re-Export]) as ST FROM (SELECT  [Partner ISO], [trade value (us$)], iif([Trade Flow Code]=1,1,0) as L_Import, iif([Trade Flow Code]=2,1,0) as L_Export, iif([Trade Flow Code]=3,1,0) as [L_Re-Import], iif([Trade Flow Code]=4,1,0) as [L_Re-Export], iif([Trade Flow Code]=1,[trade value (us$)] ,0) as T_Import, iif([Trade Flow Code]=2,[trade value (us$)] ,0) as T_Export, iif([Trade Flow Code]=3,[trade value (us$)] ,0) as [T_Re-Import], iif([Trade Flow Code]=4,[trade value (us$)] ,0) as [T_Re-Export] FROM [DATA$] WHERE [Reporter ISO] not like 'A*') GROUP BY [Partner ISO] ORDER BY sum([trade value (us$)]) DESC"
    rs.Open s, cnn
    Sheet3.Range("A1").CopyFromRecordset rs
    rs.Close
    Set rs = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Ví dụ của em là em mới làm được code tính cho tất cả thôi ạ. Em chưa biết loại bỏ nếu dùng DIC ạ.
Bài đã được tự động gộp:


Của bạn đây nhé. Lần sau đăng bài mới nhé, đừng xen vào bài tớ như thế.he
Ví dụ của em là em mới làm được code tính cho tất cả thôi ạ. Em chưa biết loại bỏ nếu dùng DIC ạ.
Bài đã được tự động gộp:


Của bạn đây nhé. Lần sau đăng bài mới nhé, đừng xen vào bài tớ như thế.he

Ví dụ của em là em mới làm được code tính cho tất cả thôi ạ. Em chưa biết loại bỏ nếu dùng DIC ạ.
Bài đã được tự động gộp:


Của bạn đây nhé. Lần sau đăng bài mới nhé, đừng xen vào bài tớ như thế.he
em xin lỗi nha. Tại em cần gấp quá mà vừa tham gia diễn đàn chưa tìm được cách đăng bài mới. Mong c thông cảm ạ
 
Upvote 0
Bạn dùng code này, thêm sheet3 để lưu kết quả:
Mã:
Sub ADOTest()
    Dim cnn As ADODB.Connection, rs As Recordset
    Dim s As String
    Set cnn = New Connection
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Macro;HDR=YES"";"
    cnn.Open s
    Set rs = New Recordset
    s = "SELECT [Partner ISO], sum([trade value (us$)]), sum(L_Import) &  '/'  & sum(L_Export) & '/' &  sum([L_Re-Import]) & '/' &  sum([L_Re-Export]) as SL, sum(T_Import) &  '/'  & sum(T_Export) & '/' &  sum([T_Re-Import]) & '/' &  sum([T_Re-Export]) as ST FROM (SELECT  [Partner ISO], [trade value (us$)], iif([Trade Flow Code]=1,1,0) as L_Import, iif([Trade Flow Code]=2,1,0) as L_Export, iif([Trade Flow Code]=3,1,0) as [L_Re-Import], iif([Trade Flow Code]=4,1,0) as [L_Re-Export], iif([Trade Flow Code]=1,[trade value (us$)] ,0) as T_Import, iif([Trade Flow Code]=2,[trade value (us$)] ,0) as T_Export, iif([Trade Flow Code]=3,[trade value (us$)] ,0) as [T_Re-Import], iif([Trade Flow Code]=4,[trade value (us$)] ,0) as [T_Re-Export] FROM [DATA$] WHERE [Reporter ISO] not like 'A*') GROUP BY [Partner ISO] ORDER BY sum([trade value (us$)]) DESC"
    rs.Open s, cnn
    Sheet3.Range("A1").CopyFromRecordset rs
    rs.Close
    Set rs = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub
Quá đẹp anh ạ. Em cảm ơn nhiều về cách hay ạ !
 
Upvote 0
Anh cho em hỏi. Việt add thêm item 4,5,6,7 là ý nghĩa gì ạ. Em đọc code khá dễ hiểu nhưng chỗ này em không hiểu ạ. Em cảm ơn anh.
dic.Add "Export", 4
dic.Add "Import", 5
dic.Add "Re-Export", 6
dic.Add "Re-Import", 7
Dễ hiểu mà không hiểu, mâu thuẫn quá.
Trong code có đoạn xài đến nó:
Mã:
        ik = dic.Item(iKey)
        Res(ik, 3) = Res(ik, 3) + sArr(i, 7)
        c = dic.Item(sArr(i, 1))
        Res(ik, c) = Res(ik, c) + 1 'Dem So Luong
        Res(ik, c + 4) = Res(ik, c + 4) + sArr(i, 7) 'Tong gia tri
Ta thấy nó dùng cho chỉ số cột của mảng kết quả, dùng 2 lần: 1 lần dùng chính nó và 1 lần cộng 4
Giải thích hết:
- Kết quả chỉ cần 5 cột, nhưng khai báo mảng kết quả 11 cột, để tách kết quả ra theo 4 TradeFlow
- Mỗi Tradeflow sẽ đếm vào 1 trong 4 cột 4, 5, 6, 7
- Cộng 4 sẽ là 8, 9, 10, 11. Mỗi Trade flow sẽ tổng trade value vào 1 trong 4 cột này
- Khi 8 cột này có đủ dữ liệu, thì nối chuỗi 4 cột đầu ghi đè vào cột 4, nối chuỗi 4 cột sau ghi đè vào cột 5.
- Ghi kết quả xuống từ cột 1 đến cột 5, các cột từ 6 đến 11 thì bỏ, không xài nữa.
Vẫn chỉ là 1 đít sần. Quá hay ạ !!!
Như tôi đã nói ở 1 chủ đề khác, bản chất của 1 Dic trong code đó chứa 2 nội dung. Cách này có thể tiện lợi ở chỗ này chỗ khác nhưng sẽ có hạn chế như sau:
- Không tường minh. Dẫn đến người dùng không hiểu phải hỏi như trên
- Khi truy xuất sẽ chậm 1 chút xíu: Ví dụ chỉ có 4 Trade flow nhưng phải tìm để truy xuất item trong cái Dic đến 2 trăm mấy chục phần tử. Tốc độ rất không đáng kể nhưng có vẻ phi lý.
- Trong trường hợp cần đếm số lượng phần tử từng nội dung thì không đếm được bằng Dic.Count: Dic.Count bao gồm 2 nội dung
- Trường hợp cần liệt kê Dic.Keys xuống sheet (giả sử như có 1 Dic liệt kê mã hàng lỗi và cần liệt kê), mà dùng chung Dic với nội dung khác thì không liệt kê xuống sheet được.
 
Upvote 0
Upvote 0
Cụ thể code của bác Cò @concogia thiếu do bỏ qua Partner rỗng:

View attachment 266208
Cái này hông biết, nhưng đọc đề bài thì:
1) Ưu tiên 1==> cột 6 ==> không bắt đầu bằng "A"
2) Ưu tiên 2: cột 8 khác rỗng ( kết quả là muốn tìm thằng này mà)
Thoả 2 thằng này mới tới em "Đít-to" chứ nhỉ ?
Mà nhìn bài đó ngán lắm, chỉ tìm một cách giải thôi
Híc
 
Upvote 0
Cái này hông biết, nhưng đọc đề bài thì:
1) Ưu tiên 1==> cột 6 ==> không bắt đầu bằng "A"
2) Ưu tiên 2: cột 8 khác rỗng ( kết quả là muốn tìm thằng này mà)
Thoả 2 thằng này mới tới em "Đít-to" chứ nhỉ ?
Mà nhìn bài đó ngán lắm, chỉ tìm một cách giải thôi
Híc
Đề bài hỏng có cái Ưu tiên 2 à nha. Zí lại bác Cò lụt nghề rồi, 4 cái If ElseIf trong hình anh lập lại 2 lần, biến thì khai báo cả rổ rồi không xài
1631804255055.png
 
Upvote 0
Đề bài hỏng có cái Ưu tiên 2 à nha. Zí lại bác Cò lụt nghề rồi, 4 cái If ElseIf trong hình anh lập lại 2 lần, biến thì khai báo cả rổ rồi không xài
View attachment 266212
Hihi, lúc đầu tính khác, lúc sau tính khác, mà biến khai đâu ...có tốn tiền, vô tư mà khai, Ba Tê cũng hay vậy
Trong bài bạn í viết:
Nhờ a chị và các bạn hỗ trợ tính, đếm thêm cột F và G như ví dụ em có làm cho mã WLD với điều kiện trường Reporter ISO tại sheet Data bỏ toàn bộ các khách mã có ký tự bắt đầu bằng chữ A
Híc, thằng WLD ở cột 8, ngồi buồn làm chơi chứ nhức đầu lắm
 
Upvote 0
Dễ hiểu mà không hiểu, mâu thuẫn quá.
Trong code có đoạn xài đến nó:
Mã:
        ik = dic.Item(iKey)
        Res(ik, 3) = Res(ik, 3) + sArr(i, 7)
        c = dic.Item(sArr(i, 1))
        Res(ik, c) = Res(ik, c) + 1 'Dem So Luong
        Res(ik, c + 4) = Res(ik, c + 4) + sArr(i, 7) 'Tong gia tri
Ta thấy nó dùng cho chỉ số cột của mảng kết quả, dùng 2 lần: 1 lần dùng chính nó và 1 lần cộng 4
Giải thích hết:
- Kết quả chỉ cần 5 cột, nhưng khai báo mảng kết quả 11 cột, để tách kết quả ra theo 4 TradeFlow
- Mỗi Tradeflow sẽ đếm vào 1 trong 4 cột 4, 5, 6, 7
- Cộng 4 sẽ là 8, 9, 10, 11. Mỗi Trade flow sẽ tổng trade value vào 1 trong 4 cột này
- Khi 8 cột này có đủ dữ liệu, thì nối chuỗi 4 cột đầu ghi đè vào cột 4, nối chuỗi 4 cột sau ghi đè vào cột 5.
- Ghi kết quả xuống từ cột 1 đến cột 5, các cột từ 6 đến 11 thì bỏ, không xài nữa.

Như tôi đã nói ở 1 chủ đề khác, bản chất của 1 Dic trong code đó chứa 2 nội dung. Cách này có thể tiện lợi ở chỗ này chỗ khác nhưng sẽ có hạn chế như sau:
- Không tường minh. Dẫn đến người dùng không hiểu phải hỏi như trên
- Khi truy xuất sẽ chậm 1 chút xíu: Ví dụ chỉ có 4 Trade flow nhưng phải tìm để truy xuất item trong cái Dic đến 2 trăm mấy chục phần tử. Tốc độ rất không đáng kể nhưng có vẻ phi lý.
- Trong trường hợp cần đếm số lượng phần tử từng nội dung thì không đếm được bằng Dic.Count: Dic.Count bao gồm 2 nội dung
- Trường hợp cần liệt kê Dic.Keys xuống sheet (giả sử như có 1 Dic liệt kê mã hàng lỗi và cần liệt kê), mà dùng chung Dic với nội dung khác thì không liệt kê xuống sheet được.
Dạ, tại khi em đọc lý thuyết về DIC em chỉ thấy khi add thêm keys và items thì nghĩa là thêm dòng vào Dic hiện tại, nhưng ở đây theo cách anh giải thích thì em hiểu là nó thêm cột/trường dữ liệu có tên là export, import, re-E, re-im đúng không ạ ứng với cột đánh dấu là cột 4,5,6,7. Em chưa rõ lý thuyết về dic chỗ nào thể hiện việc này ạ.
 
Upvote 0
Dạ, tại khi em đọc lý thuyết về DIC em chỉ thấy khi add thêm keys và items thì nghĩa là thêm dòng vào Dic hiện tại, nhưng ở đây theo cách anh giải thích thì em hiểu là nó thêm cột/trường dữ liệu có tên là export, import, re-E, re-im đúng không ạ ứng với cột đánh dấu là cột 4,5,6,7. Em chưa rõ lý thuyết về dic chỗ nào thể hiện việc này ạ.
import export là key, 4, 5, là item. Là Dictionary chứ là gì bây giờ
 
Upvote 0
import export là key, 4, 5, là item. Là Dictionary chứ là gì bây giờ
Em đọc lý thuyết vê Dic thì có ví dụ kiểu thế này
Giả sử một Dic đã có dạng
Orange
21​
Lemon
34​
Cucumber
78​
' add phan tu vao dict
dict.Add Key:="Apple", Item:=30
dict.Add Key:="Peach", Item:=40
dict.Add Key:="Plum", Item:= 80
Thì nó cứ nối thêm vào bảng đó thôi ạ.
Bảng kết quả của mình giờ có Trường 1 là số thứ tự, trường 2 là Partner ISO, trường 3 là Trade Value (US$)....giờ nếu
dic.Add "Export", 4
dic.Add "Import", 5
dic.Add "Re-Export", 6
dic.Add "Re-Import", 7
Thì em thấy nó không đồng chất. Và tại sao DIC lại hiểu là thêm 4 trường có tên là Export, Import, Re-Export, Re-Import ạ.
 
Upvote 0
Em đọc lý thuyết vê Dic thì có ví dụ kiểu thế này
Không phải thêm 4 trường, mà là thêm 4 keys, mỗi key có item là số thứ tự cột. Bài này tác giả dùng 1 Dic cho 2 nội dung: 1 là trade flow và 1 là Partner ISO.
(Khi gán vào mảng kết quả, thì key nào sẽ gắn vào cột là item của key đó (4, 5, 6, 7)
Bạn phải đọc lại giải thích bên trên, trên đó ghi rõ là kết quả cuối chỉ cần 5 cột, nhưng tạo mảng tới 11 cột. 8 cột phía sau chỉ dùng để tính toán, sau đó ghi đè 2 cột 4, 5 còn 6 cột thì bỏ, không đưa xuống.
* Nói rồi, xài gộp Dic khổ như vậy đấy.
 
Upvote 0
Không phải thêm 4 trường, mà là thêm 4 keys, mỗi key có item là số thứ tự cột. Bài này tác giả dùng 1 Dic cho 2 nội dung: 1 là trade flow và 1 là Partner ISO.
(Khi gán vào mảng kết quả, thì key nào sẽ gắn vào cột là item của key đó (4, 5, 6, 7)
Bạn phải đọc lại giải thích bên trên, trên đó ghi rõ là kết quả cuối chỉ cần 5 cột, nhưng tạo mảng tới 11 cột. 8 cột phía sau chỉ dùng để tính toán, sau đó ghi đè 2 cột 4, 5 còn 6 cột thì bỏ, không đưa xuống.
* Nói rồi, xài gộp Dic khổ như vậy đấy.
Vậy bài này để tường mình phải xơi 2 cái đít xần rồi nối lại với nhau sư phụ nhỉ?
 
Upvote 0
Vậy bài này để tường mình phải xơi 2 cái đít xần rồi nối lại với nhau sư phụ nhỉ?
Hai cái là hai cái, nối lại làm gì. Nếu đặt tên tường minh thì 1 cái tên là DicTradeflow, 1 cái tên là DicPartner. Bài này cũng không quá khó, code ở mức đơn giản vừa phải, thì Dic1 Dic2 cũng chấp nhận được.
Khi tôi viết cho 1 chương trình tương đối lớn thì dùng đến 5, 7 Dics cho các danh mục, 2 Dic cho việc liệt kê lỗi (cụ thể là lỗi mặt hàng chưa tồn tại, khách hàng chưa tồn tại). Bắt buộc phải khai báo tường minh và đặt tên tường minh.

Cụ thể là khai báo Public các danh mục để chạy nhiều thủ tục:

1631930594860.png

Khai báo Dic chứa lỗi trong từng thủ tục:
1631930641013.png

Kết quả từng thủ tục có thống kê lỗi:

1631930678048.png

Và liệt kê danh mục lỗi (không tồn tại) để người dùng bổ sung:

1631930729331.png

Mỗi Dic danh mục lên đến hàng ngàn, 7 cái lên đến hàng chục ngàn, gộp lại mà tìm kiếm trong đống gộp chung đó cho chết!
Thống kê phải lấy Dic.Count, Liệt kê xuống sheet phải liệt kê bằng Dic.Keys và Dic.Items. Gộp rồi thì làm sao có được.
 
Lần chỉnh sửa cuối:
Upvote 0
Hai cái là hai cái, nối lại làm gì. Nếu đặt tên tường minh thì 1 cái tên là DicTradeflow, 1 cái tên là DicPartner. Bài này cũng không quá khó, code ở mức đơn giản vừa phải, thì Dic1 Dic2 cũng chấp nhận được.
Khi tôi viết cho 1 chương trình tương đối lớn thì dùng đến 4, 5 Dics cho các danh mục, 2 Dic cho việc liệt kê lỗi (cụ thể là lỗi mặt hàng chưa tồn tại, khách hàng chưa tồn tại). Bắt buộc phải khai báo tường minh và đặt tên tường minh.
Vâng, ý em chỉ là lấy kết quả nối lại với nhau để như đề bài.
Mà bài này kết quả nên tách ra thành các cột khác nhau. Chứ kiểu chập lại thế này, mẫy bữa nữa rồi lại tách ra :D
 
Upvote 0
Vâng, ý em chỉ là lấy kết quả nối lại với nhau để như đề bài.
Mà bài này kết quả nên tách ra thành các cột khác nhau. Chứ kiểu chập lại thế này, mẫy bữa nữa rồi lại tách ra :D
Nếu tách ra các cột khác nhau thì chỉ cần pivot table thông thường, chưa cần đến power query :P :P
 
Upvote 0
Đấy, như gợi ý của sư phụ @ptm0412, tác giả @hoahuongduong1986 thử làm tường minh xem sao. Đây là cách học tốt nhất.
Vì không phải đơn giản để sử dụng đích sừn uyển chuyển như bác @HieuCD được.
 
Upvote 0
Upvote 0
Dạ, Dic quá mạnh nhưng với em hiện mới chỉ dừng ở tìm hiểu cấp độ mẫu giáo thôi ạ. Em sẽ học hỏi và tìm hiểu thêm ạ!
Mình mạn phép góp ý chút nha. Không nên gộp chung lại. Tách ra từng cột là tối ưu nhất. Gom lại sẽ gặp nhiều rắc rối
 
Upvote 0
Vậy bài này để tường mình phải xơi 2 cái đít xần rồi nối lại với nhau sư phụ nhỉ?
Chỉ cần 1 dic thôi em kèm theo mảng kết quả. Mảng kq có số dòng bằng số dòng mảng ban đầu. Key là tiêu chí cần group là partner iso, value là vị trí (số thứ tự dòng) key đó trong mảng kết quả. Đọc từng dòng mảng source, gặp key mới thì thêm vào cuối mảng kết quả, key cũ thì cộng vào vị trí của hàng value thôi.
 
Upvote 0
Chỉ cần 1 dic thôi em kèm theo mảng kết quả. Mảng kq có số dòng bằng số dòng mảng ban đầu. Key là tiêu chí cần group là partner iso, value là vị trí (số thứ tự dòng) key đó trong mảng kết quả. Đọc từng dòng mảng source, gặp key mới thì thêm vào cuối mảng kết quả, key cũ thì cộng vào vị trí của hàng value thôi.
Đó là code của bác @concogia đó @Cá ngừ F1. Hai Dic truy xuất gọn hơn 1 tẹo thay vì 1 cái If ElseIf 4 giá trị.
 
Upvote 0
Đó là code của bác @concogia đó @Cá ngừ F1. Hai Dic truy xuất gọn hơn 1 tẹo thay vì 1 cái If ElseIf 4 giá trị.
Vâng, tại em không tải file nên không rõ. Nói chung em hay làm thì bao nhiêu tiêu chí cần nhóm thì sẽ có ngần ấy dic hoặc phải nối lại thành 1 cột và dùng 1 dic. Value thì lưu kết quả ngay nếu có ít tiêu chí cần tính tổng; nhiều tiêu chí như trong bài này thì value chứa chỉ số của key còn tính toán trên mảng.
 
Upvote 0
Đó là code của bác @concogia đó @Cá ngừ F1. Hai Dic truy xuất gọn hơn 1 tẹo thay vì 1 cái If ElseIf 4 giá trị.
Bài này vui quá, muốn tìm chỉ số cột đó ( theo mình ) có 3 cách:
1) Nạp vào Dic vô tư, đếch sợ em nào vì lần lượt các em Ex, Im, Re_Ex, Re_Im đó là duy nhất, tạo ra bảng dò, dạng này hình như trên diễn đàn có một vài bài xử dụng
2) Dùng IF cũng tạo ra bảng dò ( nhưng không thấy nó thôi) chỉ số cột
3) Tạo một bảng vào Sheet, 4 dòng 2 cột, 2 dòng 4 cột ( tuỳ) dò tìm chỉ số cột
Túm lại, dùng kiểu nào mục đích cũng là tìm chỉ số Cột để Công & Đếm
Tới đây thì chia 2 nhánh
1) Tìm được chỉ số cột thì gán luôn vào mảng Kết Quả ==> phang xuống Sheet
2) Đếm đếm, công cộng xong để dành đó, chạy hết 1 vòng rồi chạy tiếp vòng 2 gán kết quả ==> phang xuống Sheet
Thấy vui viết chơi, miễn tranh luận, để đầu óc thảnh thơi.......chống dịch
Thân
 
Upvote 0
Thấy vui viết chơi, miễn tranh luận, để đầu óc thảnh thơi.......chống dịch
Bàn luận cho hết thì giờ ấy mà anh, dịch rảnh quá. Anh không viết thì bàn luận với ai? Có 2 anh em (với @Cá ngừ F1), bàn mãi cũng chán, em í chỉ có dạ thôi.
Bài đã được tự động gộp:

Vâng, tại em không tải file nên không rõ. Nói chung em hay làm thì bao nhiêu tiêu chí cần nhóm thì sẽ có ngần ấy dic hoặc phải nối lại thành 1 cột và dùng 1 dic. Value thì lưu kết quả ngay nếu có ít tiêu chí cần tính tổng; nhiều tiêu chí như trong bài này thì value chứa chỉ số của key còn tính toán trên mảng.
item chứa chỉ số của key đúng rồi, bài này 2 Dic (hoặc 1 Dic gộp như anh @HieuCD) thì 1 dic chỉ số dòng, 1 dic chỉ số cột.
 
Upvote 0
Bài này vui quá, muốn tìm chỉ số cột đó ( theo mình ) có 3 cách:
1) Nạp vào Dic vô tư, đếch sợ em nào vì lần lượt các em Ex, Im, Re_Ex, Re_Im đó là duy nhất, tạo ra bảng dò, dạng này hình như trên diễn đàn có một vài bài xử dụng
2) Dùng IF cũng tạo ra bảng dò ( nhưng không thấy nó thôi) chỉ số cột
3) Tạo một bảng vào Sheet, 4 dòng 2 cột, 2 dòng 4 cột ( tuỳ) dò tìm chỉ số cột
Túm lại, dùng kiểu nào mục đích cũng là tìm chỉ số Cột để Công & Đếm
Tới đây thì chia 2 nhánh
1) Tìm được chỉ số cột thì gán luôn vào mảng Kết Quả ==> phang xuống Sheet
2) Đếm đếm, công cộng xong để dành đó, chạy hết 1 vòng rồi chạy tiếp vòng 2 gán kết quả ==> phang xuống Sheet
Thấy vui viết chơi, miễn tranh luận, để đầu óc thảnh thơi.......chống dịch
Thân
Dạo này chả được PHANG í bác Cò, bí bách quá nghĩ cách PHANG xuống Sheet cho đỡ khó chịu ạ.
 
Upvote 0
Với tinh thần cần 2 Dic để tường minh của sư phụ @ptm0412
Cả ý kiến của anh @Quang_Hải là tách cột kết quả tránh những rắc rối không cần thiết sau này.
Tôi làm thử với kết quả là 5 cột (như hình). Kết quả các cột khác bạn tự thêm nhé. Vì tôi thấy dùng 2 Dic như này là rất tường minh rồi.
Thực tế thì việc nối chuỗi chỉ gọi là thêm chút gia vị.

Snag_215da0.png
Mã:
Sub GPE()
On Error Resume Next
Dim Data(), DicTradeFlow As Object, DicPartner As Object, i&, k&, j&, KQ(), ItmTradeFlow, ItmPartner, KQ1, KQ2, sRow
Data = Range(Sheets("Data").[D2], Sheets("Data").[J1000000].End(3))
sRow = UBound(Data)
ReDim KQ(1 To sRow, 1 To 5)
ReDim KQ1(1 To sRow, 1 To 2)
ReDim KQ2(1 To sRow, 1 To 3)
Set DicTradeFlow = CreateObject("Scripting.Dictionary")
Set DicPartner = CreateObject("Scripting.Dictionary")
For i = 1 To sRow
    If Mid(Data(i, 3), 1, 1) <> "A" Then
        ItmTradeFlow = Data(i, 1) & Data(i, 5)
        ItmPartner = Data(i, 5)
        If Not DicTradeFlow.Exists(ItmTradeFlow) Then
            k = k + 1
            DicTradeFlow(ItmTradeFlow) = k
            KQ1(k, 1) = 1
            KQ1(k, 2) = Data(i, 7)
        Else
            KQ1(DicTradeFlow.Item(ItmTradeFlow), 1) = KQ1(DicTradeFlow.Item(ItmTradeFlow), 1) + 1
            KQ1(DicTradeFlow.Item(ItmTradeFlow), 2) = KQ1(DicTradeFlow.Item(ItmTradeFlow), 2) + Data(i, 7)
        End If
        If Not DicPartner.Exists(ItmPartner) Then
            j = j + 1
            DicPartner(ItmPartner) = j
            KQ2(j, 1) = j
            KQ2(j, 2) = Data(i, 5)
            KQ2(j, 3) = Data(i, 7)
        Else
            KQ2(DicPartner.Item(ItmPartner), 3) = KQ2(DicPartner.Item(ItmPartner), 3) + Data(i, 7)
        End If
    End If
Next
For i = 1 To j
    KQ(i, 1) = KQ2(i, 1)
    KQ(i, 2) = KQ2(i, 2)
    KQ(i, 3) = KQ2(i, 3)
    KQ(i, 4) = KQ1(DicTradeFlow.Item("Export" & KQ(i, 2)), 1)
    KQ(i, 5) = KQ1(DicTradeFlow.Item("Export" & KQ(i, 2)), 2)
Next
With Sheet8 'Thay ten sheet can gan KQ vo day
    .[A3].Resize(j, 5) = KQ
    .[B2:E100000].Sort .[C2], 2, Header:=xlYes
End With
End Sub
Chúc cả nhà cuối tuần VUI VẺ !!!
 
Upvote 0
Tham gia 1 bài cho vui. Nhìn hơi quái chút.
Mã:
Sub Loc_DIC()
Dim du_lieu(), ket_qua(), Dic As Object, tmp As String
Dim sKey As String, i As Long, k As Long, n As Long
du_lieu = Sheet2.Range("D2", Sheet2.Range("D" & Rows.Count).End(3)).Resize(, 7).Value
ReDim ket_qua(1 To UBound(du_lieu), 1 To 13)
Set Dic = CreateObject("scripting.dictionary")
For i = 1 To UBound(du_lieu)
    sKey = du_lieu(i, 5)
    If Not IsEmpty(sKey) Then
        tmp = UCase(du_lieu(i, 1))
        If Not Dic.Exists(sKey) Then
            k = k + 1
            Dic.Add sKey, k
            ket_qua(k, 1) = k
            ket_qua(k, 2) = du_lieu(i, 5)
            ket_qua(k, 3) = du_lieu(i, 7)
            'If Left(du_lieu(i, 3), 1) <> "A" Then
                If tmp = "EXPORT" Then
                    ket_qua(k, 6) = 1
                    ket_qua(k, 10) = du_lieu(i, 7)
                ElseIf tmp = "IMPORT" Then
                    ket_qua(k, 7) = 1
                    ket_qua(k, 11) = du_lieu(i, 7)
                ElseIf tmp = "RE-EXPORT" Then
                    ket_qua(k, 8) = 1
                    ket_qua(k, 12) = du_lieu(i, 7)
                ElseIf tmp = "RE-IMPORT" Then
                    ket_qua(k, 13) = du_lieu(i, 7)
                End If
            'End If
        Else
            n = Dic.Item(sKey)
            ket_qua(n, 3) = ket_qua(n, 3) + du_lieu(i, 7)
            'If Left(du_lieu(i, 3), 1) <> "A" Then
                If tmp = "EXPORT" Then
                    ket_qua(n, 6) = ket_qua(n, 6) + 1
                    ket_qua(n, 10) = ket_qua(n, 10) + du_lieu(i, 7)
                ElseIf tmp = "IMPORT" Then
                    ket_qua(n, 7) = ket_qua(n, 7) + 1
                    ket_qua(n, 11) = ket_qua(n, 11) + du_lieu(i, 7)
                ElseIf tmp = "RE-EXPORT" Then
                    ket_qua(n, 8) = ket_qua(n, 8) + 1
                    ket_qua(n, 12) = ket_qua(n, 12) + du_lieu(i, 7)
                ElseIf tmp = "RE-IMPORT" Then
                    ket_qua(n, 9) = ket_qua(n, 9) + 1
                    ket_qua(n, 13) = ket_qua(n, 13) + du_lieu(i, 7)
                End If
            'End If
        End If
    End If
Next i

For i = 1 To k
    ket_qua(i, 4) = "Export: " & ket_qua(i, 6) & "/Import: " & ket_qua(i, 7) & " /Re-Export: " & ket_qua(i, 8) & "/Re-Import: " & ket_qua(i, 9)
    ket_qua(i, 5) = "Export: " & ket_qua(i, 10) & "/Import: " & ket_qua(i, 11) & " /Re-Export: " & ket_qua(i, 12) & "/Re-Import: " & ket_qua(i, 13)
Next
Sheet1.Range("C2").Resize(k, 5).Value = ket_qua
End Sub
 
Upvote 0
Với tinh thần cần 2 Dic để tường minh của sư phụ @ptm0412
Cả ý kiến của anh @Quang_Hải là tách cột kết quả tránh những rắc rối không cần thiết sau này.
Tôi làm thử với kết quả là 5 cột (như hình). Kết quả các cột khác bạn tự thêm nhé. Vì tôi thấy dùng 2 Dic như này là rất tường minh rồi.
Thực tế thì việc nối chuỗi chỉ gọi là thêm chút gia vị.

View attachment 266290
Mã:
Sub GPE()
On Error Resume Next
Dim Data(), DicTradeFlow As Object, DicPartner As Object, i&, k&, j&, KQ(), ItmTradeFlow, ItmPartner, KQ1, KQ2, sRow
Data = Range(Sheets("Data").[D2], Sheets("Data").[J1000000].End(3))
sRow = UBound(Data)
ReDim KQ(1 To sRow, 1 To 5)
ReDim KQ1(1 To sRow, 1 To 2)
ReDim KQ2(1 To sRow, 1 To 3)
Set DicTradeFlow = CreateObject("Scripting.Dictionary")
Set DicPartner = CreateObject("Scripting.Dictionary")
For i = 1 To sRow
    If Mid(Data(i, 3), 1, 1) <> "A" Then
        ItmTradeFlow = Data(i, 1) & Data(i, 5)
        ItmPartner = Data(i, 5)
        If Not DicTradeFlow.Exists(ItmTradeFlow) Then
            k = k + 1
            DicTradeFlow(ItmTradeFlow) = k
            KQ1(k, 1) = 1
            KQ1(k, 2) = Data(i, 7)
        Else
            KQ1(DicTradeFlow.Item(ItmTradeFlow), 1) = KQ1(DicTradeFlow.Item(ItmTradeFlow), 1) + 1
            KQ1(DicTradeFlow.Item(ItmTradeFlow), 2) = KQ1(DicTradeFlow.Item(ItmTradeFlow), 2) + Data(i, 7)
        End If
        If Not DicPartner.Exists(ItmPartner) Then
            j = j + 1
            DicPartner(ItmPartner) = j
            KQ2(j, 1) = j
            KQ2(j, 2) = Data(i, 5)
            KQ2(j, 3) = Data(i, 7)
        Else
            KQ2(DicPartner.Item(ItmPartner), 3) = KQ2(DicPartner.Item(ItmPartner), 3) + Data(i, 7)
        End If
    End If
Next
For i = 1 To j
    KQ(i, 1) = KQ2(i, 1)
    KQ(i, 2) = KQ2(i, 2)
    KQ(i, 3) = KQ2(i, 3)
    KQ(i, 4) = KQ1(DicTradeFlow.Item("Export" & KQ(i, 2)), 1)
    KQ(i, 5) = KQ1(DicTradeFlow.Item("Export" & KQ(i, 2)), 2)
Next
With Sheet8 'Thay ten sheet can gan KQ vo day
    .[A3].Resize(j, 5) = KQ
    .[B2:E100000].Sort .[C2], 2, Header:=xlYes
End With
End Sub
Chúc cả nhà cuối tuần VUI VẺ !!!
Không ngờ bài của em được nhiều anh quan tâm và chỉ bảo đến như này ạ ! Cảm ơn các anh nhiều ạ !
Bài đã được tự động gộp:

Tham gia 1 bài cho vui. Nhìn hơi quái chút.
Mã:
Sub Loc_DIC()
Dim du_lieu(), ket_qua(), Dic As Object, tmp As String
Dim sKey As String, i As Long, k As Long, n As Long
du_lieu = Sheet2.Range("D2", Sheet2.Range("D" & Rows.Count).End(3)).Resize(, 7).Value
ReDim ket_qua(1 To UBound(du_lieu), 1 To 13)
Set Dic = CreateObject("scripting.dictionary")
For i = 1 To UBound(du_lieu)
    sKey = du_lieu(i, 5)
    If Not IsEmpty(sKey) Then
        tmp = UCase(du_lieu(i, 1))
        If Not Dic.Exists(sKey) Then
            k = k + 1
            Dic.Add sKey, k
            ket_qua(k, 1) = k
            ket_qua(k, 2) = du_lieu(i, 5)
            ket_qua(k, 3) = du_lieu(i, 7)
            'If Left(du_lieu(i, 3), 1) <> "A" Then
                If tmp = "EXPORT" Then
                    ket_qua(k, 6) = 1
                    ket_qua(k, 10) = du_lieu(i, 7)
                ElseIf tmp = "IMPORT" Then
                    ket_qua(k, 7) = 1
                    ket_qua(k, 11) = du_lieu(i, 7)
                ElseIf tmp = "RE-EXPORT" Then
                    ket_qua(k, 8) = 1
                    ket_qua(k, 12) = du_lieu(i, 7)
                ElseIf tmp = "RE-IMPORT" Then
                    ket_qua(k, 13) = du_lieu(i, 7)
                End If
            'End If
        Else
            n = Dic.Item(sKey)
            ket_qua(n, 3) = ket_qua(n, 3) + du_lieu(i, 7)
            'If Left(du_lieu(i, 3), 1) <> "A" Then
                If tmp = "EXPORT" Then
                    ket_qua(n, 6) = ket_qua(n, 6) + 1
                    ket_qua(n, 10) = ket_qua(n, 10) + du_lieu(i, 7)
                ElseIf tmp = "IMPORT" Then
                    ket_qua(n, 7) = ket_qua(n, 7) + 1
                    ket_qua(n, 11) = ket_qua(n, 11) + du_lieu(i, 7)
                ElseIf tmp = "RE-EXPORT" Then
                    ket_qua(n, 8) = ket_qua(n, 8) + 1
                    ket_qua(n, 12) = ket_qua(n, 12) + du_lieu(i, 7)
                ElseIf tmp = "RE-IMPORT" Then
                    ket_qua(n, 9) = ket_qua(n, 9) + 1
                    ket_qua(n, 13) = ket_qua(n, 13) + du_lieu(i, 7)
                End If
            'End If
        End If
    End If
Next i

For i = 1 To k
    ket_qua(i, 4) = "Export: " & ket_qua(i, 6) & "/Import: " & ket_qua(i, 7) & " /Re-Export: " & ket_qua(i, 8) & "/Re-Import: " & ket_qua(i, 9)
    ket_qua(i, 5) = "Export: " & ket_qua(i, 10) & "/Import: " & ket_qua(i, 11) & " /Re-Export: " & ket_qua(i, 12) & "/Re-Import: " & ket_qua(i, 13)
Next
Sheet1.Range("C2").Resize(k, 5).Value = ket_qua
End Sub
Cảm ơn anh nhiều ạ !
 
Upvote 0
Vậy bài này để tường mình phải xơi 2 cái đít xần rồi nối lại với nhau sư phụ nhỉ?
Đít sần có thể coi như là từ điển.
Bạn có một quyển từ điển Pháp Việt, và một quyển từ điển Hán Việt. Bạn muốn đóng chúng lại thành 1 quyển?
Đương nhiên là vẫn làm được nhưng nó sẽ khó xài như thế nào.

Trên nhyên tắc, cứ tra điều khác nhau chả lý do gì để không lập một cái đít sần khác.
 
Lần chỉnh sửa cuối:
Upvote 0
Đít sần có thể coi như là từ điển.
Bạn có 2 quyển từ điển Pháp Việt, và một quyển từ điển Hán Việt. Bạn muốn đóng chúng lại thành 1 quyển?
Đương nhiên là vẫn làm được nhưng nó sẽ khó xài như thế nào.

Trên nhyên tắc, cứ tra điều khác nhau chả lý do gì để không lập một cái đít sần khác.
Cần tra từ điển Pháp Việt và vài từ Hán Việt biết trước, sắm 2 cuốn từ điển riêng biệt quá lãng phí, tốn thêm ít nhất 2 trang bìa, chỉ cần viết tay thêm vài từ Hán Việt vào trang đầu là vừa đủ xài, người khác cầm nhầm từ điển lật trang đầu là biết ngay của người nào :)
 
Upvote 0

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

Back
Top Bottom