Tính toán và đếm hàng hóa xuất nhập khẩu dùng Dictionary

Blue Softs Liên hệ QC

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
344
Được thích
37
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

  • Tinh toan XNK - DICTIONARY.xlsm
    1.7 MB · Đọc: 43

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT
Moderator
Tham gia
1/1/08
Bài viết
2,492
Được thích
3,606
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Quan hệ.. và quan hệ..
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

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT
Moderator
Tham gia
1/1/08
Bài viết
2,492
Được thích
3,606
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Quan hệ.. và quan hệ..
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

  • Tinh toan XNK - DICTIONARY.xlsm
    1.5 MB · Đọc: 13
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Upvote 0

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
344
Được thích
37
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

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT
Moderator
Tham gia
1/1/08
Bài viết
2,492
Được thích
3,606
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Quan hệ.. và quan hệ..

File đính kèm

  • Tinh toan XNK - DICTIONARY.xlsm
    1.5 MB · Đọc: 12
Upvote 0

VetMini

Chuyên gia GPE
Tham gia
21/12/12
Bài viết
12,353
Được thích
15,918
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

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
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

excel_lv1.5

Thành viên tích cực
Tham gia
20/10/17
Bài viết
937
Được thích
1,718
Giới tính
Nam
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

Hau151978

Thành viên tích cực
Tham gia
19/10/11
Bài viết
1,477
Được thích
1,428
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

le070802

Thành viên mới
Tham gia
14/9/21
Bài viết
12
Được thích
2
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

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
344
Được thích
37
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

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
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

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Upvote 0

concogia

Gội rồi mới Cạo
Tham gia
17/9/09
Bài viết
3,408
Được thích
6,843
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

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
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

concogia

Gội rồi mới Cạo
Tham gia
17/9/09
Bài viết
3,408
Được thích
6,843
Đề 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

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
344
Được thích
37
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

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
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

hoahuongduong1986

Thành viên thường trực
Tham gia
14/11/18
Bài viết
344
Được thích
37
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

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
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
Top Bottom