Ricerca valori su colonne



  • Ricerca valori su colonne
    di davide (utente non iscritto) data: 12/01/2013 10:04:23

    Ciao,
    ho provato a modificare un codice per renderlo adatto a verificare se in una determinata colonna (L) di vari file excel, vi è un determinato valore (ad esempio valore numerico 0 (zero)).
    Il codice mi sembra che funzioni però non si "ferma" quando trova il valore... vorrei che si fermasse per capire dove si trova il valore.

    Non vorrei far salvare inoltre il file, ma se elimino "ActiveWorkbook.Save" mi chiede sempre di salvarlo?


     
    Sub read_file_in_folder_errore0()
    Dim my_path As String, fso As Object, my_file As Object, s As String
    Dim wbk As Workbook, valore As Single, last_row As Integer, my_range As Range, cella As Range
    
        Set fso = CreateObject("Scripting.FileSystemObject")
        
        my_path = "C:Usersd.gallinaDesktopWBS_31 - CopiaCME"
        
        last_row = Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
        
            Set my_range = Range("A26:A" & last_row)
        
        For Each cella In my_range
                    
                    
                If fso.fileexists(my_path & "" & cella & ".xlsx") Then
                   
                    
                    Workbooks.Open Filename:= _
    (my_path & "" & cella & ".xlsx")
    
    
      Columns("L:L").Select
        Selection.Find(What:="a", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False).Activate
       
    ActiveWorkbook.Save
    ActiveWindow.Close
                    
                    
                    
                End If
                
            
    Next
        
    End Sub



  • di Vecchio Frac data: 12/01/2013 10:26:32

    Non si ferma perchè non gli dici di farlo ^_^
    Semplicemente cerca il valore e si limita a attivare la cella trovata.
    Find ritorna un oggetto vuoto (impostato a Nothing) se la ricerca è infruttuosa.
    Per chiudere una cartella senza salvarla puoi specificare False dopo il suo metodo Close.
    Prendi il codice che allego e provalo, adattalo al tuo contesto.
     
    For Each cella In my_range
        If fso.fileexists(my_path & "" & cella & ".xlsx") Then
            Workbooks.Open Filename:= my_path & "" & cella & ".xlsx"
            Set c = [L:L].Find(What:="a", LookIn:=xlValues, LookAt:=xlPart)    'all'inizio serve Dim c As Range
            if not (c is nothing) then 
                c.Activate
                exit for
            end if
            ActiveWorkbook.Close False      'non salva il foglio 
        End If
    Next






  • di Luca.Donati data: 12/01/2013 10:42:35

    Scusate, mi intrufolo un attimo per chiedere un dettaglio.
    Davide, su che versione di Excel lavori?
    Sono interessatissimo a quella riga che dice If fso.fileexists...
    Vuol dire che FileSystemObject supporta un comando che permette di sapere se un file esiste?
    Funziona anche sotto excel 2010, oppure sotto 2003 ?
    Grazie dell'ospitalità, ciao.



  • di Davide (utente non iscritto) data: 12/01/2013 10:42:39

    Ok, mi è chiaro il ciclo e funziona correttamente!
    Credo però di dover settare in modo diverso il valore da cercare nella colonna, se ho dei numeri e volessi trovare un valore specifico ad es. 0 (zero) e non i numeri che contengono uno 0 ad es.100, devo far riconoscere lo 0 come numero e non come stringa.



  • di Davide (utente non iscritto) data: 12/01/2013 10:50:57

    uso la 2010. Subito mi dava dei problemi ma ora funziona correttamente (faccio sempre delle verifiche in quanto la funzione mi serve per aggiornare dei file e verificando la data ho visto che non mi da problemi)



  • di Vecchio Frac data: 12/01/2013 11:10:24

    @Davide
    Set c = [L:L].Find(What:="a", LookIn:=xlValues, LookAt:=xlPart)
    cerca un valore come parte della cella; a te serve forse cambiare in questo modo:
    Set c = [L:L].Find(What:="a", LookIn:=xlValues, LookAt:=xlWhole)
    e troverà la corrispondenza esatta (ma tratta numeri e stringhe allo stesso modo)

    @Luca
    Il modello File System Object (FSO) è uno strumento basato sugli oggetti per l'utilizzo di cartelle e file. E' implementato in ogni versione di VBA. Espone metodi e proprietà per manipolare i file e le cartelle del sistema operativo. L'oggetto usa la sintassi di ogni altro oggetto.
    Ti rimando alla guida MSDN per i dettagli (msdn.microsoft.com/it-it/library/aa711216(v=vs.71).aspx)





  • di Davide (utente non iscritto) data: 12/01/2013 11:36:41

    Funziona. Al posto dell'"exit for" è possibile fare una pausa e quindi riprendere il ciclo da dove si è fermato?



  • di Vecchio Frac data: 12/01/2013 11:40:15

    Tutto si può fare :)
    Se vuoi poter interagire col foglio bisogna ripensare alla struttura del codice.
    Se ti basta visualizzare un messaggio con i dati della cella trovata puoi sostituire con
    Msgbox "E' stata trovata la cella " & c.Address
    e poi il ciclo riprende quando premi Ok.





  • di Davide (utente non iscritto) data: 12/01/2013 11:50:48

    Perfetto!! ho tolto l'exit for e aggiunto la Msgbox.



  • di Luca.Donati data: 12/01/2013 12:01:11

    Grazie anche da parte mia, Vecchio Frac; adesso mi metto a studiare un po'...



  • di Vecchio Frac data: 12/01/2013 14:01:41

    cit. " Perfetto!! ho tolto l'exit for e aggiunto la Msgbox. "
    ---> Ma non è molto utile, credo.
    Togli il Msgbox e prova a scrivere qualcosa tipo:
    c.interior.colorindex = 6
    in questo modo il ciclo non viene interrotto, l'esecuzione è velocissima, e alla fine tutte le celle che soddisfano la condizione sono colorate di giallo.
    Naturalmente l'istruzione successiva chiude il file senza salvare... vedi tu se è il caso di salvare per ritrovare i risultati dell'elaborazione oppure no.
    Come vedi è solo un'opinione operativa :)





  • di Davide (utente non iscritto) data: 12/01/2013 16:29:04

    Grazie per i consigli e le nuove informazioni!



  • di Davide (utente non iscritto) data: 12/01/2013 17:00:50

    gli errori #N/D presenti in una cella non vengono riconosciuti con il cerca:
    c = [d:d].Find(What:="#N/D", LookIn:=xlValues, LookAt:=xlWhole)



  • di Vecchio Frac data: 12/01/2013 17:38:59

    Per come hai impostato l'istruzione, viene cercata semplicemente la stringa "#N/D", non il valore di errore, che devi intercettare con If IsError(c) Then ...





  • di Davide (utente non iscritto) data: 12/01/2013 20:24:22

    devo trovare se nella colonna d: d vi è un errore. Ho modificato il codice in questo modo. Gli faccio cercare una stringa fittizia "aa" w quindi se trova l'errore dovrebbe attivare la cella e dare un messaggio...ma non funziona. Sono sulla buona strada?

    Set c = [d:d].Find(What:="aa", LookIn:=xlValues, LookAt:=xlWhole) 'all'inizio serve Dim c As Range
    If IsError(c) Then
    c.Activate
    MsgBox "E' stata trovata la cella " & c.Address
    End If



  • di Vecchio Frac data: 12/01/2013 20:28:06

    No.
    Non trovare una stringa non significa trovare una cella contenente un valore di errore.
    Quando l'oggetto Find non trova una cella che soddisfa il criterio, viene valorizzato a Nothing.

    Set c = [d:d].Find(What:="aa", LookIn:=xlValues, LookAt:=xlWhole)
    if c is nothing then
    msgbox "Nessuna cella trovata!"
    else
    c.activate
    msgbox "Cella trovata! indirizzo = " & c.address
    end if





  • di Davide (utente non iscritto) data: 12/01/2013 21:05:44

    ho cambiato strategia..ma non funziona

     
    Sub read_file_in_folder_errore0()
    Dim my_path As String, fso As Object, my_file As Object, s As String
    Dim wbk As Workbook, valore As Single, last_row As Integer, my_range As Range, cella As Range, my_range1 As Range, cella1 As Range
    
        Set fso = CreateObject("Scripting.FileSystemObject")
        
        my_path = "C:Usersd.gallinaDesktopWBS_31 - CopiaCME"
        
        last_row = Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
        
            Set my_range = Range("A26:A" & last_row)
        
        For Each cella In my_range
                    
                    
                If fso.fileexists(my_path & "" & cella & ".xlsx") Then
                   
                    
                    Workbooks.Open Filename:=(my_path & "" & cella & ".xlsx")
    
     Set my_range1 = Range("d126:d1000")
     For Each cella1 In my_range1
             If IsError(cella1) Then
                           MsgBox "E' stata trovata la cella " & c.Address
            End If
       Next
    
    ActiveWindow.Close False
                      
                    
                End If
            Next
        
    End Sub



  • di Vecchio Frac data: 12/01/2013 21:45:32

    Certo che non funziona.

    If IsError(cella1) Then
    MsgBox "E' stata trovata la cella " & c.Address
    End If

    Non hai definito c come Set c = [...].Find ecc.
    E non devi intercettare IsError ma solo se c Is Nothing.
    In pratica hai ignorato il mio ultimo post ^_^





  • di Davide (utente non iscritto) data: 12/01/2013 21:53:22

    Avevo settato male il range e ho modificato il messaggio...ora funziona.


    Set my_range1 = Range("d1:d1000")
    For Each cella1 In my_range1
    If IsError(cella1) Then

    MsgBox "E' stata trovata la cella "
    End If



  • di Davide (utente non iscritto) data: 18/01/2013 07:21:00