0

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

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... 等等 还是我应该做一些完全不同的事情?

4

2 回答 2

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语句、不需要的操作(例如来回粘贴值)等。

于 2012-10-11T18:15:04.257 回答
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
于 2012-10-11T18:16:02.863 回答