返回列表 上一主題 發帖

[發問] 不同的sheet相同的動作,如何讓它一次性完成?

  1. Sub yy()
  2.     For Each sh In Sheets '在所有工作表中循環
  3.         sh.UsedRange = sh.UsedRange.Value '把公式結果變成值
  4.         sh.[a4:ad4].AutoFilter '取消自動篩選
  5.         sh.[a4:ad4].AutoFilter '建立自動篩
  6.         
  7.         n = sh.[AC1000].End(3).Row 'ac欄最後儲存格列號
  8.         sh.Sort.SortFields.Clear '清除重建排序條件
  9.         sh.Sort.SortFields.Add Key:=sh.Range("AC5:AC" & n)
  10.         sh.Sort.SortFields.Add Key:=sh.Range("u5:u" & n)
  11.         sh.Sort.SortFields.Add Key:=sh.Range("q5:q" & n)
  12.         sh.Sort.SortFields.Add Key:=sh.Range("c5:c" & n)
  13.         sh.Sort.SortFields.Add Key:=sh.Range("d5:d" & n)

  14.         With sh.Sort '對指定範圍以指定條件排序
  15.             .SetRange sh.Range("A5:AD" & n)
  16.             .Header = xlNo
  17.             .MatchCase = False
  18.             .Orientation = xlTopToBottom
  19.             .SortMethod = xlPinYin
  20.             .Apply
  21.         End With
  22.     Next '下一個工作表
  23. End Sub
複製代碼
日期欄位日期格式不正確會影響排序正確性

TOP

用陣列方式的寫法?~是指排序嗎?
排序還是用工作表自有的排序方式效率高得多
用陣列或遞迴排序代碼都會寫得很長很複雜,而且慢。
倒是這裡排序的條件可以用循環來減少代碼量,若熟悉循環及相關變數就不用一行行的寫了。

TOP

此例中間段
  1. sh.Sort.SortFields.Add Key:=sh.Range("AC5:AC" & n)
  2.         sh.Sort.SortFields.Add Key:=sh.Range("u5:u" & n)
  3.         sh.Sort.SortFields.Add Key:=sh.Range("q5:q" & n)
  4.         sh.Sort.SortFields.Add Key:=sh.Range("c5:c" & n)
  5.         sh.Sort.SortFields.Add Key:=sh.Range("d5:d" & n)
複製代碼
可以把欄名放在陣列中循環
  1. ar = Array("ac", "u", "q", "c", "d")
  2.         For i = 0 To UBound(ar)
  3.             sh.Sort.SortFields.Add Key:=sh.Range(ar(i) & "5:" & ar(i) & n)
  4.         Next
複製代碼
是這個意思嗎?

TOP

二樓的前兩行不就是這個要求?
For Each sh In Sheets '在所有工作表中循環
        sh.UsedRange = sh.UsedRange.Value '把公式結果變成值
不必一定要copy再以值貼上才能把公式變成值的。
在所有表中循環不須建立陣列,建立了也是多一道程序,又何必多此一舉?

TOP

End後面的(3)~xlup,該欄有資料的最後一列
若妳的工作表按順序排列,可以指定從第幾個工作表開始。
如:For i = 5 To 12
Sheets(i).Activate
執行妳的工作
Next
或者以表名的文字判斷,例如:
For Each sh In Sheets
If InStr("MayJunJulAugSepOctNovDec", sh.Name) Then
sh.Activate
執行程式
End If
Next

TOP

  1. Sub test()
  2.     Workbooks("2012 samples Chart.xlsx").Activate
  3.     For Each sh In Sheets    '在所有工作表中循環
  4.         If InStr("MayJunJulAugSepOctNovDec", sh.Name) Then    '從"May"開始作業一直到最後一個工作表
  5.             sh.Activate    '執行程式

  6.             sh.UsedRange = sh.UsedRange.Value    '把公式結果變成值
  7.             sh.AutoFilterMode = False     '取消自動篩選
  8.             sh.[a4:ad4].AutoFilter    '建立自動篩

  9.             n = sh.[AC1000].End(3).Row    'ac欄最後儲存格列號
  10.             sh.Sort.SortFields.Clear    '清除重建排序條件
  11.             ar = Array("ac", "u", "q", "c", "d")
  12.             For i = 0 To UBound(ar)
  13.                 sh.Sort.SortFields.Add Key:=sh.Range(ar(i) & "5:" & ar(i) & n)
  14.             Next
  15.             With sh.Sort    '對指定範圍以指定條件排序
  16.                 .SetRange sh.Range("A5:AD" & n)
  17.                 .Header = xlNo
  18.                 .MatchCase = False
  19.                 .Orientation = xlTopToBottom
  20.                 .SortMethod = xlPinYin
  21.                 .Apply
  22.             End With
  23.         End If
  24.     Next    '下一個工作表
  25. End Sub
複製代碼
注意這一行:
  If InStr("MayJunJulAugSepOctNovDec", sh.Name) Then
sh.Name是工作表名,如工作表May表名就是May
在"MayJunJulAugSepOctNovDec"這個字串中有包含May的話就執行
其他表也一樣類推
sh.May,是錯誤的表達。

TOP

第5行開始sh.UsedRange = sh.UsedRange.Value
這個叫sh的變數前面並沒有定義,突然冒出來程式就會中斷了。
可以這樣:
Workbooks("2012 samples Chart.xlsx").Activate
        For i = 2 To 7  '從2nd的工作表執行至7st
         Sheets(i).Activate '執行工作
set sh =activesheet
            sh.UsedRange = sh.UsedRange.Value  
以下不變

TOP

啊,剛剛沒注意,這裡兩個 i 在循環中重疊了
改掉其中一個:
For s = 2 To 7 '從2nd的工作表執行至7st
   Sheets(s).Activate

TOP

Sh.UsedRange = Sh.UsedRange.Value
改為
Sh.[aa:al] = Sh.[aa:al].Value

TOP

  1. Workbooks("2012 samples Chart.xlsx").Activate
  2.    For s = 2 To 7 '從2nd的工作表執行至7st
  3.    Sheets(s).Activate
  4.    Set sh = ActiveSheet
  5.    n = sh.UsedRange.Rows.Count
  6.             sh.[aa5].Resize(n, 12) = sh.[aa5].Resize(n, 12).Value    '把公式結果變成值
  7.             sh.AutoFilterMode = False     '取消自動篩選
  8.             sh.[a4:ad4].AutoFilter    '建立自動篩
複製代碼
那改這樣吧,我沒用2010很難想像一百多萬列跑起來是什麼速度。

TOP

        靜思自在 : 欣賞別人就是莊嚴自己。
返回列表 上一主題