Board logo

標題: [發問] Excel2003 remove duplicates相容性問題 [打印本頁]

作者: sunshine010    時間: 2018-9-5 13:28     標題: Excel2003 remove duplicates相容性問題

各位好
目前工作交接時,發現離職同事行情使用VBA紀錄,進而開始摸索
因個人電腦版本需要把office2013的VBA改成office2003的版本

在收取行情時會每小時刪除重複的資料 ,此內容寫在模組中,執行時在指定的32個工作表刪除
在改寫時遇到remove duplicates相容性的問題,
有參考版上的文章嘗試改寫成2003的版本在工作表內可以正常執行,但在模組中有時會跳出錯誤
再度參考網路的資料後 改寫成下面的內容即可在模組中正常執行
但執行時發現除了效率變差外,資料量龐大時還可能會當機QQ

想請問大家對於RemoveDuplicates改寫為2003版可使用的版本時,是否有較好的寫法呢?
謝謝大家!!


原始office2013用法為
------------------------------------------------------------
Sub delete()

For i = 2 To 33

Sheet(i).Range("B4:AG65536").RemoveDuplicates Columns:=Array(2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33), Header:=xlNO

Next i
End Sub
------------------------------------------------------------

目前我參考網路資料改寫office2003為
------------------------------------
Sub delete()
For i = 2 To 33

Dim r As Range, Rng As Range

Sheets(i).Select

With Sheets(i).UsedRange
.Columns("B:AG").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Dim g%
Application.ScreenUpdating = False
For g = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row - 1 To ActiveSheet.UsedRange.Row Step -1
If Rows(g).Hidden = True Then
Rows(g).EntireRow.delete
End If
Next
Application.ScreenUpdating = True

End With
Next i

End Sub
------------------------------------------------------------
作者: faye59    時間: 2018-9-5 22:25

回復 1# sunshine010


    其實office這個降等級問題不太可能會做的事...相信要降等有特殊因素吧!
而你指的remove duplicates在2003版本此功能不存在,
remove duplicates是從2007版本才開始有的,
工具位置在[資料]→[資料工具]。
(試試錄製巨集就知道了)

從你的程式碼中看起來是要以2003版開始執行32個活頁簿做重覆資料刪除,對吧?
那麼可以用CreateObject("Scripting.Dictionary")建立字典方式就可以做到了。
(搜索可以找到很多相關參考資料,而且都是超版提供的)
如果還寫不出來,可以上傳資料並說明原因,再來協處解決問題。

提醒:如果資料是只要每個Sheet不重覆請再下個Sheet前Nothing。
作者: sunshine010    時間: 2018-9-6 15:48

回復 2# faye59


您好 謝謝您的回覆 我本身不會寫VBA,主要是因為我電腦只有買EXCEL2003 所以只能想辦法讓VBA可以在2003版執行

也有發現 remove duplicates是2007年才有的功能,因此才特別苦惱QQ

謝謝您提供建議為CreateObject("Scripting.Dictionary")

這個用法我在PO文前沒有查到,我也來研究看看 如果寫不出來再上來請教各位 謝謝!
作者: GBKEE    時間: 2018-9-6 16:46

回復 3# sunshine010
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng(1 To 2), Sh As Worksheet, i As Integer, E As Variant
  4.     Set Sh = Workbooks.Add(1).Sheets(1)  '所新增活頁簿的第一張工作表
  5.     For i = 2 To 33
  6.         Set Rng(1) = Sheets(i).Range("B4:AG65536")
  7.         Set Rng(2) = Sh.Range(Rng(1).Address)
  8.          With Rng(2)
  9.             .Clear
  10.             .Value = Rng(1).Value  '複製Rng(1)
  11.         End With
  12.         For Each E In Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33)
  13.             Rng(1).Columns(E).AdvancedFilter xlFilterCopy, "", Rng(2).Cells(E), True
  14.             '每一欄的 進階篩選 不重複的值 到 Rng(2)的每一欄
  15.         Next
  16.         Rng(1).Value = Rng(2).Value
  17.     Next
  18.     Sh.Parent.Close False   '關閉新增活頁簿
  19. End Sub
複製代碼

作者: sunshine010    時間: 2018-9-7 13:08

回復 4# GBKEE


    GBKEE大 非常謝謝您的幫忙  我今天早上試了一下

發現他會在Set Rng(1) = Sheets(i).Range("B4:AG65536")跳出錯誤

訊息為"陣列索引超出範圍" 不是很清楚這個錯誤的原因  

想請問您是否知道為什麼範圍沒超過工作表限制仍會錯誤嗎
作者: faye59    時間: 2018-9-10 04:26

回復 5# sunshine010


是不是顯示"執行階段錯誤'9':陣列索引超出範圍" ?
檢視你的Microsoft Excel物件資料夾下有幾個Sheet,
因為程序中For i = 2 To 33這是固定值,
33並不是用Sheet的總和。

如果還是有問題請附檔,實際測試才知道問題在哪。
作者: sunshine010    時間: 2018-9-10 08:31

回復 6# faye59


    faye59大 您好

Microsoft Excel物件資料夾下有33個Sheet
我需要他跑工作表2到工作表33
聽不太懂您的意思QQ

決定把檔案放上來 再麻煩您查看 謝謝您!

PS. 執行的程式 放在"模組"的DDE裡面的delete()
作者: 准提部林    時間: 2018-9-10 13:11

本帖最後由 准提部林 於 2018-9-10 13:18 編輯

回復 7# sunshine010

1) 去重覆, 應該只針對B欄的[時間]處理, 若逐欄處理, 那最後的資料也不正確
2) VBA以[公式重算]觸發, 同時間記錄的資料一定會重覆很多筆, 這是Worksheet_Calculate的弊病
3) 刪除重覆同時又觸發程式, 也會造成不可預料的錯誤

根本解決方法:
設一暫存列, 存放上一筆記錄的內容, 再用一個公式判斷資料是否有變動,
若無變動, 即使公式重算也不記錄, 這樣根本不須再去執行刪除重覆

這DDE非我所長, 幫不上忙~~
作者: faye59    時間: 2018-9-10 21:15

回復 7# sunshine010


    如准大所言
看過所有程序後我所猜測的問題也是如此,
Dynamic Data Exchange(簡稱:DDE)的架構我也不是很懂,
我是用Application Programming Interface(簡稱:API)方式銜接資料。

沒接觸過股票...看不懂裡面資料什麼是重覆什麼不是重覆...
在我看起來怎麼每個都很像...
作者: sunshine010    時間: 2018-9-11 13:41

回復 8# 准提部林


  謝謝兩位的回覆!

關於准大的建議 我正在參考您的部落格研究可以怎麼修正

這程式原本在2013跑得蠻順的 改成2003就一堆狀況 我也很苦惱QQ 只能持續摸索了
作者: 准提部林    時間: 2018-9-12 11:36

基本架構:
1) AH1 放資料變動檢測公式, 若有變動, 則加一筆新記錄,     
    例外:B2:AG2有[錯誤值]時, 或 B2 非數值(沒有時間值), 則不記錄~~
2) 在B3:AG3同時存放這筆記錄, 供下次比對是否變動
3) A3累計筆數, 同時記錄到MAIN表相對應儲存格

這麼多表同時觸發程式, 會不會打架.產生錯誤.或漏記錄, 不得而知,
自行去測, 並依實際運用去自行修改公式或程式, 能幫的就這樣:
[attach]29379[/attach]
作者: 准提部林    時間: 2018-9-12 13:45

Sheets(1).Cells(Me.Index + 1, 2) = [A3]
改成以下才對:
Sheets(1).Cells(Me.Index, 2) = [A3]
作者: sunshine010    時間: 2018-9-12 15:20

回復 11# 准提部林


    謝謝准大! 非常感謝您無私的幫助 我本來正在嘗試用您網站的提供的程式來修改

結果就有新的回覆了! 我來試試看實際跑起來能不能成功!




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