对于每个/下一个循环不遍历所有工作表

我创build了以下代码。 macros应该简单地将单元格A2:G3000乘以1,以便格式从文本更改为数字。 我写的macros是这样做的,但仅用于活动工作表。我使用For Each / Next循环,因为我学到了它。

有人能帮我在代码中find我的错误吗?

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 

尝试下面的代码,正如@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 

一般来说,代码不好,因为它使用了太多的select等。在这里阅读如何避免使用在Excel VBAmacros中select 。 但是,如果你想使它成为一个运行的,只需在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