Condividi:        

cerca valore su più file e restituisce nome e riga (excel)

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

cerca valore su più file e restituisce nome e riga (excel)

Postdi abgate » 02/06/18 10:46

Buongiorno,
Per esigenze di lavoro, avrei bisogno di ricercare un determinato valore (solitamente un numero) su più file excel che aumentano ogni settimana e mi restituisce il nome del file excel in cui si trova il valore cercato e le celle accanto al valore cercato che sono 2 o 3. il valore che cerco è però sempre presente in tutti file excel, ma in alcuni ha un valore accanto, in altri ha celle vuote. Io vorrei che mi restituisse solo quelle con un valore accanto al valore cercato. Allego un file di esempio in cui foglio 1 e foglio 2 corrispondo a file excel diversi da dove cercare e "output" il file in cui avere i dati che cerco. Inoltre cercando in rete ho trovato un codice che però mi restituisce solo il nome del file (ovvero tutti).
Codice: Seleziona tutto
Option Explicit

Public Sub mRicerca(ByVal vRicerca As Variant, sPath As String)
   
    'dichiaro le variabili
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim wk As Workbook
    Dim sh As Worksheet
    Dim shMe As Worksheet
    Dim lUltRiga As Long
    Dim c As Range
   
    'impedisco lo sfarfallio del monitor
    With Application
        .ScreenUpdating = False
    End With
    'metto un riferimento al Foglio1
    'di questa cartella di Excel
    Set shMe = ThisWorkbook.Worksheets("Foglio1")
   
    'trovo l'ultima riga con dati
    'della colonna A, Foglio1,
    'di questa cartella di Excel
    With shMe
        lUltRiga = .Range( _
            "A" & .Rows.Count _
            ).End(xlUp).Row
    End With
   
    'creo duo oggetti
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(sPath)
   
    'ciclo i files della cartella
    For Each objFile In objFolder.Files
        'se sono files di Excel
        Select Case LCase(Right(objFile.Name, 4))
            Case ".xls", "xlsx", "xlsm"
            'li apro
            Set wk = Workbooks.Open(objFile.Path)
            'ciclo i fogli
            For Each sh In wk.Worksheets
                'ciclo le celle dei fogli
                For Each c In sh.UsedRange
                    'se il contenuto della cella
                    'corrisponde al valore cercato
                    If c.Value = vRicerca Then
                        'nuova riga in Foglio1 di questa
                        'cartella
                        lUltRiga = lUltRiga + 1
                        'recupero il nome del file
                        shMe.Range("A" & lUltRiga).Value = _
                            objFile.Name
                       
                     End If
                Next
                'chiudo il file
                wk.Close
                'Set a Nothing della variabile oggetto
                Set wk = Nothing
            Next
         End Select
    Next
   
    'ripristino l'update del monitor
    With Application
        .ScreenUpdating = True
    End With
   
    'Set a Nothing delle variabili oggetto
    Set c = Nothing
    Set wk = Nothing
    Set sh = Nothing
    Set shMe = Nothing
    Set objFile = Nothing
    Set objFolder = Nothing
    Set objFSO = Nothing

End Sub

'richiamo la routine mRicerca
Public Sub m()
    'cerco il valore 1 in tutti i fogli
    'dei files presenti nella cartella
    'C:\Cartella
    Call mRicerca(1, "C:\cartella")
End Sub


Grazie a tutti

https://we.tl/BwZ2WoNIhD
abgate
Newbie
 
Post: 7
Iscritto il: 21/04/18 14:25

Sponsor
 

Re: cerca valore su più file e restituisce nome e riga (exce

Postdi Marius44 » 02/06/18 16:11

Ciao
Fare ricerche su Fogli diversi o su File diversi non è la stessa cosa.
Comunque prova con questa piccola variazione al codice che hai postato. Eventualmente adattalo per farti riportare ciò che ti serve.

If c.Value = vRicerca Then
if cells(c.row,c.column+1).value <> "" and cells(c.row,c.column+2).value <>"" then
.....
end if



In rosso l'aggiunta di codice. In parole povere sto dicendo (o credo di dire) ad Excel di riportarmi i dati se e solo se anche le celle accanto sono piene.

Fai sapere. Ciao,
Mario
Marius44
Utente Senior
 
Post: 655
Iscritto il: 07/09/15 22:00

Re: cerca valore su più file e restituisce nome e riga (exce

Postdi Anthony47 » 02/06/18 17:30

Se stai gia' usando la macro che hai pubblicato allora per prima cosa prova il suggerimento di Mario (vedi messaggio precedente).

Io invece preferisco non rincitrullire a capire il codice pubblicato e partire da zero...
Mancherebbe qualche elemento per determinare meglio l'area da riportare nell'elenco di riepilogo, comunque (se non risolvi gia') prova con questo codice:
Codice: Seleziona tutto
Sub LogAll()
Dim myP As String, myF As String
Dim nWb As Workbook, AA, tSh As Worksheet
Dim tVal, C As Range, I As Long, rcCnt As Long
'
myP = "C:\Users\UTENTE\Percorso\"                       '<<< Il percorso dei file, con lo / finale
Set tSh = ThisWorkbook.Sheets("Foglio1")                '<<< Il foglio in cui si crea l'elenco
tVal = ThisWorkbook.Sheets("Foglio1").Range("A1").Value '<<< Il valore da cercare
'
myF = Dir(myP & "*.xls")
Application.EnableEvents = False
Do While myF <> ""
    If myF <> ThisWorkbook.Name Then
        Workbooks.Open myP & myF, 0
        Set nWb = ActiveWorkbook
        For I = 1 To nWb.Worksheets.Count
            With Worksheets(I).UsedRange
                Set C = .Find(tVal, LookIn:=xlValues)
                If Not C Is Nothing Then
                    firstAddress = C.Address
                    Do
                        If C.Offset(0, 1) <> "" Then Call Logg(nWb.Name, Sheets(I).Name, C, tSh, rcCnt)
                        Set C = .FindNext(C)
                    Loop While Not C Is Nothing And C.Address <> firstAddress
                End If
            End With
        Next I
        nWb.Close False
    End If
    myF = Dir
Loop
Application.EnableEvents = True
MsgBox ("Completato; righe aggiunte: " & rcCnt)
End Sub

Sub Logg(acWb As String, acWs As String, ByRef cAdr As Range, dLog As Worksheet, rCount As Long)
Dim myNext As Long, cArea As Range
'   
myNext = dLog.Cells(Rows.Count, 1).End(xlUp).Row + 1
dLog.Cells(myNext, 1) = acWb
dLog.Cells(myNext, 2) = acWs
Set cArea = Sheets(acWs).Range(cAdr, cAdr.Offset(0, 20).End(xlToLeft))
dLog.Cells(myNext, 3).Resize(1, cArea.Columns.Count).Value = cArea.Value
rCount = rCount + 1
End Sub

Va messo in un Modulo standard del vba; le righe marcate con <<< vanno adattate come da commento, poi all'occorrenza si esegue la Sub LogAll.

Per quanto riguarda il valore da ricercare, ho immaginato che venga scritto in A1 di Foglio1 del file che contiene la macro ma puo' essere impostato diversamente; comunque, per sicurezza, se si usa lo stesso foglio sia per creare l'elenco che per dichiarare il valore da cercare, quest'ultimo deve trovarsi o in riga1 oppure in colonna A.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19181
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: cerca valore su più file e restituisce nome e riga (exce

Postdi abgate » 03/06/18 11:33

grazie ad entrambi per l'aiuto, alla fine ho preferito usare il codice di Anthony che è perfetto per quello che devo fare, non so perchè, l'altro non funziona correttamente e mi restituisce tutte le celle che hanno 1 accanto ai valori anche non cercati. la prossima volta mi spiego meglio. intanto sempre e grazie per il vostro aiuto :)
abgate
Newbie
 
Post: 7
Iscritto il: 21/04/18 14:25


Torna a Applicazioni Office Windows


Topic correlati a "cerca valore su più file e restituisce nome e riga (excel)":

BTp Valore
Autore: MarioLombardi
Forum: Forum off-topic
Risposte: 2

Chi c’è in linea

Visitano il forum: Nessuno e 50 ospiti