Vba循环遍历所有打开的工作簿,并将这些工作簿名称与某些值进行比较,然后执行一些操作

Vba循环遍历所有打开的工作簿,并将这些工作簿名称与某些值进行比较,然后执行一些操作,vba,excel,Vba,Excel,代码给了我一个错误,行“**此处有错误 我打开了几个名为动态的工作簿,每个工作簿都有一个名为“CC”的工作表。我想将D列的值与所有打开工作簿中“CC”工作表中的该工作簿名称进行比较,如果该工作簿名称不等于工作表CC的D列值,则从工作表CC中删除这些行 Sub filter() Dim wbs As Workbooks Dim wb As Workbook Set wbs = Application.Workbooks For Each wb In wbs

代码给了我一个错误,行
“**此处有错误

我打开了几个名为动态的工作簿,每个工作簿都有一个名为“CC”的工作表。我想将D列的值与所有打开工作簿中“CC”工作表中的该工作簿名称进行比较,如果该工作簿名称不等于工作表CC的D列值,则从工作表CC中删除这些行

Sub filter()
    Dim wbs As Workbooks
    Dim wb As Workbook
    Set wbs = Application.Workbooks

    For Each wb In wbs
    For j = lastRowy(Worksheets("CC")) To 1 Step -1
        If wb.Name <> wb.Worksheets("CC").Cells(j, "D").Value Then '**ERROR HERE
            Rows(j).Delete
        End If
        Next j
    Next wb         
End Sub

Function lastRowy(sh As Worksheet)
    On Error Resume Next
    lastRowy = sh.Cells.Find(what:="*", _
        After:=sh.Range("A1"), _
        LookAt:=xlPart, _
        LookIn:=xlValues, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False).Row
    On Error GoTo 0
End Function
子过滤器()
将wbs设置为工作簿
将wb设置为工作簿
设置wbs=Application.workbook
对于wbs中的每个wb
对于j=lastRowy(工作表(“CC”))至1步骤-1
如果wb.Name wb.Worksheets(“CC”).Cells(j,“D”).Value,则此处“**错误
第(j)行。删除
如果结束
下一个j
下一个wb
端接头
函数lastRowy(sh作为工作表)
出错时继续下一步
lastRowy=sh.Cells.Find(what:=“*”_
之后:=sh.Range(“A1”)_
看:=xlPart_
LookIn:=xlValues_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
错误转到0
端函数

试试这个。我已经确定了你的推荐信是完全合格的,还有一些附加的逻辑,详情请参见评论

Sub filter()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim lastRow As Long

    For Each wb In Application.Workbooks
        Set ws = wb.Worksheets("CC")
        If Not ws Is Nothing Then 'check that worksheet exists
            lastRow = lastRowy(ws)
            If lastRow > 1 Then 'check that sheet has more than just headers
                For j = lastRow To 2 Step -1
                    If wb.Name <> ws.Cells(j, "D").Value Then
                        ws.Rows(j).Delete
                    End If
                Next j
            End If
        End If
    Next wb
End Sub

Function lastRowy(sh As Worksheet) As Long
    Dim rng As Range
    Set rng = sh.Cells.Find(what:="*", _
                            After:=sh.Range("A1"), _
                            LookAt:=xlPart, _
                            LookIn:=xlValues, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False)
    If rng Is Nothing Then Exit Sub 'if Find didn't find anything then it would have returned rng = Nothing
    lastRowy = rng.Row
End Function
子过滤器()
将wb设置为工作簿
将ws设置为工作表
最后一排一样长
对于应用程序中的每个wb。工作簿
设置ws=wb.工作表(“CC”)
如果不是ws Is Nothing,则“检查工作表是否存在”
lastRow=lastRowy(ws)
如果lastRow>1,则“检查工作表是否有多个标题”
对于j=lastRow至2步骤-1
如果wb.Name ws.Cells(j,“D”).Value那么
ws.Rows(j).删除
如果结束
下一个j
如果结束
如果结束
下一个wb
端接头
函数lastRowy(sh作为工作表)尽可能长
变暗rng As范围
设置rng=sh.Cells.Find(what:=“*”_
之后:=sh.Range(“A1”)_
看:=xlPart_
LookIn:=xlValues_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
匹配案例:=假)
如果rng为Nothing,则退出Sub‘如果Find未找到任何内容,则它将返回rng=Nothing
lastRowy=rng.Row
端函数

您收到的错误消息是什么?此外,您还没有限定此处的工作表引用:
lastRowy(工作表(“CC”)
。将其更改为
lastRowy(wb.Worksheets(“CC”))
我已经这样做了,但它给我的运行时错误9下标超出了范围,因此您可能打开了一个工作簿,其中没有“CC”工作表?谢谢,现在错误已被删除,但代码没有给出任何输出。输出应该是从CC工作表中删除所有工作簿的所有行,其中D列与各自的文件名具有不同的值谢谢,还有一件事不想删除标题行意味着第1行,那么我如何从中排除第1行呢comparison@yashikavaish更新。只需要编辑
If lastRow…
For j=lastRow…
行以排除第1行