通过所有工作表循环简单功能

时间:2012-10-11 18:04:44

标签: excel loops excel-vba excel-2007 vba

我正在尝试创建一个宏,它在工作簿中的每个工作表上执行以下操作。

Range("U10").Select
    FormulaR1C1 = "=R3C2"
    Range("U10").Select
    Selection.AutoFill Destination:=Range("U10:U19"), Type:=xlFillDefault
    Range("U10:U19").Select
    Selection.Copy
    Range("V10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("V10:V19").Select
        Selection.Copy
    Range("U10").Select
    ActiveSheet.Paste
    Range("V9:V19").Select
    Selection.ClearContents
    Range("A16").Select
    Selection.ClearContents

我试过了:

Sub parse()

    Dim ws As Worksheet
            For Each ws In ThisWorkbook.Worksheets

   'The above code

        Next ws

End Sub

不幸的是,这似乎只是将此宏应用于当前活动工作表。

我有一种感觉,这与我没有正确引用范围有关(我是VBA的新手所以任何解释都可以帮助我找到解决方案!)。 IE浏览器。它应该像ws.Range ......等或者我应该做一些完全不同的事情吗?

2 个答案:

答案 0 :(得分:6)

你非常接近

Sub parse()

Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets

        ws.Range("U10:U19").FormulaR1C1 = "=R3C2"
        ws.Range("U10:U19").Value=ws.Range("U10:U19").value
        ws.Range("A16").ClearContents

    Next ws

End Sub

Tim和Gimp表示,压缩代码的次数越多,维护的效率越高,越容易。这包括避免.Select语句,不需要的操作(比如你来回粘贴值)等等。

答案 1 :(得分:0)

你需要像这样组合它们:

Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        With ws
            .Range("U10").Select
            FormulaR1C1 = "=R3C2"
            .Range("U10").Select
            Selection.AutoFill Destination:=.Range("U10:U19"), Type:=xlFillDefault
            .Range("U10:U19").Select
            Selection.Copy
            .Range("V10").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            .Range("V10:V19").Select
            Selection.Copy
            .Range("U10").Select
            ActiveSheet.Paste
            .Range("V9:V19").Select
            Selection.ClearContents
            .Range("A16").Select
            Selection.ClearContents
        End With
    Next ws

原因是你需要在每个范围引用前加上应该使用的范围的工作表。你可以使用ws.Range().select each time来完成这项工作,或者像我上面那样将它们全部封锁..

话虽如此,你也可以在yoru代码中删除很多不必要的行,它看起来像这样......

Sub parse()

Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        With ws
            .Range("U10").FormulaR1C1 = "=R3C2"
            .Range("U10").AutoFill Destination:=.Range("U10:U19"), Type:=xlFillDefault
            .Range("U10:U19").Copy
            .Range("V10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            .Range("V10:V19").Copy
            .Range("U10").Paste
            .Range("V9:V19").ClearContents
            .Range("A16").ClearContents
        End With
    Next ws
End Sub