从特定工作表索引开始遍历多个工作表

时间:2019-08-11 19:44:29

标签: excel vba

我试图从第4个选项卡开始循环浏览工作簿中的所有工作表。这就是我所拥有的,但是由于某种原因,它仅在第4个选项卡上有效,其余部分不再继续。有什么想法吗?

Sub Step13()

Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
  If sheet.Index > 3 Then

'my code here 
Columns("A").Replace "^", vbNullString, xlPart, xlByRows, True
Range("AA1").Value = "Function"
Dim LastRowColumnA As Long
LastRowColumnA = Cells(Rows.Count, 1).End(xlUp).Row
Range("AA2:AA" & LastRowColumnA).FormulaR1C1 = "=ISNUMBER(MATCH(RC[-26],EarningsDates!C[-26],0))"
Columns(27).Value = Columns(27).Value

  End If
Next

End Sub

3 个答案:

答案 0 :(得分:0)

下面是更正的代码。完美运行。

Sub Step13()

Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
  If sheet.Index > 3 Then

sheet.Activate

'my code here 
ActiveSheet.Columns("A").Replace "^", vbNullString, xlPart, xlByRows, True
ActiveSheet.Range("AA1").Value = "Function"
Dim LastRowColumnA As Long
LastRowColumnA = Cells(Rows.Count, 1).End(xlUp).Row
ActiveSheet.Range("AA2:AA" & LastRowColumnA).FormulaR1C1 = "=ISNUMBER(MATCH(RC[-26],EarningsDates!C[-26],0))"
ActiveSheet.Columns(27).Value = Columns(27).Value

  End If
Next

End Sub

答案 1 :(得分:0)

我认为您会发现以下代码可增强例程的性能,其原因有两个:

  1. 它直接与所需对象一起使用。 (并且不会每次都激活每个工作表,这是不必要的

  2. 它仅特别适用于具有数据的单元格(而不是整个列,大多数行都是不必要的。

代码:

Option Explicit

Sub Step13()

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets

        If ws.Index > 3 Then

            With ws

                Dim LastRowColumnA As Long
                LastRowColumnA = .Cells(.Rows.Count, 1).End(xlUp).Row

                'my code here
                .Range("A1:A" & LastRowColumnA).Replace "^", vbNullString, xlPart, xlByRows, True

                .Range("AA1").Value = "Function"
                With .Range("AA2:AA" & LastRowColumnA)
                    .FormulaR1C1 = "=ISNUMBER(MATCH(RC[-26],EarningsDates!C[-26],0))"
                    .Value = .Value
                End With

            End With

        End If

    Next

End Sub

答案 2 :(得分:0)

出现问题的原因是您没有完全限定范围,并且代码仅在活动工作表上有效。问题的答案是完全限定对某个范围的引用,以确保代码正确理解您所指的是哪个单元格,范围,工作表或工作簿。

下面是Gilty纠正的代码,以消除不良的编程习惯。未经测试。

Option Explicit ' <-- always include this at the top of modules.

' Proper indenting helps make code readable and maintainable.
Sub Step13()
    Dim sheet As Worksheet
    For Each sheet In ActiveWorkbook.Worksheets
        If sheet.Index > 3 Then
        ' Do not use .Select or .Activate unless you want the user to see something.
        ' Fully qualify all ranges.
            sheet.Columns("A").Replace "^", vbNullString, xlPart, xlByRows, True
            sheet.Range("AA1").Value = "Function"
            Dim LastRowColumnA As Long
            LastRowColumnA = sheet.Cells(sheet.Rows.Count, 1).End(xlUp).Row '<-- Fully qualify ALL references to ranges.
            sheet.Range("AA2:AA" & LastRowColumnA).FormulaR1C1 = "=ISNUMBER(MATCH(RC[-26],EarningsDates!C[-26],0))"
            sheet.Columns(27).Value = sheet.Columns(27).Value '<-- Fully qualify ALL references to ranges.
        End If
    Next
End Sub

现在使用With可以使它更整洁。

Option Explicit

Sub Step13()
    Dim sheet As Worksheet
    For Each sheet In ActiveWorkbook.Worksheets
        With sheet
            If .Index > 3 Then
                .Columns("A").Replace "^", vbNullString, xlPart, xlByRows, True
                .Range("AA1").Value = "Function"
                Dim LastRowColumnA As Long
                LastRowColumnA = .Cells(.Rows.Count, 1).End(xlUp).Row 
                .Range("AA2:AA" & LastRowColumnA).FormulaR1C1 = "=ISNUMBER(MATCH(RC[-26],EarningsDates!C[-26],0))"
                .Columns(27).Value = .Columns(27).Value 
            End If
        End With
    Next
End Sub