返回列表 上一主題 發帖

[發問] dictionary 用法

回復 1# lalalada
想要用dictionary完成各項加總,可是不知道為何dtemp可以加總,但是 d跟dic就不行?
看看是這樣嗎?
  1. Option Explicit
  2. Sub EX()
  3. Dim Ar(), d As Object, dtemp As Object, dic As Object, i As Integer, xlword(1 To 3) As String
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set dic = CreateObject("scripting.dictionary")
  6.     Set dtemp = CreateObject("scripting.dictionary")
  7.     Ar = Range("A6:E" & [E6].End(xlDown).Row)
  8.     For i = 1 To UBound(Ar)
  9.         xlword(1) = Ar(i, 2)          '全部字串
  10.         xlword(2) = Left(Ar(i, 2), 4) '代號字串
  11.         xlword(3) = Mid(Ar(i, 2), 5)  '品名字串
  12.    
  13.         d(xlword(1)) = d(xlword(1)) + Ar(i, 4)
  14.         If xlword(1) <> xlword(2) Then dic(xlword(2)) = dic(xlword(2)) + Ar(i, 5)
  15.         If xlword(3) <> "" Then dtemp(xlword(3)) = dtemp(xlword(3)) + Ar(i, 4)
  16.     Next
  17. End Sub
複製代碼

TOP

回復 4# lalalada

上傳檔案 看看

TOP

回復 7# lalalada
咐檔 如有詳細說明 就不會霧裡看花了
ex. SSSL 電腦   $100    50
      SSSL             $150    25
      SSSL             $50      100
輸出成
SSSL   電腦   175
最後目標是
SSSL   電腦   $平均價格  175

程式碼依附檔欄位, 工作表1 的資料已排序過  定製
  1. Sub arrange_trial()
  2.     Dim Ar(), Axy(), d As Object, dic As Object, xlword As String
  3.     Set d = CreateObject("scripting.dictionary")
  4.     Set dic = CreateObject("scripting.dictionary")
  5.     Ar = Sheets("工作表1").Range("A2:E" & Sheets("工作表1").[E2].End(xlDown).Row).Value
  6.     '***  一般模組中: 沒指定工作表的 Range 是會作用中工作表ActiveSheet的Range   ****
  7.     For i = 1 To UBound(Ar)
  8.         If Len(Ar(i, 2)) > 4 Then xlword = Ar(i, 2)
  9.         If Not d.Exists(xlword) Then
  10.             d(xlword) = Array(Ar(i, 1), Ar(i, 2), , Ar(i, 4), Ar(i, 5))
  11.             dic(xlword) = Array(Ar(i, 3))          'p
  12.         Else
  13.             Axy = d(xlword)   '取得 字典物件的items
  14.             d(xlword) = Array(Axy(0), Axy(1), , Axy(3) + Ar(i, 4), Axy(4) + Ar(i, 5))
  15.             
  16.             Axy = dic(xlword) '取得 字典物件的items
  17.             ReDim Preserve Axy(UBound(dic(xlword)) + 1)  '重置 Axy元素+1(Preserve: 員內容不變)
  18.             Axy(UBound(Axy)) = Ar(i, 3)                  '加1 的元素
  19.             dic(xlword) = Axy '置入 字典物件的items
  20.         End If
  21.     Next
  22.     For Each k In d.keys
  23.         Axy = d(k)
  24.         Axy(2) = Application.Average(dic(k))  '平均數
  25.         Axy(2) = Application.Round(Axy(2), 2) '四捨五入到小數點第2位
  26.         d(k) = Axy
  27.     Next
  28.     Sheets("Output").[a5].Resize(d.Count, UBound(Ar, 2)) = Application.Transpose(Application.Transpose(d.items))
  29. End Sub
複製代碼

TOP

        靜思自在 : 謊言像一朵盛開的鮮花,外表美麗,生命短暫。
返回列表 上一主題