Excel: como pesquisar várias pastas de trabalho para informações da célula

0

Boa Tarde

Atualmente, recebemos formulários eletrônicos preenchidos com o Excel de nossos clientes. Por isso, tenho uma pasta cheia de pastas de trabalho.

Cada pasta de trabalho tem várias planilhas.

Eu preciso pesquisar em cada uma das pastas de trabalho para ver se o intervalo "J8: Y8 na Planilha3" e "G8: AC8 na Planilha 4" foi preenchido, já que eles precisam ser examinados mais detalhadamente, mas apenas alguns terão essas planilhas concluído.

também cada pasta de trabalho recebeu um nome completamente diferente.

Encontrei este código (abaixo) on-line que, em princípio, faz o que eu preciso, no entanto, ele pesquisa cada folha da pasta de trabalho por um "Valor" específico

Qualquer ajuda seria muito apreciada.

Obrigado

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 lRow As Long
Dim rFound As Range
Dim strFirstAddress As String


On Error GoTo ErrHandler
Application.ScreenUpdating = False


'Change as desired
strPath = "c:\MyFolder"
strSearch = "Specific text"

Set wOut = Worksheets.Add
lRow = 1
With wOut
    .Cells(lRow, 1) = "Workbook"
    .Cells(lRow, 2) = "Worksheet"
    .Cells(lRow, 3) = "Cell"
    .Cells(lRow, 4) = "Text in Cell"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fld = fso.GetFolder(strPath)

    strFile = Dir(strPath & "\*.xls*")
    Do While strFile <> ""
        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
                     lRow = lRow + 1
                    .Cells(lRow, 1) = wbk.Name
                    .Cells(lRow, 2) = wks.Name
                    .Cells(lRow, 3) = rFound.Address
                    .Cells(lRow, 4) = rFound.Value
Else
Exit Do

                End If
                Set rFound = wks.Cells.FindNext(After:=rFound)
            Loop While strFirstAddress <> rFound.Address
        Next

            wbk.Close (False)
            strFile = Dir
        Loop
        .Columns("A:D").EntireColumn.AutoFit
    End With
    MsgBox "Done"

ExitHandler:
    Set wOut = Nothing
    Set wks = Nothing
    Set wbk = Nothing
    Set fld = Nothing
    Set fso = Nothing
    Application.ScreenUpdating = True
    Exit Sub

ErrHandler:
    MsgBox Err.Description, vbExclamation
    Resume ExitHandler
End Sub
    
por Christopher Olly Oliver 11.03.2015 / 15:49

1 resposta

1

Este código funcionará da seguinte maneira:

  1. Abra uma nova pasta de trabalho onde você quiser.
  2. Cole o código do VBA na macro
  3. Na célula A1 da Folha 1, coloque o caminho para a pasta de pastas de trabalho, por exemplo: C:\users\yourname\folder\

  4. Na célula A2, o primeiro intervalo, por exemplo: J8:Y8 e na célula B2, o nome da planilha: Sheet3

  5. Na célula A3, o segundo intervalo, por exemplo: G8:AC8 e na célula B3, o nome da planilha: Sheet4

O melhor deste código é que, se você tiver mais intervalos / planilhas para pesquisar, poderá adicionar as próximas linhas.

Será parecido com isto:

Agora,executeamacroe,apóssuaexecução,elemostraráosresultadosemFolha2,mostrandoonomedoarquivoeonúmerodecélulasvaziasemcadaintervalo.

Subfoldersearch()DimwbkAsWorkbookDimwbk1AsWorkbookDimwksAsWorksheetDimwks2AsWorksheetDimtotaltimeAsLongDimdtDurationAsDateSetwbk=ThisWorkbookSetwks=wbk.Sheets(1)Setwks2=wbk.Sheets(2)starttime=Now()wks2.Cells.ClearContentsdirPath=wks.Cells(1,1)file=Dir(dirPath)rowscounter=0Application.ScreenUpdating=FalseWhile(file<>"")
        If InStr(file, "xls") > 0 Then
            rowscounter = rowscounter + 1
            totalpath = dirPath & file
            Set wbk1 = Workbooks.Open(totalpath, , True)
            rangelist = True
            i = 2
            columnscounter = 2
            While rangelist = True
                thenewrango = wks.Cells(i, 1)
                thenewsheet = wks.Cells(i, 2)
                emptycount = workbooksearch(wbk1, thenewsheet, thenewrango)
                wks2.Cells(rowscounter, 1) = file
                wks2.Cells(rowscounter, columnscounter) = emptycount
                i = i + 1
                columnscounter = columnscounter + 1
                If wks.Cells(i, 1) = "" Then
                    rangelist = False
                End If
            Wend
            wbk1.Close (False)
        End If
        file = Dir
    Wend
    Application.ScreenUpdating = True
    endtime = Now()
    totaltime = DateDiff("s", starttime, endtime)
    a = MsgBox("Finished in" & vbCrLf & totaltime & " seconds", vbOKOnly)
End Sub
Function workbooksearch(wbk1 As Workbook, wksname As Variant, rango As Variant)
    Dim wks1 As Worksheet
    Dim obj As Object
    On Error GoTo HandleError
    Set obj = wbk1.Sheets(wksname)
    Set wks1 = wbk1.Worksheets(wksname)
    emptycount = 0
    For Each c In wks1.Range(rango)
        If c.Value = "" Then
            emptycount = emptycount + 1
        End If
    Next c
    workbooksearch = emptycount
    Exit Function
HandleError:
    workbooksearch = "N/A"
End Function
    
por 17.03.2015 / 12:42