返回列表 上一主題 發帖

匯出_但不重覆匯出的資料

回復 12# hugh0620
那就乖一點
  1. Private Sub CommandButton1_Click()

  2. Dim Ay()
  3. Set d = CreateObject("Scripting.Dictionary")
  4. With Sheet2
  5. .Unprotect "1234"


  6.     ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 2))
  7.         For i = 1 To UBound(ar, 1)
  8.             mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 3)))
  9.             d(mystr1) = d.Count
  10.         Next

  11.     With Sheet1
  12.         ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 6))
  13.         For i = 1 To UBound(ar, 1)
  14.             mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 6)))
  15.             If d.exists(mystr1) = False Then
  16.                 ReDim Preserve Ay(s)
  17.                 Ay(s) = Array(ar(i, 1), ar(i, 2), ar(i, 6), ar(i, 7))
  18.                 s = s + 1
  19.             End If
  20.         Next
  21.     End With
  22.     If s > 0 Then .[B65536].End(xlUp).Offset(1, 0).Resize(s, 4) = Application.Transpose(Application.Transpose(Ay))
  23.     .Protect "1234"

  24. End With

  25. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 10# Hsieh

   Dear 大大

   小小卡彈中,若是sheet[Data]中已有一筆資,我經過測試後,在活頁[輸入]就匯不過去了,
    執行的時候發現是 mystr1 = Join(Application.Index(ar, i)) 這行指令會產生{執行階段錯誤"13" 型態不符}
    請大大指導一下~

   問題如附件之範本 匯出_但不重覆_延伸題4.rar (12.54 KB)
學習才能提升自己

TOP

回復 10# Hsieh


    謝謝大大~ 問題解決了
        只要在匯前解開(Unprotect)與匯後鎖上就好了(Protect)

   真是感謝大大~ 我的整份報表慢慢將完成
學習才能提升自己

TOP

本帖最後由 Hsieh 於 2011-1-6 19:06 編輯

回復 9# hugh0620
  1. Private Sub CommandButton1_Click()

  2. Dim Ay()
  3. Set d = CreateObject("Scripting.Dictionary")
  4. With Sheet2
  5. .Unprotect "password"  'password指工作表保護密碼
  6.     ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 2))
  7.         For i = 1 To UBound(ar, 1)
  8.             mystr1 = Join(Application.Index(ar, i))
  9.             d(mystr1) = d.Count
  10.         Next

  11.     With Sheet1
  12.         ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 6))
  13.         For i = 1 To UBound(ar, 1)
  14.             mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 6)))
  15.             If d.exists(mystr1) = False Then
  16.                 ReDim Preserve Ay(s)
  17.                 Ay(s) = Array(ar(i, 1), ar(i, 2), ar(i, 6), ar(i, 7))
  18.                 s = s + 1
  19.             End If
  20.         Next
  21.     End With
  22.     If s > 0 Then .[B65536].End(xlUp).Offset(1, 0).Resize(s, 4) = Application.Transpose(Application.Transpose(Ay))
  23.     .Protect "password"  'password指工作表保護密碼
  24. End With

  25. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 7# Hsieh


    Dear 大大

        小弟又小卡彈了~ 大大我需要將資料匯出,但是Data的部份又要保護避免被使用者修改(使用者僅能看)
            如果我把工作頁保護了,匯出的時候程式執行就會產生錯誤
        這樣的問題是否可以解決呢??

            附件為問題之範本 匯出_但不重覆_延伸題3.rar (12.41 KB)
學習才能提升自己

TOP

回復 7# Hsieh


    謝謝大大~ 原來只要把xldown 改成xlup就可以將bug給克服
學習才能提升自己

TOP

回復 7# hugh0620
  1. Private Sub CommandButton1_Click()
  2. Dim Ay()
  3. Set d = CreateObject("Scripting.Dictionary")
  4. With Sheet2
  5.     ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 2))
  6.         For i = 1 To UBound(ar, 1)
  7.             mystr1 = Join(Application.Index(ar, i))
  8.             d(mystr1) = d.Count
  9.         Next

  10.     With Sheet1
  11.         ar = .Range(.[B5], .[B65536].End(xlUp).Offset(, 6))
  12.         For i = 1 To UBound(ar, 1)
  13.             mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 6)))
  14.             If d.exists(mystr1) = False Then
  15.                 ReDim Preserve Ay(s)
  16.                 Ay(s) = Array(ar(i, 1), ar(i, 2), ar(i, 6), ar(i, 7))
  17.                 s = s + 1
  18.             End If
  19.         Next
  20.     End With
  21.     If s > 0 Then .[B65536].End(xlUp).Offset(1, 0).Resize(s, 4) = Application.Transpose(Application.Transpose(Ay))
  22. End With
  23. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 4# Hsieh

Dear 大大
     我用一個很笨的方式來處理當DATA無資料時,所產生的問題
     不知道大大是否有其他方式
     這是我用大大的程式碼修改 (紅色為我新增的地方)
Dim Ay()
Set d = CreateObject("Scripting.Dictionary")
With Sheet2
    ar = .Range(.[B5], .[B5].End(xlDown).Offset(, 2))
        If UBound(ar, 1) = 0 Or UBound(ar, 1) = 65536 - 4 Then
            For i = 1 To 1
                mystr1 = Join(Application.Index(ar, i))
                d(mystr1) = d.Count
            Next
        Else
            For i = 1 To UBound(ar, 1)
                mystr1 = Join(Application.Index(ar, i))
                d(mystr1) = d.Count
            Next
        End If    With Sheet1
        ar = .Range(.[B5], .[B5].End(xlDown).Offset(, 6))
        For i = 1 To UBound(ar, 1)
            mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 6)))
            If d.exists(mystr1) = False Then
                ReDim Preserve Ay(s)
                Ay(s) = Array(ar(i, 1), ar(i, 2), ar(i, 6), ar(i, 7))
                s = s + 1
            End If
        Next
    End With
    If s > 0 Then .[B65536].End(xlUp).Offset(1, 0).Resize(s, 4) = Application.Transpose(Application.Transpose(Ay))
End With
學習才能提升自己

TOP

回復 4# Hsieh


    Dear 大大
        感謝~ 我知道要改哪邊了~ 程式碼執行上也沒有問題~
            但是小弟在測試時~ 又胡思亂想~ 結果~ 找出了一個問題~
            就是若Data中~一開始就沒有資料或是僅一筆資料的時候好像是就會產生問題~
             For i = 1 To UBound(ar, 1) 該行指令中UBound(ar, 1) 就會等於65536 造成一直跑不停

        再請大大賜教一下

        附件為問題之範本 匯出_但不重覆_延伸題2.rar (10.98 KB)
學習才能提升自己

TOP

本帖最後由 Hsieh 於 2011-1-4 15:49 編輯

回復 3# hugh0620
  1. Private Sub CommandButton1_Click()
  2. Dim Ay()
  3. Set d = CreateObject("Scripting.Dictionary")
  4. With Sheet2
  5.     ar = .Range(.[B5], .[B5].End(xlDown).Offset(, 2))
  6.         For i = 1 To UBound(ar, 1)
  7.             mystr1 = Join(Application.Index(ar, i))
  8.             d(mystr1) = d.Count
  9.         Next

  10.     With Sheet1
  11.         ar = .Range(.[B5], .[B5].End(xlDown).Offset(, 6))
  12.         For i = 1 To UBound(ar, 1)
  13.             mystr1 = Join(Array(ar(i, 1), ar(i, 2), ar(i, 6)))
  14.             If d.exists(mystr1) = False Then
  15.                 ReDim Preserve Ay(s)
  16.                 Ay(s) = Array(ar(i, 1), ar(i, 2), ar(i, 6), ar(i, 7))
  17.                 s = s + 1
  18.             End If
  19.         Next
  20.     End With
  21.     If s > 0 Then .[B65536].End(xlUp).Offset(1, 0).Resize(s, 4) = Application.Transpose(Application.Transpose(Ay))
  22. End With

  23. End Sub
複製代碼
學海無涯_不恥下問

TOP

        靜思自在 : 【生命在呼吸間】佛陀說:「生命在呼吸間。」人無法管住自己的生命,更無法擋住死期,讓自己永住人間。既然生命去來這麼無常,我們更應該好好地愛惜它、利用它、充實它,讓這無常、寶貴的生命,散發它真善美的光輝,映照出生命真正的價值。
返回列表 上一主題