返回列表 上一主題 發帖

filter型態不符合

filter型態不符合

我先將各個地點做成一個陣列
然後將Sheet1裡面的地點與陣列做比對
若符合該地點,則將該地點整列的資料複製到該地點的分頁
但我做到一半就卡住了
錯誤訊息是型態不符合

book1.zip (8.43 KB)

code.zip (378 Bytes)

謝謝 n7822123 的分享與教學 小弟學到新的 東西了 真的非常感謝
下面是結果  缺點 真的變慢了....XD 因為我的迴圈太多了..   
我會慢慢研究 n7822123大大還有 準提大大所寫的方式
但 有很多看不懂是真的. 不過我慢慢研究 如果不懂的地方 還要 麻煩前輩們指教 ^^"
  1. Public Sub 跨工作表陣列練習()

  2.     Dim A()
  3.     For X = 2 To Sheets.Count
  4.         Sheets(X).Cells.Clear
  5.         ReDim Preserve A(X - 2)
  6.         A(X - 2) = Sheets(X).Name
  7.     Next X
  8.    
  9.     F = Cells(1, Columns.Count).End(xlToLeft).Column
  10.     K = Range(Cells(2, 1), Cells(2, F).End(xlDown))
  11.    
  12.     For J = LBound(K) To UBound(K)
  13.         For i = LBound(A) To UBound(A)
  14.             If A(i) = K(J, 2) Then
  15.                 If Sheets(K(J, 2)).Cells(1, 1) = "" Then Sheets(1).Rows(1).Copy Sheets(K(J, 2)).Rows(1)
  16.                 For D = 1 To F
  17.                     Sheets(K(J, 2)).Cells(Rows.Count, D).End(xlUp).Offset(1, 0) = K(J, D)
  18.                 Next D
  19.             End If
  20.         Next i
  21.     Next J

  22.     Erase A, K
  23.    
  24.     Sheets(1).Select
  25.     Cells(1, 1).Select
  26.    
  27. End Sub
複製代碼

TOP

本帖最後由 n7822123 於 2020-8-2 16:49 編輯

回復 15# n7822123

上面是"動態陣列" 的寫法,但這不是我的風格

我的習慣是用 "動態字串",再轉陣列,自由度我覺得更高(A既可以是字串,也可以是陣列)

如下,看你喜歡哪一個


Dim A
For Each sh In Sheets
  If sh.Name <> ActiveSheet.Name Then A = A & "," & sh.Name
Next
A = Split(Mid(A, 2), ",")
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2020-8-2 16:38 編輯

回復 14# 軒云熊


欄 跟 列  的問題 我是這樣寫

如果你不考慮"執行效率"的話,你的程式在功能上問題

論到"執行效率"準大才是行家,我也只是一般水準

準大寫的程式在"執行效率"上,都有非常高的水準!

不過準大有時會為了執行效率,把程式寫的比較繞,沒那麼直覺

新手真的不易看懂,所以不建議新手去看準大的程式   

這與我的寫作習慣不太一樣,我認為寫直覺、直接一點比較好用於維護(若以後程式需要更新、修改)

所以我認為我的程式應該是比較"親民"一點~ 當然不代表新手就能看得懂


請問 那如果要讓  A = Array("三商", "遠東", "信義")  變成動態有彈性 該如何寫呢?

要先下邏輯,除了本身工作表以外的工作表都納入A陣列,可以這樣寫

Dim A(): K = -1
For Each sh In Sheets
  If sh.Name <> ActiveSheet.Name Then
    K = K + 1: ReDim Preserve A(K)
    A(K) = sh.Name
  End If
Next
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 軒云熊 於 2020-8-2 15:21 編輯

回復 13# n7822123
謝謝 n7822123 的說明 我明白了  請問 那如果要讓  A = Array("三商", "遠東", "信義")  變成動態有彈性 該如何寫呢?
因為現在有一個問題 就是 如果工作表變多了 也只會比對3個工作表 想法是把工作表名子丟到Array()裡面 但是不知道怎麼丟   欄 跟 列  的問題 我是這樣寫
  1. Public Sub 跨工作表陣列練習()

  2.     For X = 2 To Sheets.Count
  3.         Sheets(X).Cells.Clear
  4.     Next X
  5.    
  6.     A = Array("三商", "遠東", "信義")
  7.     K = Range(Cells(2, 1), Cells(2, 4).End(xlDown))
  8.     F = Cells(1, Columns.Count).End(xlToLeft).Column

  9.     For J = LBound(K) To UBound(K)
  10.         For i = LBound(A) To UBound(A)
  11.             If A(i) = K(J, 2) Then
  12.                 If Sheets(K(J, 2)).Cells(1, 1) = "" Then Sheets(1).Rows(1).Copy Sheets(K(J, 2)).Rows(1)
  13.                 For D = 1 To F
  14.                     Sheets(K(J, 2)).Cells(Rows.Count, D).End(xlUp).Offset(1, 0) = K(J, D)
  15.                 Next D
  16.             End If
  17.         Next i
  18.     Next J

  19.     Erase A, K
  20.    
  21.     Sheets(1).Select
  22.     Cells(1, 1).Select
  23.    
  24. End Sub
複製代碼

TOP

本帖最後由 n7822123 於 2020-8-2 12:07 編輯

回復 12# 軒云熊

順便請問為甚麼使用                 
D = Array(K(J, 1), K(J, 2), K(J, 3))
Sheets(K(J, 2)).Rows(E) = D
的時候會出現 #N/A


Sheets(K(J, 2)).Rows(E) = D

Rows代表整列,而你的D陣列只有3筆資料,所以沒資料的部分就變成"#N/A"

應該如何寫 才不會出現 #N/A

等號前面範圍只有3欄而不是整列所有欄,就不會變成#N/A

Sheets(K(J, 2)).Cells(E, 1).Resize(, 3) = D

依陣列資料筆數的彈性寫法 (你的陣列從0開始,所以要加1)

Sheets(K(J, 2)).Cells(E, 1).Resize(, UBound(D) + 1) = D
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 軒云熊 於 2020-8-2 11:11 編輯

回復 10# n7822123

謝謝 n7822123 大大的 分享 小弟研究一下 XD
順便請問為甚麼使用                 
               D = Array(K(J, 1), K(J, 2), K(J, 3))
                Sheets(K(J, 2)).Rows(E) = D
的時候會出現 #N/A

javascript:;
應該如何寫 才不會出現 #N/A

888.png (79.11 KB)

888.png

TOP

本帖最後由 n7822123 於 2020-8-2 01:20 編輯

回復 5# 軒云熊

人家說他成功了,不過沒貼程式無法驗證

但是你的程式還沒成功唷,因為你每次都把E重置為2

再執行E=E+1,所以E最多=3 (第3列)

遇到同一個地點有3筆資料以上,

你會一直覆蓋各分頁的第3列(第2筆資料)

你可以把資料輸入多一點試試,如下圖

請繼續加油~  


123.png
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2020-8-1 23:56 編輯

回復 8# ssooi

恭喜恭喜,大概能猜出你們是用2個迴圈做比對的寫法~

手癢了一下,我也公佈我的寫法吧,只有"一個迴圈"

如果用準大提到的 工作表"篩選"功能,應該會寫的更簡單

每個分頁,我自己多複製了"標題列",這樣感覺比較正常~

這個題目用G大喜歡用的Match函數就可以輕鬆解決了

如果你們想要讓程式更加快狠準Match函數值得你花時間研究一下用法

程式如下


Sub Test0801()
All = Array("三商", "遠東", "信義")
Rn = [A1].End(4).Row
For R = 1 To Rn
  B = Application.Match(Cells(R, 2), All, 0)
  If Not IsError(B) Then '地點是否在All陣列內
    With Sheets(Cells(R, 2).Value)
      Ro = .Cells(Rows.Count, 1).End(3).Row '找每頁最末列
      If Ro = 1 And .[A1] = "" Then Range([A1], [A1].End(2)).Copy .[A1]     '複製標提列
      Ro = Ro + 1: Range(Cells(R, 1), Cells(R, 1).End(2)).Copy .Cells(Ro, 1) '複製資料
    End With
  End If
Next
End Sub


檔案如下~

Test0801.rar (17.84 KB)
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

回復 8# ssooi


    E = E + 1 這段也不用 .....XD  抱歉 我也是新手我們可以互相學習

TOP

        靜思自在 : 時時好心就是時時好日。
返回列表 上一主題