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

use*_*353 2 excel vba excel-vba

我创建了以下代码.宏应该简单地将单元格A2:G3000乘以1,以便格式从文本变为数字.我写的宏是这样做的,但仅适用于活动工作表.我在学习它时使用了For Each/Next循环.

有人可以帮我在代码中找到错误吗?

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
Run Code Online (Sandbox Code Playgroud)

Sha*_*ado 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
Run Code Online (Sandbox Code Playgroud)

  • @Vityata是的,你坐在你的前装式洗衣机和微波炉前看着他们完成? (2认同)