String 循环浏览工作簿,但排除某些工作表?

String 循环浏览工作簿,但排除某些工作表?,string,vba,excel,String,Vba,Excel,这个问题已经在网上被问了好几次,但在宏观层面上还没有一个全面的计划。我在一些表上有数据,但我需要在一些单独的“分析表”上更具体地分析这些数据。我认为问题可能与此工作簿.Sheets(“sh”)功能有关,因为它发出下标超出范围的错误 下面是代码,请响应为使此代码正常工作而进行的任何更改 Sub Excludesheet() Dim sh As Worksheet Const excludeSheets As String = "1-Analysis,2-Analysis"

这个问题已经在网上被问了好几次,但在宏观层面上还没有一个全面的计划。我在一些表上有数据,但我需要在一些单独的“分析表”上更具体地分析这些数据。我认为问题可能与
此工作簿.Sheets(“sh”)
功能有关,因为它发出
下标超出范围的错误

下面是代码,请响应为使此代码正常工作而进行的任何更改

Sub Excludesheet()
    Dim sh As Worksheet
    Const excludeSheets As String = "1-Analysis,2-Analysis"
    'Assigns a Worksheet Object to the sh variable
    For Each sh In ThisWorkbook.Worksheets
        If IsError(Application.Match(sh.Name, Split(excludeSheets, ","))) Then
        'This is for analysis worksheets
        Range("$A$1").Value = "Analysis"
        Else:
            'Data Sheets
            Columns("A:M").AutoFit
            LR = Cells(Rows.Count, "A").End(xlUp).Row
            For i = LR To 2 Step -1
                If Cells(i, "E").Text = "N/A" Then Rows(i).EntireRow.Delete
            Next i

            LastR = Cells(Rows.Count, "A").End(xlUp).Row
            Dim strFormulas(1 To 3) As Variant

            With ThisWorkbook.Sheets("sh")
                strFormulas(1) = "=(E2-$E$2)"
                strFormulas(2) = "=(G2-$G$2)"
                strFormulas(3) = "=H2+I2"

                Range("H2:J2").Formula = strFormulas
                Range("H2:J" & LastR).FillDown
            End With
        End If
    Next
End Sub

为了进一步澄清我的评论,请直接处理您的对象。

现在尝试一下您的重构代码:

Sub Excludesheet()
    Dim sh As Worksheet
    'Const excludeSheets As String = "1-Analysis,2-Analysis"
    Dim excludeSheets: excludeSheets = Array("1-Analysis", "2-Analysis")
    For Each sh In ThisWorkbook.Worksheets
        With sh 'you already have the sheet object, so work with it
            If Not IsError(Application.Match(.Name, excludeSheets, 0)) Then
                'This is for analysis worksheets
                .Range("$A$1").Value = "Analysis"
            Else
                'Data Sheets
                .Columns("A:M").AutoFit
                LR = .Cells(.Rows.Count, "A").End(xlUp).Row

                For i = LR To 2 Step -1
                    If .Cells(i, "E").Text = "N/A" Then .Rows(i).EntireRow.Delete
                Next i

                LastR = .Cells(.Rows.Count, "A").End(xlUp).Row
                Dim strFormulas(1 To 3) As Variant

                strFormulas(1) = "=(E2-$E$2)"
                strFormulas(2) = "=(G2-$G$2)"
                strFormulas(3) = "=H2+I2"

                .Range("H2:J2").Formula = strFormulas
                .Range("H2:J" & LastR).FillDown
            End If
        End With
    Next
End Sub

我会用
和。。。以
块结束以定义所有单元格和范围引用的父级

Sub Excludesheet()
    Dim i As Long, lr As Long, sh As Worksheet
    Const excludeSheets As String = "1-Analysis,2-Analysis"
    For Each sh In ThisWorkbook.Worksheets  'Assigns a Worksheet Object to the sh variable
        With sh
            If CBool(InStr(1, excludeSheets, .Name, vbTextCompare)) Then
                'This is for analysis worksheets
                 .Range("$A$1").Value = "Analysis"
            Else
                'Data Sheets
                .Columns("A:M").AutoFit
                lr = .Cells(Rows.Count, "A").End(xlUp).Row
                For i = lr To 2 Step -1
                    If .Cells(i, "E").Text = "N/A" Then Rows(i).EntireRow.Delete
                Next i

                lr = .Cells(Rows.Count, "A").End(xlUp).Row
                Dim strFormulas(1 To 3) As Variant

                strFormulas(1) = "=(E2-$E$2)"
                strFormulas(2) = "=(G2-$G$2)"
                strFormulas(3) = "=H2+I2"

                .Range("H2:J2").Formula = strFormulas
                .Range("H2:J" & lr).FillDown
            End If
        End With
    Next sh

End Sub

我还重用了一些变量,因此不必声明新的变量,也不必更改确定工作表名称类别的方法。对我来说,你现有的方法似乎是倒退的(例如,如果当时没有找到),所以我颠倒了逻辑。如果我的假设是错误的,您可以使用
来反转我的逻辑,如果不是CBool(InStr(…

使用此工作簿.Sheets(“sh”)
to
使用sh
我也在考虑使用
InStr
,但决定放弃常量字符串。hahajeep和L42两个代码都跨多个工作表工作,并正确地将分析放入正确的工作表中,但宏的某些部分在以下工作表中被排除。删除“N/A”函数在第一张工作表上运行良好,但在下面的工作表上它没有执行。有什么办法吗?@ThomasRuddell-您需要返回并编辑原始问题,以包括哪些工作表被视为分析工作表,哪些工作表被视为数据工作表。只有完整的列表才能创建一个规则to确定它们。这一个有效,只需直接引用sh.range sh.cells sh.collumns中的一些对象,而不是@Comintern建议的直接引用单元格。