返回列表 上一主題 發帖

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

  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

本帖最後由 GBKEE 於 2012-5-6 17:36 編輯

回復 15# PJChen
If InStr("MayJunJulAugSepOctNovDec", sh.May) Then  sh 沒這 屬性
  1. Workbooks("2012 samples Chart.xlsx").Activate
  2.     For xi = Month(Date) To Sheets.Count                              'Month(Date) 當月份
  3.         Sheets(Format(DateSerial(2001, xi, 1), "Mmm")).Activate    '當月份工作表
  4.     Next
複製代碼

TOP

回復 13# oobird
oobird:
程式執行至    If InStr("MayJunJulAugSepOctNovDec", sh.May) Then '從"May"開始作業一直到最後一個工作表
出現問題就執行不下去了,所以沒有執行完,請幫忙看看有什麼問題?
  1.    Workbooks("2012 samples Chart.xlsx").Activate
  2.     For Each sh In Sheets '在所有工作表中循環
  3.     If InStr("MayJunJulAugSepOctNovDec", sh.May) Then '從"May"開始作業一直到最後一個工作表
  4.     sh.Activate    '執行程式
  5.     End If
  6.     'Next
  7.    
  8.         sh.UsedRange = sh.UsedRange.Value '把公式結果變成值
  9.         'sh.[a4:ad4].AutoFilter '取消自動篩選
  10.         'sh.[a4:ad4].AutoFilter '建立自動篩
  11.         sh.AutoFilterMode = False '取消自動篩選
  12.         sh.[a4:ad4].AutoFilter '建立自動篩
  13.         
  14.         n = sh.[AC1000].End(3).Row 'ac欄最後儲存格列號
  15.         sh.Sort.SortFields.Clear '清除重建排序條件
  16.         ar = Array("ac", "u", "q", "c", "d")
  17.         For i = 0 To UBound(ar)
  18.             sh.Sort.SortFields.Add Key:=sh.Range(ar(i) & "5:" & ar(i) & n)
  19.         Next
  20.         With sh.Sort '對指定範圍以指定條件排序
  21.             .SetRange sh.Range("A5:AD" & n)
  22.             .Header = xlNo
  23.             .MatchCase = False
  24.             .Orientation = xlTopToBottom
  25.             .SortMethod = xlPinYin
  26.             .Apply
  27.         End With
  28.     Next '下一個工作表
  29.     End Sub
複製代碼

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

回復 9# oobird
超級版主您好,

我的巨集程式與須執行巨集的工作表分開,所以我在For 的前一行加了   Workbooks("2012 samples Chart.xlsx").Activate這樣執行就ok了,
以下問題想請教您:
1) 我每年的工作表是依月份為sheet名稱,現在是5月,若我想讓1~4月不要執行前面的巨集程式,是否可以將程式稍加修改為:
指定Sheet "May"之後的工作表再執行前述的巨集?我應該怎麼改?可否寫出完整的程式?(這個寫法請用指定的sheet名稱,不能用程式去判別現在的月份,因為我們的工作表要等結帳完畢,才不會用到上述的巨集)
2)         n = sh.[AC1000].End(3).Row 'ac欄最後儲存格列號...End後面的(3)代表什麼?

TOP

回復 10# GBKEE

你的建議很不錯,謝謝.

TOP

回復 2# oobird
  1. SH.[a4:ad4].AutoFilter '取消自動篩選
  2. SH.[a4:ad4].AutoFilter '建立自動篩
複製代碼
這是後輩我的見解 ,如有錯誤請見諒.
程式開始執行初時         [a4:ad4] 是在自動篩選的狀態下,第一次的AutoFilter  才會是  取消自動篩選
但如   [a4:ad4] 不是在自動篩選的狀態下,第二次的AutoFilter 會是   取消自動篩選
  1. SH.AutoFilterMode = False '取消自動篩選  
  2.         SH.[a4:ad4].AutoFilter '建立自動篩
  3.         
複製代碼
程式執行時   不管[a4:ad4] 是否在自動篩選的狀態下, AutoFilterMode = False  都會取消自動篩選
1

評分人數

    • oobird: 細心+熱心!可敬的精神金錢 + 2

TOP

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

TOP

回復 6# oobird
補充:這是我天馬行空的想法,若是有悖於正常程式的寫法,請勿見怪!
另外....真的寫得成的話,也請給我完整的程式,因為..你知道的,我不會拼湊太複雜的程式.
感謝您!

TOP

回復 6# oobird
Hi,
目前我附上的檔案有 Apr, May, Jun, Jul, Aug, Sep, Oct 等Sheets(以後都還會增加)
    Ar1 = Array(Apr, May, Jun, Jul, Aug, Sep, Oct)    '置入陣列 (或許也能這樣寫...Apr之後的Sheets都作相同動作)
    Ar2 = Array(動作1: AA4:AL有資料的最後一列,COPY後原範圍貼上值    動作2: A4:AD4 取消自動篩選,再恢愎自動篩選   動作3: 排序順序為AC,U,Q,C,D)                '置入陣列
能不能用上述的類似作法? 不好意思,我無法將敍述轉成程式,不過我想以上的構思應該是能夠實現的,只有動作1: AA4:AL有資料的最後一列,COPY後原範圍貼上值,可能比較有問題,不知能否用程式去達成?
因為AD:AE是完全空白欄,而AC的最後一列資料與AF的表格又有3行以上的完全空白列.

TOP

        靜思自在 : 能付出愛心就是福,能消除煩惱就是慧。
返回列表 上一主題