返回列表 上一主題 發帖

[發問] dictionary 用法

[發問] dictionary 用法

以下為我的程式碼:
  1. Dim Ar(), d As Object
  2. Set d = CreateObject("scripting.dictionary")
  3. Set dic = CreateObject("scripting.dictionary")
  4. Set dtemp = CreateObject("scripting.dictionary")
  5. Ar = Range("A6:E" & [E6].End(xlDown).Row)

  6. For i = 1 To UBound(Ar)
  7.   If Not dtemp.exists(Left(Ar(i, 2), 4)) Then
  8.   d.Add Ar(i, 2), Ar(i, 4)
  9.   dic.Add Ar(i, 2), Ar(i, 5)
  10.   dtemp.Add Left(Ar(i, 2), 4), Ar(i, 4)
  11.   Else
  12.   d(Ar(i, 2)) = d(Ar(i, 2)) + Ar(i, 4)
  13.   dic(Ar(i, 2)) = dic(Ar(i, 2)) + Ar(i, 5)
  14.   dtemp(Ar(i, 2)) = dtemp(Ar(i, 2)) + Ar(i, 4)
  15.   End If
  16. Next i
複製代碼
Ar 存放一個range
其形式長這樣
序        商品名稱              成交單價        購買數量
1        131A 電腦        150                 1,000
2        132A                 100                      0
3        55CR 冰箱        800                      0
4        55CR               1200                  250
5        55CR               1150                  100

因為名稱並未完全相同
想要用dictionary完成各項加總
可是不知道為何dtemp可以加總
但是 d跟dic就不行?
感謝m(_ _)m

回復  lalalada
想要用dictionary完成各項加總,可是不知道為何dtemp可以加總,但是 d跟dic就不行?
看看是 ...
GBKEE 發表於 2012-8-13 12:13


好像怪怪的...
最後一段
        d(xlword(1)) = d(xlword(1)) + Ar(i, 4)
        If xlword(1) <> xlword(2) Then dic(xlword(2)) = dic(xlword(2)) + Ar(i, 5)
        If xlword(3) <> "" Then dtemp(xlword(3)) = dtemp(xlword(3)) + Ar(i, 4)
意思分別是:
全名 = 代碼 + 品名
字典1建立關鍵字(記錄所有關鍵字,部分為全名,部分只有代碼)
若目前的全名不只有左邊代碼 則字典2(紀錄同時有代碼+品名項)加入關鍵字及索引
若品名不為空白則字典3(紀錄同時有代碼+品名項)加入關鍵字索引
這樣看起來最後無法把所有相同代碼的產品加總輸出?@@
ex. SSSL 電腦   $100    50
      SSSL             $150    25
      SSSL             $50      100
輸出成
SSSL   電腦   175
最後目標是
SSSL   電腦   $平均價格  175

TOP

本帖最後由 lalalada 於 2012-8-13 16:09 編輯

抱歉一開始敘述不清
我把原來的code加上註解
  1. Dim Ar()
  2. Set d = CreateObject("scripting.dictionary")
  3. Set dic = CreateObject("scripting.dictionary")
  4. Set dtemp = CreateObject("scripting.dictionary")
  5. Ar = Range("A6:E" & [E6].End(xlDown).Row)

  6. For i = 1 To UBound(Ar)
  7.   If dtemp.exists(Left(Ar(i, 2), 4)) = False Then  '若字典3代碼未紀錄
  8.   d(Ar(i, 2)) = Ar(i, 4)                            '字典1紀錄全名及索引1
  9.   dic(Ar(i, 2)) = Ar(i, 5)                         '字典2紀錄全名及索引2
  10.   dtemp(Left(Ar(i, 2), 4)) = Ar(i, 4)              '字典3紀錄代碼及索引
  11.     MsgBox "d:" & d(Ar(i, 2)) & d.keys & "  dic:" & dic(Ar(i, 2)) & " dtemp:" & dtemp(Left(Ar(i, 2), 4))
  12.   Else                                                             '若字典3代碼已記錄
  13.   dtemp(Left(Ar(i, 2), 4)) = dtemp(Left(Ar(i, 2), 4)) + Ar(i, 4) '字典3索引1加總
  14.   d(Ar(i, 2)) = d(Ar(i, 2)) + Ar(i, 4)                          '字典1(全名)索引1加總
  15.   dic(Ar(i, 2)) = dic(Ar(i, 2)) + Ar(i, 5)                    '字典2(全名)索引2加總
  16.     MsgBox "ELSE    ""d:" & d(Ar(i, 2)) & "  dic:" & dic(Ar(i, 2)) & " dtemp:" & dtemp(Left(Ar(i, 2), 4))
  17.   End If
  18. Next i

  19. [L6].Resize(d.Count, 1) = Application.Transpose(d.keys)          '輸出全名
  20. [M6].Resize(d.Count, 1) = Application.Transpose(d.items)      '輸出索引1
  21. [N6].Resize(dic.Count, 1) = Application.Transpose(dic.items) '輸出索引2
複製代碼
換句話說
希望最後能輸出字典1的全名和字典3的索引值...."
目前問題卡在當條件為否
dtemp可確實加總但d,dic不行(由msgbox可以觀察到)
感謝版大回復:)
本來以為已經沉到雲深不知處

TOP

本帖最後由 lalalada 於 2012-8-13 16:38 編輯
回復  lalalada
請傳上excel檔案
GBKEE 發表於 2012-8-13 16:09


阿 抱歉
完全忘記可以上傳...
我真笨..."
剛剛重寫了用Do...Loop的做法
也附在檔案裡
dictionary的方法 code裡的參照位置要稍微調整一下才能用

ProductList.zip (15.97 KB)

TOP

回復 6# lalalada

檔案裡的code貼成沒註解版的了..."

ProductList.zip (15.97 KB)

TOP

回復 8# GBKEE

我會了!:P
原來陣列這麼好用...
本來不熟以為反正可以用儲存格取代 我要再多研究..
而且dictionary竟然可以直接指定陣列
這次真的獲益良多
感謝版大!:)

TOP

        靜思自在 : 是非當教育,讚美作警惕。
返回列表 上一主題