循环不在目录之间工作

时间:2017-09-20 14:21:56

标签: excel vba excel-vba

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

我正在使用2个循环,但是如果一个正在工作另一个循环,例如,如果我循环遍历文件夹中的所有文件,我不能循环使用主工作簿中的列来逐个搜索一个单元格。

以下是代码:

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

1 个答案:

答案 0 :(得分:0)

我认为你必须改变做到

  Do While .Cells(lRow, 1) <> Empty

说明:如果使用Cells(lRow, 1)(不带点),则可以访问活动工作表。但是,当您执行workbook.open时,活动工作表将会更改,因此在下一次迭代中,您不再查看工作表wOut,而是查看已打开的工作簿的工作表。

如果你写.Cells(lRow, 1)(带有前导点),Cells被视为with - 条款中使用的任何属性,在你的情况下With wOut 。或者,你可以写wOut.Cells(lRow, 1)(这只是一个品味问题)