Board logo

標題: [發問] 檢查重複性質的資料 [打印本頁]

作者: jackyliu    時間: 2013-7-22 22:06     標題: 檢查重複性質的資料

檢查重複性質的資料
大大: 可否幫忙解惑一下,VBA 寫法,
1. 將Sheet1 的資料,複製到Sheet2 的 A1 位置開始,依序寫入.
2. 重複性的資料,不要再重複複製到Sheet2
3. 比較不可重複欄位:姓名,地區,性別,婚姻
以上感恩 ~
作者: GBKEE    時間: 2013-7-23 11:28

回復 1# jackyliu
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim D As Object, E, I As Integer
  4.     Set D = CreateObject("Scripting.dictionary")             '字典物件
  5.     For Each E In Sheet1.Range("a1").CurrentRegion.Rows      '物件: A1所延伸範圍的列
  6.          D(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
  7.     Next
  8.     With Sheet2
  9.         .Cells.Clear
  10.         I = 1
  11.         For Each E In D.KEYS
  12.             .Cells(I, "A").Resize(1, UBound(D(E), 2)) = D(E)   '讀取字典物件的ITEM(陣列)
  13.         I = I + 1
  14.         Next
  15.     End With
  16. End Sub
複製代碼

作者: jackyliu    時間: 2013-7-23 13:50

程式直到這行就出現錯誤了,會是宣告的問題還是我Execl資料有數字,英文,中文 的關係嗎?

.Cells(I, "A").Resize(1, UBound(D(E), 2)) = D(E)   '讀取字典物件的ITEM(陣列)

執行階段錯誤'13'
型態不符
作者: GBKEE    時間: 2013-7-23 14:06

回復 3# jackyliu
給的程式碼是以 Sheet1A1所延伸範圍的列 為 Sheet1 的資料
For Each E In Sheet1.Range("a1").CurrentRegion.Rows      '物件: A1所延伸範圍的列
你測試檔案中 Sheet1 的資料 在哪裡?? 須附上你測試檔才了解
作者: jackyliu    時間: 2013-7-23 22:20

感謝板大用心....
    For Each E In Sheet1.Range("a1").CurrentRegion.Rows      '物件: A1所延伸範圍的列
         D(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
    Next
以上程式說明: 搜尋整數變數E 範圍是Sheet1的A1列的範圍,將搜尋到的第1,2,3,5欄的E值給變數D,持續搜尋行列資料,直到沒有資料為止.

    With Sheet2
        .Cells.Clear
        I = 1
        For Each E In D.KEYS
            .Cells(I, "A").Resize(1, UBound(D(E), 2)) = D(E)   '讀取字典物件的ITEM(陣列)
        I = I + 1
        Next
    End With
以上程式說明: Sheet2所有資料清除,從陣列變數D裡搜尋陣列變數E的值,將每一行列的值,依序寫入Sheet2

從code 理解的看法說明如上, 不知道解釋有誤嗎? 請教導!
可否幫忙教導程式如何判定已存在,有重複內容,不執行寫入Sheet2裡,好嗎?

並附上有錯誤的檔案,如附件!
作者: GBKEE    時間: 2013-7-24 06:39

回復 5# jackyliu
可能是版本的差異2000版沒用過,不知錯誤在哪裡,2003執行沒有錯誤的
請找出錯誤點如圖

[attach]15537[/attach]



何判定已存在,有重複內容,不執行寫入Sheet2裡
程式碼如下
  1. Option Explicit
  2. Sub Ex()
  3.     Dim D1 As Object, D2 As Object, E, I As Integer, S As String
  4.     Set D1 = CreateObject("Scripting.dictionary")                   '字典物件
  5.     Set D2 = CreateObject("Scripting.dictionary")                   '字典物件
  6.     For Each E In Sheet1.Range("a1").CurrentRegion.Rows             '物件: A1所延伸範圍的列
  7.          S = E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)  'S=>key值
  8.          D1(S) = E.Value                                            '有相同的key值-> E範圍的值(陣列) 讀入到Item
  9.          D2(S) = D2(S) + 1                                          '有相同的key值-> item +1
  10.     Next
  11.     With Sheet2
  12.         .Cells.Clear
  13.         I = 1
  14.         For Each E In D2.KEYS
  15.             If D2(E) = 1 Then                                       'D2沒重覆的key值 -> item= 1
  16.                 .Cells(I, "A").Resize(1, UBound(D1(E), 2)) = D1(E)  '讀取D1相同的key值: 導入D1的Item(陣列)
  17.                 I = I + 1
  18.             End If
  19.         Next
  20.     End With
  21. End Sub
複製代碼

作者: c_c_lai    時間: 2013-7-24 08:26

回復 4# GBKEE
  1.         For Each E In D.KEYS
  2.             .Cells(I, "A").Resize(1, UBound(D(E), 2)) = D(E)
複製代碼
我偵測的結果:(Office 2010)
當 E 傳入值為 "無" 時,它就會產生 "型態不符" 的訊息。
我用 Debug 模式逐一執行,觀察相關變數的存入值之變化,
  1.         Dk(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
複製代碼
當發現 E.Value 莫名為 "無' 時,便知大勢已去。但非每次如此,只要是有此現象
接下來的執行都是  "型態不符"。 此時,再將程式碼重新儲存、喝杯茶再重新執行,
它舒暢了便又正常執行了。
這極可能是 Office 潛在的 Bug, 亦即 E 值的型態判定之問題,使得代入值會無端
變為 "無"。
P.S.  我在 ThisWorkbook、以及 Module1 分別執行都曾發生此異狀。
作者: GBKEE    時間: 2013-7-24 08:47

回復 7# c_c_lai
煩請在加上.Value測試看看
  1.         For Each E In D.KEYS
  2.             .Cells(I, "A").Resize(1, UBound(D(E), 2)).Value = D(E)
複製代碼

作者: c_c_lai    時間: 2013-7-24 10:08

本帖最後由 c_c_lai 於 2013-7-24 10:11 編輯

回復 8# GBKEE
絕對不是 .Value 的因素,
.Cells(cts, "A").Resize(1, UBound(Dk(E), 2)) = Dk(E) 與
.Cells(cts, "A").Resize(1, UBound(Dk(E), 2)).Value = Dk(E)
其實都是同等意義,因為在一進入 For Each E In D.KEYS 後即偵測到
值為 "無" 的情況  (此現象才令人百思不解)。
只要沒異狀發生,接下多次執行都是 OK,
反之、則均是 "型態不符"。理論上是不該有的錯誤,我亦試著
將 E 明確宣告為 Variant, 只要發生異狀神仙也無解,
只能等它氣消了!

P. S. 順便請教,最近網頁是不是被更改到了,
         我的右上角個人資訊只顯示
[module]邊欄模塊_我的助手[/module]
作者: GBKEE    時間: 2013-7-24 10:17

回復 9# c_c_lai
辛苦了,請換個變數名稱試試看
  1. For Each K In D.KEYS
  2.             .Cells(I, "A").Resize(1, UBound(D(K), 2)) = D(K)   
複製代碼

作者: c_c_lai    時間: 2013-7-24 11:04

回復 10# GBKEE
這一招也早就試過了,無效!
我觀察過是 D.KEYS 帶值轉入時的存值問題。
亦即發生在 For Each E In D.KEYS 的之前。
目前怎麼測也都找不出,蠻靈異的。
作者: GBKEE    時間: 2013-7-24 11:16

回復 11# c_c_lai
謝謝你,你已儘全力,莫可耐何它了
作者: Hsieh    時間: 2013-7-24 16:00

  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. With 工作表1
  4.    For Each a In .Range(.[A1], .[A1].End(xlDown))
  5.       mystr = a & a.Offset(, 1) & a.Offset(, 2) & a.Offset(, 4)
  6.       If d.exists(mystr) Then MsgBox a & "資料重複"
  7.       d(mystr) = Application.Transpose(Application.Transpose(a.Resize(, 6).Value))
  8.    Next
  9. End With
  10. With 工作表2
  11. .Cells.ClearContents
  12. .[A1].Resize(d.Count, 6) = Application.Transpose(Application.Transpose(d.items))
  13. End With
  14. End Sub
複製代碼
回復 5# jackyliu
作者: jackyliu    時間: 2013-7-24 22:05

版大 :
一樣是 執行階段錯誤'13'型態不符
時可以有時有錯誤,是不接受這樣的寫法嗎?
不知道是哪出了問題 ?
作者: GBKEE    時間: 2013-7-25 07:08

回復 14# jackyliu
Hsieh超版 13# 的試了,沒如沒錯誤可照著改試試看
作者: jackyliu    時間: 2013-7-25 07:58

版大:
       程式碼換上最後版, 一樣會出現 ---> 執行階段錯誤'13' 型態不符
程式偵錯停滯在 更新的那段, 看不出來是什麼問題, 版大可以幫忙一下嗎?

     .Cells(I, "A").Resize(1, UBound(D(K), 2)) = D(K)
作者: GBKEE    時間: 2013-7-25 08:45

回復 16# jackyliu
我只有2003版執行一直好好的, 無法查出你的錯誤在哪裡.
c_c_lai 也幫忙測試其他版本有時會有錯誤.(不了解為何如此)
作者: c_c_lai    時間: 2013-7-25 08:56

回復 16# jackyliu
這是經過我測試過 OK 的,雖然內容大致一樣,
但還是使用我的程式碼試試看。
(之前我亦測出你所說的狀況,試試這隻看看,其中也將 Debug 的過程內容亦併作成註釋)
  1. Option Explicit

  2. Sub Ex()
  3.     Dim Dk As Object, E As Variant, cts As Integer
  4.     '  Dim Dk As Object, E, cts As Integer
  5.    
  6.     Set Dk = CreateObject("Scripting.dictionary")         '  字典物件
  7.    
  8.     '  1. 將 Sheet1 的資料,複製到 Sheet2 的 A1 位置開始,依序寫入.
  9.     '  2. 重複性的資料,不要再重複複製到Sheet2
  10.     '  3. 比較不可重複欄位:姓名,地區,性別,婚姻
  11.     For Each E In Sheet1.Range("A1").CurrentRegion.Rows  '  物件: A1 所延伸範圍的列
  12.         '  E.Value : Variant/Variant(1 to 1, 1 to 6) : ThisWorkbook.Ex
  13.         '  E.Value(1,1) : "姓名" : Variant/String : ThisWorkbook.Ex2
  14.         '  E.Value(1,2) : "地區" : Variant/String : ThisWorkbook.Ex2
  15.         '  E.Value(1,3) : "性別" : Variant/String : ThisWorkbook.Ex2
  16.         '  E.Value(1,4) : "教育程度" : Variant/String : ThisWorkbook.Ex2
  17.         '  E.Value(1,5) : "婚姻" : Variant/String : ThisWorkbook.Ex2
  18.         '  E.Value(1,6) : "子女" : Variant/String : ThisWorkbook.Ex2
  19.         Dk(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
  20.     Next
  21.    
  22.     With Sheet2
  23.         .Cells.Clear
  24.         cts = 1
  25.         For Each E In Dk.KEYS
  26.             '  UBound(Dk(E), 1) : 1 : Long : ThisWorkbook.Ex
  27.             '  UBound(Dk(E), 2) : 6 : Long : ThisWorkbook.Ex
  28.             '  E : "姓名地區性別婚姻" : Variant/String : ThisWorkbook.Ex2
  29.             '  E : "小李台北女已婚" : Variant/String : ThisWorkbook.Ex2
  30.             '  E : "小劉桃園男已婚" : Variant/String : ThisWorkbook.Ex2
  31.             .Cells(cts, "A").Resize(1, UBound(Dk(E), 2)).Value = Dk(E)   '  讀取字典物件的 ITEM (陣列)
  32.         cts = cts + 1
  33.         Next
  34.     End With
  35. End Sub
複製代碼
請把以上複製的程式碼放入到 ThisWorkbook 程式碼區內執行。
P.S.  目前在我的檔案中 Module1 區亦放入相同程式碼分別測試結果 (Sub 名稱不同),
        這是為了方便測試 "型態不符" 問題所在之故。
作者: c_c_lai    時間: 2013-7-25 09:21

回復 16# jackyliu
回復 17# GBKEE
問題可能出在
  1. D(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
複製代碼
Hsieh 版大應用了
  1. d(mystr) = Application.Transpose(Application.Transpose(a.Resize(, 6).Value))
複製代碼
在陣列值移轉中透過   Application.Transpose(),使得數值得以正確 Assign,其穩定度比直接
Assign 會來得確實、資料 Assigment 中較不易流失。我將 Hsieh 版大的程式加上變數宣告,
載於如下:
  1. Sub ex()                                              '  Hsieh
  2.     Dim d As Object, a As Range, mystr As String
  3.    
  4.     Set d = CreateObject("Scripting.Dictionary")

  5.     With Sheet1
  6.         For Each a In .Range(.[A1], .[A1].End(xlDown))
  7.             mystr = a & a.Offset(, 1) & a.Offset(, 2) & a.Offset(, 4)
  8.             '  If d.exists(mystr) Then MsgBox a & "資料重複"
  9.             d(mystr) = Application.Transpose(Application.Transpose(a.Resize(, 6).Value))
  10.         Next
  11.     End With
  12.    
  13.     With Sheet2
  14.         .Cells.ClearContents
  15.         .[A1].Resize(d.Count, 6) = Application.Transpose(Application.Transpose(d.items))
  16.     End With
  17. End Sub
複製代碼

作者: GBKEE    時間: 2013-7-25 09:33

回復 19# c_c_lai
15# 有問到  Hsieh超版 13# 的試了,沒如沒錯誤可照著改試試看   
你18# 程式碼, 只差我沒書明 E As Variant
  1. Dim Dk As Object, E As Variant, cts As Integer
  2.       'Dim Dk As Object, E, cts As Integer
複製代碼

請在我的程式碼版本中,書明 E As Variant 再測試看
作者: c_c_lai    時間: 2013-7-25 10:01

本帖最後由 c_c_lai 於 2013-7-25 10:02 編輯

回復 20# GBKEE
您目前看到的 E 或者是 E As Variant 都已多方測試過,
當時 E 為何修改成 明確宣告亦是此由來。
目前只等待 jackyliu 的測試結果了,
我想極有可能真的是 Assign 的問題,
因為問題發生時我有關查到
  1.         For Each E In Dk.KEYS
  2.             '  E 傳入值為 "無", 以致發生以下延生的 "型態不符" 錯誤訊息
  3.             .Cells(cts, "A").Resize(1, UBound(Dk(E), 2)).Value = Dk(E)   '  讀取字典物件的 ITEM (陣列)
複製代碼

作者: c_c_lai    時間: 2013-7-25 17:17

回復 20# GBKEE
終於找到問題徵結點了。 當執行完後
  1. For Each E In Sheet1.Range("A1").CurrentRegion.Rows
  2.     D(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
  3. Next
複製代碼
D.KEYS 陣列值內容應該共有六個,即:
  1. '  D.KEYS :  : Variant/Variant(0 to 5) : ThisWorkbook.ex
  2. '  D.KEYS(0) : "姓名地區性別婚姻" : Variant/String : ThisWorkbook.ex
  3. '  D.KEYS(1) : "小李台北女已婚" : Variant/String : ThisWorkbook.ex
  4. '  D.KEYS(2) : "小劉桃園男已婚" : Variant/String : ThisWorkbook.ex
  5. '  D.KEYS(3) : "小陳新竹女未婚" : Variant/String : ThisWorkbook.ex
  6. '  D.KEYS(4) : "小張中壢女未婚" : Variant/String : ThisWorkbook.ex
  7. '  D.KEYS(5) : "小湯台中男已婚 " : Variant/String : ThisWorkbook.ex
複製代碼
此時,則執行一切順利。 反之,當處理陣列結果為下列情況時:
  1. '  D.KEYS :  : Variant/Variant(0 to 8) : ThisWorkbook.ex
  2. '  D.KEYS(0) : "姓名地區性別婚姻" : Variant/String : ThisWorkbook.ex
  3. '  D.KEYS(1) : "小李台北女已婚" : Variant/String : ThisWorkbook.ex
  4. '  D.KEYS(2) : "小劉桃園男已婚" : Variant/String : ThisWorkbook.ex
  5. '  D.KEYS(3) : 0 : Variant/Integer : ThisWorkbook.ex
  6. '  D.KEYS(4) : 1 : Variant/Integer : ThisWorkbook.ex
  7. '  D.KEYS(5) : 2 : Variant/Integer : ThisWorkbook.ex
  8. '  D.KEYS(6) : "小陳新竹女未婚" : Variant/String : ThisWorkbook.ex
  9. '  D.KEYS(7) : "小張中壢女未婚" : Variant/String : ThisWorkbook.ex
  10. '  D.KEYS(8) : "小湯台中男已婚 " : Variant/String : ThisWorkbook.ex
複製代碼
上帝、佛祖啊!
當圍圈執行到 D.KEYS(3)、D.KEYS(4)、D.KEYS(5) 就中樂透了。
這表示在
  1. For Each E In Sheet1.Range("A1").CurrentRegion.Rows
  2.     D(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
  3. Next
複製代碼
處裡階段出了問題。 應該將重複值予以過濾調。
作者: jackyliu    時間: 2013-7-25 18:27

重複值予以過濾調,和我說的重複值,不要複製到 Sheet2 的意思嗎?
有解嗎?
作者: c_c_lai    時間: 2013-7-25 19:40

回復 20# GBKEE
回復 23# jackyliu
  1. Option Explicit

  2. Sub ex()
  3.     Dim D As Object, E As Variant, cts As Integer
  4.    
  5.     Set D = CreateObject("Scripting.dictionary")         '  字典物件
  6.    
  7.     For Each E In Sheet1.Range("A1").CurrentRegion.Rows  '  物件: A1 所延伸範圍的列
  8.         If D.exists(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = False Then _
  9.                D(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
  10.     Next
  11.    
  12.     With Sheet2
  13.         .Cells.Clear
  14.         cts = 1
  15.         For Each E In D.KEYS
  16.             .Cells(cts, "A").Resize(1, UBound(D(E), 2)).Value = D(E)   '  讀取字典物件的 ITEM (陣列)
  17.         cts = cts + 1
  18.         Next
  19.     End With

  20.     Set D = Nothing
  21. End Sub
複製代碼
加入了過濾判斷,If D.exists(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = False Then ....,
jackyliu 請再試看看!
作者: GBKEE    時間: 2013-7-25 19:50

回復 24# c_c_lai
2003版沒有的問題,怎會在2007版出現,謝謝你的幫忙偵錯.
作者: jackyliu    時間: 2013-7-25 21:55

板大:
我是用2003版的, 直接按執行OK, 執行三次後,
我選擇逐步偵錯,一個一個看,  又會出現一樣的錯誤耶!

執行階段錯誤'13'
型態不符
作者: luhpro    時間: 2013-7-25 22:41

板大:
我是用2003版的, 直接按執行OK, 執行三次後,
我選擇逐步偵錯,一個一個看,  又會出現一樣的錯誤耶!
...
jackyliu 發表於 2013-7-25 21:55

如果在建立之初就把 無 濾掉是否有可能達到你的需求呢?
  1. .
  2.     For Each E In Sheet1.Range("a1").CurrentRegion.Rows      '物件: A1所延伸範圍的列
  3.     If Not E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5) = "" Then
  4.          D(E.Cells(1, 1) & E.Cells(1, 2) & E.Cells(1, 3) & E.Cells(1, 5)) = E.Value
  5.       End If
  6.     Next
複製代碼

作者: GBKEE    時間: 2013-7-26 06:23

回復 26# jackyliu
再試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim D As Object, E, i As Integer
  4.     Set D = CreateObject("Scripting.dictionary")             '字典物件
  5.     i = 1
  6.     With Sheet1
  7.         Do While .Cells(i, "A") <> ""
  8.             E = .Cells(i, "A") & .Cells(1, "B") & .Cells(1, "C") & .Cells(1, "E")
  9.             If D.exists(E) = False Then
  10.                D(E) = .Cells(i, "A").Resize(1, 6).Value
  11.             End If
  12.             i = i + 1
  13.         Loop
  14.     End With
  15.     i = 1
  16.     With Sheet2
  17.         .Cells.Clear
  18.         For Each E In D.KEYS
  19.             .Cells(i, "A").Resize(1, UBound(D(E), 2)) = D(E)   '讀取字典物件的ITEM(陣列)
  20.             i = i + 1
  21.         Next
  22.     End With
  23. End Sub
複製代碼

作者: c_c_lai    時間: 2013-7-26 07:04

本帖最後由 c_c_lai 於 2013-7-26 07:33 編輯

回復 28# GBKEE
回復 26# jackyliu
試著將以下程式碼修
  1. For Each E In D.KEYS
  2.     .Cells(cts, "A").Resize(1, UBound(D(E), 2)).Value = D(E)   '  讀取字典物件的 ITEM (陣列)
  3.     cts = cts + 1
  4. Next
複製代碼
改成
  1. For Each E In D.KEYS
  2.     If E <> "" Then _
  3.         .Cells(cts, "A").Resize(1, UBound(D(E), 2)).Value = D(E)   '  讀取字典物件的 ITEM (陣列)
  4.     cts = cts + 1
  5. Next
複製代碼
再將它操練一下。

P.S. 回覆人家時,請使用選按 "回覆" 鈕,否則當事人是不知道妳已回覆問題了!
       (這也是一種傳統禮節)
作者: jackyliu    時間: 2013-7-26 09:48

回復 29# c_c_lai


    Sorry ~  我以為是使用 最底下的  發表回復,
下次直接點選文章裡的回覆 ~ 造成困擾,請見諒 !!
作者: c_c_lai    時間: 2013-7-26 10:29

回復 30# jackyliu
測試看看是否能正常執行?
謝謝妳!
作者: stillfish00    時間: 2013-7-26 12:04

本帖最後由 stillfish00 於 2013-7-26 12:11 編輯

回復 26# jackyliu
依你26#的圖

要逐步執行的話,把D(E)的監看式拿掉吧。

1.  當字典用不存在的Key取回物件時會自動新增該Key,這點在偵錯時看起來還是有效的....
      你可以自己試試中斷後在即時運算視窗打   ?d("不存在的Key")  ,就會自動在d底下新增一個item啦..
2.  然後當你要逐步執行時,因為有設d(E)的監看式,每一步都會取回 d(E),可是 E 一值都是存在的Key嗎???
     不是,當你程式執行到For Each E前一行或Next後一行,E都是 '無',於是它找不到這個Key又自動新增了,所以才造成字典內的Key(6)也為無。

比起來,偵錯時若只用區域變數視窗看d值(我原本也是這樣),怎樣都不會遇到妳說的問題。
作者: GBKEE    時間: 2013-7-26 12:21

回復 29# c_c_lai
28# 的程式碼 有時還是錯誤?要加上If E <> "" Then  來過濾嗎?
作者: c_c_lai    時間: 2013-7-26 12:56

回復 33# GBKEE
28# 的程式碼我這端測試是沒問題,
自從加上 If D.exists(E) = False Then 後,
我就抓不到怪異狀況。無論是原本的、
或者是28# 的程式碼。但 jackyliu 說依舊會偶發。
目前在等待 jackyliu 的測試結果。
她說那邊好像有待再次印證。

P.S. 我加上 If E <> "" Then 是完全濾掉空字串延生的問題。
作者: jackyliu    時間: 2013-7-26 13:36

回復 33# GBKEE

28#    程式code 可以了, 可能是我誤操作.... 造成大家困擾, 對不起大家~~
感謝大家 !
作者: GBKEE    時間: 2013-7-26 13:50

回復 35# jackyliu
誤操作....  請說明一下,好了解狀況
作者: jackyliu    時間: 2013-7-26 22:28

回復 36# GBKEE


    28樓程式碼我是逐一執行,到圖mark黃色部分出現錯誤,
若一次執行完畢,是正常的;猜想是我用監看視窗的方式錯誤?

整個程式碼,我看不懂,不好意思,再麻煩大家......
只好自己認真逐一監看,程式的內容變化,
可能就像樓上(#32)說的 D(E),監看要拿掉,
可我真的不知道,要從哪裡才能弄懂這程式碼 ? ? ?
對不起大大,我還是附上一張,我監看出錯誤的畫面,
向大家交代清楚....
作者: c_c_lai    時間: 2013-7-27 07:01

本帖最後由 c_c_lai 於 2013-7-27 07:10 編輯

回復 36# GBKEE
回復 32# stillfish00
回復 37# jackyliu
經仔細推敲 stillfish00 32# 的經驗建議,的確是問題發生的癥結所在,
茲將它稍稍整理,並回溫 Debug 的過程,確實如 stillfish00 所言,
在此順便也謝謝 stillfish00 的不吝指教。
  1. 如要逐步執行 (F8) 的話,請把 D(E) 的監看式拿掉吧。 亦即將監看式視窗內的運算式 D(E) 移除。
  2. 1.  當字典用不存在的 Key 取回物件時會自動新增該 Key,這點在偵錯時看起來還是有效的....
  3.     你可以自己試試中斷後在即時運算視窗打 ?D("不存在的Key"),就會自動在 D 底下新增一個 item ..
  4. 2.  然後當你要逐步執行時,因為監看式視窗有設 D(E) 的運算式,則每一步執行時都會取回 D(E),
  5.     可是 E 一直都是存在的 Key 值嗎 ???
  6.     答案當然不是,當你程式執行到 For Each E 前一行或 Next 後一行,此時 E 如果為 "無",
  7.     於是它找不到這個 Key 又自動新增了,所以才會造成字典內的 Key(#) 也為 "無" 的原因。
  8. 3.  偵錯時若只用 "區域變數視窗" 來監看 D 值 (我原本也是這樣),
  9.     怎樣都不會遇到此 "型態不符" 的問題。 ( 在 D(E) 值若為 "無" 時的情況下 )
複製代碼
謝謝大家的經驗傳承!
作者: tofu45    時間: 2013-8-4 10:34

謝謝大大無私的分享!實用
作者: kuoliang123    時間: 2013-8-6 11:42

是用進階篩選隱藏的嗎?
作者: mhl9mhl9    時間: 2013-8-10 01:31

[attach]15740[/attach]

試試excel+sql,我把篩選出來的資料覆蓋在原database上,但你可以選擇你要輸出結果的位置,下面是輸出到sheet2.range("a10")
Set iAddress = Sheets("sheet2").Range("A10")




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