返回列表 上一主題 發帖

filter型態不符合

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

回復 5# 軒云熊

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

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

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

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

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

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

請繼續加油~  


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

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 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 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 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

本帖最後由 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 的分享與教學 小弟學到新的 東西了 真的非常感謝
下面是結果  缺點 真的變慢了....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

        靜思自在 : 多做多得。少做多失。
返回列表 上一主題