Vba 循环在目录之间不工作

Vba 循环在目录之间不工作,vba,excel,Vba,Excel,我使用vba代码搜索工作簿列中的单元格列表,需要在文件夹中搜索这些单元格,如果任何工作簿中的单元格匹配,则需要将所有相应的数据复制到主工作簿 我使用了两个循环,但如果一个循环在使用另一个循环,则另一个循环无效。例如,如果我循环浏览文件夹中的所有文件,则无法循环使用主工作簿中的列来逐个搜索单元格 代码如下: Sub SearchFolders() Dim fso As Object Dim fld As Object Dim strSearch As String

我使用vba代码搜索工作簿列中的单元格列表,需要在文件夹中搜索这些单元格,如果任何工作簿中的单元格匹配,则需要将所有相应的数据复制到主工作簿

我使用了两个循环,但如果一个循环在使用另一个循环,则另一个循环无效。例如,如果我循环浏览文件夹中的所有文件,则无法循环使用主工作簿中的列来逐个搜索单元格

代码如下:

Sub SearchFolders()
    Dim fso As Object
    Dim fld As Object
    Dim strSearch As String
    Dim strPath As String
    Dim strFile As String
    Dim wOut As Worksheet
    Dim wbk As Workbook
    Dim wks As Worksheet
    Dim rFound As Range
    Dim irow As Integer
    Dim rng As Range
    Dim strFirstAddress As String

    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    strPath = "\dfs\Home\Tes"

    Set wOut = ThisWorkbook.Worksheets("Data")

    With wOut
    lRow = 2
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set fld = fso.GetFolder(strPath)

        strFile = Dir(strPath & "\*.xls*")

        Do While Cells(lRow, 1) < Empty
            strSearch = Cells(lRow, 1)
            Set wbk = Workbooks.Open _
                (Filename:=strPath & "\" & strFile, _
                UpdateLinks:=0, _
                ReadOnly:=True, _
                AddToMRU:=False)

            For Each wks In wbk.Worksheets
                Set rFound = wks.UsedRange.Find(strSearch)
                If Not rFound Is Nothing Then
                    strFirstAddress = rFound.Address
                End If
                Do
                    If rFound Is Nothing Then
                        Exit Do
                     Else
                        Cells(lRow, 2) = rFound.Offset(0, 1).Value
                        Cells(lRow, 3) = rFound.Offset(0, 2).Value
                    End If
                    Set rFound = wks.Cells.FindNext(After:=rFound)
                Loop While strFirstAddress < rFound.Address
            Next

            wbk.Close (False)
            lRow = lRow + 1
        Loop
    End With
    MsgBox "Done"
End Sub
子搜索文件夹()
作为对象的Dim fso
作为对象的Dim fld
作为字符串的Dim stresearch
将strPath设置为字符串
作为字符串的Dim strFile
Dim wOut作为工作表
将wbk设置为工作簿
将工作作为工作表
暗光范围
Dim irow作为整数
变暗rng As范围
Dim strFirstAddress作为字符串
关于错误转到错误处理程序
Application.ScreenUpdating=False
strPath=“\dfs\Home\Tes”
Set wOut=此工作簿。工作表(“数据”)
用wOut
lRow=2
设置fso=CreateObject(“Scripting.FileSystemObject”)
Set fld=fso.GetFolder(strPath)
strFile=Dir(strPath&“\*.xls*”)
当单元格(lRow,1)为空时执行此操作
strSearch=单元格(lRow,1)
设置wbk=工作簿。打开_
(文件名:=strPath&“\”&strFile_
UpdateLink:=0_
只读:=真_
AddToMRU:=假)
对于wbk工作表中的每项工作
Set rFound=wks.UsedRange.Find(strSearch)
如果没有找到,那就什么都不是了
strFirstAddress=rFound.Address
如果结束
做
如果rFound不算什么,那么
退出Do
其他的
单元格(lRow,2)=rFound.Offset(0,1).Value
单元格(lRow,3)=rFound.Offset(0,2).Value
如果结束
设置rFound=wks.Cells.FindNext(之后:=rFound)
在strFirstAddress
我认为您必须将do while更改为

  Do While .Cells(lRow, 1) <> Empty
Do While.Cells(lRow,1)为空
说明:如果使用
单元格(lRow,1)
(不带点),则可以访问活动工作表。但是,在您执行
工作簿.open
的那一刻,活动工作表将发生变化,因此在下一次迭代中,您不再查看工作表
而查看已打开的工作簿的工作表


如果您编写
.Cells(lRow,1)
(带前导点),
Cells
将被视为在
with
-子句中使用的任何内容的属性,在您的情况下,
with wOut
。或者,您可以编写
wOut.Cells(lRow,1)
(这只是一个口味问题)

我认为您必须将do while更改为

  Do While .Cells(lRow, 1) <> Empty
Do While.Cells(lRow,1)为空
说明:如果使用
单元格(lRow,1)
(不带点),则可以访问活动工作表。但是,在您执行
工作簿.open
的那一刻,活动工作表将发生变化,因此在下一次迭代中,您不再查看工作表
而查看已打开的工作簿的工作表


如果您编写
.Cells(lRow,1)
(带前导点),
Cells
将被视为在
with
-子句中使用的任何内容的属性,在您的情况下,
with wOut
。或者,您可以编写
wOut.Cells(lRow,1)
(这只是味道问题)

实际上,此代码不会与文件夹中的所有文件循环。它只访问第一个文件。我想让它一个接一个地循环文件夹中的所有文件。我只需要代码来搜索该文件夹中的所有文件以查找匹配的数据!我无法使用这方面的代码。若要使用FileSystemObject循环查看文件列表,请参阅。或者您可以使用VBA
dir
命令,因为我是VBA新手,我想知道如何将代码放入代码中以正确处理循环。我将拆分代码:一个子循环文件,并在循环中调用另一个子循环(使用文件名或已打开的工作簿作为参数)处理一个文件的工作。实际上,此代码不会循环处理文件夹中的所有文件。它只访问第一个文件。我想让它一个接一个地循环文件夹中的所有文件。我只需要代码来搜索该文件夹中的所有文件以查找匹配的数据!我无法使用这方面的代码。若要使用FileSystemObject循环查看文件列表,请参阅。或者您可以使用VBA
dir
命令,因为我是VBA新手,我想知道如何将代码放入代码中以正确处理循环。我将拆分代码:一个子循环文件,并在循环中调用另一个子循环(使用文件名或已打开的工作簿作为参数),以处理一个文件的工作。