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行