【问题标题】:Loop simple function through all worksheets在所有工作表中循环简单函数
【发布时间】:2012-10-02 11:42:06
【问题描述】:

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

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

【问题讨论】:

  • 是的,ws.Range... 就是您所需要的。始终使用工作表限定 Range 是一种很好的做法,在这种情况下,它是必需的。您还需要编辑代码以删除 Select,因为如果父工作表未处于活动状态,您将无法选择范围。

标签: loops excel excel-2007 vba


【解决方案1】:

你已经很接近了

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

【讨论】:

    【解决方案2】:

    你需要像这样组合它们:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2014-09-15
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多