Ricerca valori su colonne
Hai un problema con Excel? 
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
Vuoi Approfondire?