返回列表 上一主題 發帖

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

本帖最後由 n7822123 於 2020-5-18 12:46 編輯

回復 10# 准提部林


哈哈,感謝準大糾正~~~ 是我欠考慮了

修正程式
  1. Sub test()
  2. Arr = Array("XX", "aa", "ab", "ab", "ab", "XX", "ab")
  3. T$ = ""
  4. For Each Item In Arr
  5.   If InStr(" " & T$ & " "," " &  Item & " ") = 0 Then T = Trim(T & " " & Item)
  6. Next
  7. Brr = Split(T, " ")
  8. End Sub
複製代碼
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 8# ML089

感謝M大

你一用Key取代原有的E
再加上說明 一切就清楚了

理解如下:
作法其實是用字典的Key不會重複的特性
把陣列值加到字典Key值
最後再印出Key值就是不重複的結果了!
用功到世界末日那一天~~~

TOP

回復 9# 准提部林

感謝准提部林版主熱心回覆

看了8樓M大解說

明瞭了 !

謝謝
用功到世界末日那一天~~~

TOP

回復 11# n7822123

沒用過InStr操作

學習了 感謝大大分享
用功到世界末日那一天~~~

TOP

回復 9# 准提部林


    前輩好
請教前輩 附件範例要整理不重複品號,哪裡錯了?

不重複_20210915.zip (297.6 KB)

TOP

回復 15# Andy2483

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

TOP

回復 16# ML089


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

TOP

回復 16# ML089


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

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

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

本帖最後由 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

        靜思自在 : 【是否發揮了良能?】人間壽命因為短暫,才更顯得珍貴。難得來一趟人間,應問是否為人間發揮了自己的良能,而不要一味求長壽。
返回列表 上一主題