返回列表 上一主題 發帖

[發問] 如何移除陣列內重複的部分(STRING)

[發問] 如何移除陣列內重複的部分(STRING)

MyArray() ="XX","aa","ab",XX","ab"
如何可取得"XX","aa","ab"的值呢(不重複)
PKKO

回復 20# ML089

謝謝前輩指導
後學最近學習字典與陣列,有看懂前輩的指導!
很汗顏的是後學學了十幾年!今天才懂即時運算視窗怎麼用!
謝謝

TOP

回復 20# ML089


    謝謝前輩指導
今天接到一個重要又急的程式要開發
您的指導我再撥空研究

勉強跟這主題沾上邊!能解惑就好!
以後若找不到相關主題再另開主題請教
謝謝

TOP

回復 19# ML089


   謝謝前輩指導
一腦門的想學陣列,想在陣列裡排序再做統計
忘了結果貼到表裡再排序

您太客氣了,前輩們都很厲害又很熱心
謝謝

TOP

回復 18# Andy2483

你問題若與此版問題無關,最好另外開版詢問比較好。
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

本帖最後由 ML089 於 2021-9-17 09:33 編輯

回復 18# Andy2483

程式可以分段插入 "時間器" 看看哪一段有問題
時間器如下表比較 **4**及**5**比較耗時,再深入探討

分段        原始        優化後       
**1**        0        0.004       
**2**        0.168        0.168       
**3**        0.023        0.023       
**4**        1.859        1.867        未修改
**5**        2.375        0.023        修正後
**6**        0.246        0.234       

探討**5**程式, Arr有15000列,D字典有100列,用雙迴圈就有15000*100 計算步驟,
Arr是資料無法縮減迴圈,因此如何簡化 D字典這迴圈100步驟將是關鍵
可以考慮將 D字典 的值加入 序號 就可以 替代這100個迴圈
原先 2.375秒,經過優化後變成 0.023,剛好少100倍

修改參考如下

Debug.Print "**4**"
Debug.Print Format(Timer - tm, "0.000"): tm = Timer

'
'Set D = Nothing
'Set D = CreateObject("SCRIPTING.DICTIONARY")
'For i = 1 To UBound(Arr)
'   TT = Arr(i, 交貨日期欄C)
'   D(TT) = ""
'Next
'交貨日 = Application.Transpose(D.KEYS) '請教前輩 日期陣列要怎麼排序??
'ReDim KLrr(1 To D.Count, 1 To 2)
'For x = 2 To UBound(Arr)
'   Cdr = Arr(x, 交貨日期欄C)
'   For i = 2 To D.Count
'      Jdr = 交貨日(i, 1)
'      If Cdr = Jdr Then
'         KLrr(i, 1) = KLrr(i, 1) + 1
'         KLrr(i, 2) = KLrr(i, 2) + Arr(x, SAP_PO欄M)
'         Exit For
'      End If
'   Next
'Next


Set D = Nothing
Set D = CreateObject("SCRIPTING.DICTIONARY")
For i = 2 To UBound(Arr)
   Cdr = Arr(i, 交貨日期欄C)
   If Not D.Exists(Cdr) Then
        D(Cdr) = D.Count + 1
   End If
Next
交貨日 = Application.Transpose(D.KEYS) '請教前輩 日期陣列要怎麼排序??
ReDim KLrr(1 To D.Count, 1 To 2)
For x = 2 To UBound(Arr)
   Cdr = Arr(x, 交貨日期欄C)
   i = D(Cdr)
   KLrr(i, 1) = KLrr(i, 1) + 1
   KLrr(i, 2) = KLrr(i, 2) + Arr(x, SAP_PO欄M)
Next


Debug.Print "**5**"
Debug.Print Format(Timer - tm, "0.000"): tm = Timer
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 18# Andy2483

問題:
1.請教上傳範例中的不重複日期陣列如何排序
2.請您指導陣列的觀念與語法.結構..等是否有錯或執行效率如何提升
3.執行結果將用於呈現統計圖表


回答
1.排序一般可以資料寫入表格後,再用EXCEL排序功能處理,參考如下

' 排序 J:L 範圍的資料
' Key1:=Range("J1")    依據 A 欄排序
' Order1:=xlAscending  升冪排序
' Header:=xlYes        有標題列
Range("J:L").sort Key1:=Range("J1"), Order1:=xlAscending, Header:=xlYes


2.我也是最近才在摸VBA不適很懂,我常用函數觀念在寫VBA有點怪怪的,我自己也在摸索中也跟大家一樣相互觀摩學習。
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

回復 16# ML089


    前輩好
1.請教上傳範例中的不重複日期陣列如何排序
2.請您指導陣列的觀念與語法.結構..等是否有錯或執行效率如何提升
3.執行結果將用於呈現統計圖表
陣列觀念懵懵懂懂,請前輩們指導

日期陣列排序_20210916-1.zip (745.65 KB)

TOP

回復 16# ML089


    謝謝前輩指導
key是橫向排列的,將之轉置後才成為縱向排列
謝謝指導

TOP

回復 15# Andy2483

    [C1].Resize(D.Count, 1) = D.KEYS
改為
    [C1].Resize(D.Count, 1) = Application.Transpose(D.KEYS)
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

        靜思自在 : 成功是優點的發揮,失敗是缺點的累積。
返回列表 上一主題