返回列表 上一主題 發帖

filter型態不符合

本帖最後由 n7822123 於 2020-8-1 02:48 編輯

回復 1# ssooi


因為你的Filter 用法錯啦~~

第1個參數要放入 "陣列",第2個參數要放入 "字串"

初學者請善用 "F1" 來查用法






所以依你的程式  Filter(a,all(i)) 要改成 Filter(all,a)

剛好有個範例可以用Filter示範給你看,如下鏈結


http://forum.twbts.com/thread-8370-1-1.html

不過你的程式不只這個問題......

有不少語法錯誤,還有邏輯問題......

你的IF可能永遠進不去......進去了也會執行失敗

再加油吧!
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

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

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

回復 5# 軒云熊

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

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

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

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

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

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

請繼續加油~  


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

本帖最後由 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

        靜思自在 : 不要隨心所欲,要隨心教育自己。
返回列表 上一主題