2017-04-13 81 views
2

我已經創建了下面的代碼。宏應該簡單地將單元格A2:G3000乘以1,以便格式從文本更改爲數字。我寫的宏是這樣做的,但僅用於活動工作表。我使用For Each/Next循環,因爲我學到了它。For Each/Next Loop不遍歷所有工作表

有人能幫我在代碼中找到我的錯誤嗎?

Sub Format_Change() 

Dim sht As Worksheet 

For Each sht In Worksheets 
    Range("M2").Select 
    ActiveCell.FormulaR1C1 = "=RC[-12]*1" 
    Range("M2").Select 
    Selection.AutoFill Destination:=Range("M2:W2"), Type:=xlFillDefault 
    Range("M2:W2").Select 
    Selection.AutoFill Destination:=Range("M2:W3000"), Type:=xlFillDefault 
    Range("M2:W3000").Select 
    Selection.Copy 
    Range("A2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
    Range("M2").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Application.CutCopyMode = False 
    Selection.ClearContents 
Next sht 

End Sub 

回答

5

嘗試下面的代碼,如@Vityata指出,有真的沒有必要使用這麼多SelectSelection,它減緩代碼下降了不少。

嘗試代碼版本如下:

Option Explicit 

Sub Format_Change() 

Dim sht As Worksheet 

For Each sht In Worksheets 
    With sht 
     .Range("M2").FormulaR1C1 = "=RC[-12]*1" 
     .Range("M2").AutoFill Destination:=.Range("M2:W2"), Type:=xlFillDefault 
     .Range("M2:W2").AutoFill Destination:=.Range("M2:W3000"), Type:=xlFillDefault 
     .Range("M2:W3000").Copy 
     .Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 
     Application.CutCopyMode = False 
     .Range(.Range("M2"), .Range("M2").CurrentRegion).ClearContents 
    End With 
Next sht 

End Sub 
+1

+1,但如果OP希望實際看到頁面正在改變並且正在完成工作,該怎麼辦?它給了一個不錯的感覺,以某種方式有一個Excel文件「工作」...沒有'選擇'你看不到'行動':) – Vityata

+0

@Vityata這是一個很好的;) –

+2

@Vityata是的,你坐在前面你的前裝洗衣機和微波爐只是看着他們完成? –

2

一般的代碼是不好的,因爲它使用太多的選擇等。讀到這裏How to avoid using Select in Excel VBA macros。但是,如果要使其成爲運行循環,只需在for-each循環後添加sht.Select即可。

Option Explicit 


Sub Format_Change() 

    Dim sht As Worksheet 

    For Each sht In Worksheets 
     sht.Select 
     Range("M2").Select 
     ActiveCell.FormulaR1C1 = "=RC[-12]*1" 
     Range("M2").Select 
     Selection.AutoFill Destination:=Range("M2:W2"), Type:=xlFillDefault 
     Range("M2:W2").Select 
     Selection.AutoFill Destination:=Range("M2:W3000"), Type:=xlFillDefault 
     Range("M2:W3000").Select 
     Selection.Copy 
     Range("A2").Select 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 
     Range("M2").Select 
     Range(Selection, Selection.End(xlDown)).Select 
     Range(Selection, Selection.End(xlToRight)).Select 
     Application.CutCopyMode = False 
     Selection.ClearContents 
    Next sht 
End Sub 
+3

不,不,不,別這樣,你比這更好的;) –

+1

@ShaiRado - 不是今天+它的作品! – Vityata

+1

好的,+1,但是我的強迫症不讓我不給一個答案,而不使用'選擇',希望你原諒我; –