Board logo

標題: [發問] 有沒有甚麼方式可以複製物件?CreateObject("SCRIPTING.DICTIONARY") [打印本頁]

作者: PKKO    時間: 2016-8-9 15:23     標題: 有沒有甚麼方式可以複製物件?CreateObject("SCRIPTING.DICTIONARY")

例如CreateObject("SCRIPTING.DICTIONARY") 物件
已經輸入了一萬個key值

但我在實際應用的時候必須要用remove功能
導致再次比對的時候
我需要重新removeall
然後再輸入一萬筆key值
才可以重新執行

如果可以像陣列一樣複製直接a=b(程式執行速度就快了)

我試過Set D = CreateObject("SCRIPTING.DICTIONARY")
然後a=D 結果失敗
也試過Set a =D
結果a就真的等於D,D也被remove掉了

求大大們有方法嗎?
此目的是為了執行速度更快
作者: ikboy    時間: 2016-8-9 16:52

回復 1# PKKO


    不可以用多個字典嗎?
作者: PKKO    時間: 2016-8-9 19:36

回復 2# ikboy


    可以用多個字典
但我的需求是因為,假設要將1~1萬輸入到字典內
remove之後就沒有完整的字典
又要再輸入一次

再輸入一次跟輸入多個字典是一樣的意思

當程式需要執行上百萬次的時候
光是將1~1萬輸入至物件,就花了很多時間了
若有方式可以複製就完美了!
作者: 准提部林    時間: 2016-8-9 22:11

第一個字典, 不要的去除後, 當然要從頭來過,
反之, 將要的丟到陣列, 或丟到另一字典, 第一個還是本來面目!
作者: GBKEE    時間: 2016-8-10 09:46

回復 1# PKKO


   
我試過Set D = CreateObject("SCRIPTING.DICTIONARY")
然後a=D 結果失敗
也試過Set a =D
結果a就真的等於D,D也被remove掉了

不懂你的說法,可po程式碼 看看
  1. Option Explicit
  2. Sub EX()
  3.     Dim D As Object, i As Integer, a
  4.     Set D = CreateObject("SCRIPTING.DICTIONARY")
  5.     For i = 1 To 50
  6.         D(i) = i * 2
  7.     Next
  8.     Stop
  9.     MsgBox D.Count
  10.     a = D(5)
  11.     MsgBox a
  12.     Stop
  13.     MsgBox D.Count  '沒被Remove掉
  14. End Sub
複製代碼

作者: Kubi    時間: 2016-8-10 10:14

回復 5# GBKEE
版大的狀況可能如下:
Sub test()
    Dim D As Object, COPYD As Object, i As Integer
    Set D = CreateObject("SCRIPTING.DICTIONARY")
    Set COPYD = CreateObject("SCRIPTING.DICTIONARY")
    For i = 1 To 50
        D(i) = i * 2
    Next
    MsgBox "D原始數量:" & D.Count
   
    Set COPYD = D
    MsgBox "COPYD原始數量:" & COPYD.Count
   
    D.Remove (5) 'Remove掉D.Keys內一個 5 的值之後
    MsgBox "移除D.Keys內的一個值後....."
   
    MsgBox "D目前數量:" & D.Count
    MsgBox "沒有動到COPYD的狀況下目前數量也是:" & COPYD.Count
End Sub
建議版大是否能於操作前將字典檔D轉成二維陣列待用,當字典檔D操作並RemoveAll之後,再從二維陣列資料餵給字典檔D,只是這種方式不知是否能達成速度的要求。
作者: PKKO    時間: 2016-8-10 12:33

本帖最後由 PKKO 於 2016-8-10 12:36 編輯

回復 5# GBKEE

抱歉,小弟沒有說明清楚導致各位的困擾,小弟的問題如下
  1. Sub main_flow()
  2. OK = 0
  3. Do While OK < 5
  4.     '每次重新開始的時候,都需要將1萬個號碼輸入至物件內
  5. fn: Set XD = CreateObject("SCRIPTING.DICTIONARY")
  6.     For J = 1 To 10000
  7.         XD(J) = Empty
  8.     Next
  9.     'rng為一個不斷變動的2維陣列
  10.     '這邊開始比對所有條件,將重複的資料移除掉
  11.     For I = 1 To UBound(rng, 2)
  12.         For Each E In XD.KEYS
  13.                 If rng(i, E) = True Then XD.Remove (E)
  14.                 if xd.count<9 then goto fn
  15.         Next
  16.     Next
  17.     if xd.count=9 then call output(xd)
  18. Loop
  19. End Sub
複製代碼
目的是要找出剩餘沒出現的數字,剛好=9個,但此動作卻要每次都要重新輸入一次字典物件一萬個數字
若不用移除的方式,跑固定的迴圈反而會花更多的時間,因為有可能執行了一千多次之後,XD.count只剩下十幾個數字,沒必要跑全部的迴圈
作者: 准提部林    時間: 2016-8-10 12:36

Arr=完整資料
Brr=比對資料
Crr=比對資料

For Each B In Brr:  Dic1(B)="":  Next
For Each C In Crr:  Dic2(C)="":  Next

For Each A In Arr
    If Not Dic1.Exists(A) Then Dic3(A)=""
    If Not Dic2.Exists(A) Then Dic4(A)=""
Next

Dic3 及 Dic4 就是個別排除後的資料,
全部一個迴圈完成!
作者: PKKO    時間: 2016-8-10 13:11

回復 8# 准提部林


    准大您好
因該是我說明不清楚
其實我的需求是
找出五組rng陣列(1 to 200,1 to 10000)的陣列
裡面剛好只有9991個數字,剩下9個沒有數字沒有出現過
但若要掃過rng陣列的每一個資料,就太耗時

所以我才會要用remove的功能,符合就不在比對
而rng陣列是事前就已經整理好了,他會將數字rng(1,1)=1 ,  rng(1,1000)=1000,rng(1,2000)=2000
rng(x,y)=>y=多少就=多少
作者: PKKO    時間: 2016-8-10 13:14

回復 8# 准提部林


    因為小弟愚蠢的認為後面的流程因該無法更加快速了,所以才沒有說明完整的流程,只有問前端的字典部分
深感抱歉

因為後面的流程,他一但剩餘沒出現的數字小於9個數字,我就直接跳過了
所以有時候一個二維陣列只跑兩三列就已經跳過了
作者: GBKEE    時間: 2016-8-11 05:30

回復 10# PKKO
變通一下,一次建立5個字典物件看看
  1. Option Explicit
  2.   Sub main_flow()
  3.     Dim xd(0 To 4), i As Long, j As Long, Ok As Integer, E As Variant
  4.     For i = 0 To 4
  5.         Set xd(i) = CreateObject("SCRIPTING.DICTIONARY")
  6.         '1萬個號碼輸入5個物件內
  7.             For j = 1 To 10000
  8.                 xd(i)(j) = Empty
  9.             Next
  10.     Next
  11. Ok = 0
  12. Do While Ok < 5
  13.     'rng為一個不斷變動的2維陣列
  14.     '這邊開始比對所有條件,將重複的資料移除掉
  15. fn:
  16.      If xd(Ok).Count < 9 Then Ok = Ok + 1
  17.     For i = 1 To UBound(Rng, 2)
  18.         For Each E In xd(Ok).KEYS
  19.                 If Rng(i, E) = True Then xd(Ok).Remove (E)
  20.                 If xd(Ok).Count < 9 Then GoTo fn
  21.         Next
  22.     Next
  23.     If xd(Ok).Count = 9 Then Call output(xd)
  24. Loop
  25. End Sub
複製代碼

作者: PKKO    時間: 2016-8-11 13:55

回復 11# GBKEE


    感謝超版大大,我試試看^_^




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)