› Excel e gli applicativi Microsoft Office › Macro per ricerca parole all'interno della cartella di lavoro
-
AutoreArticoli
-
Buongiorno,
mi chiamo Daniel e vi scrivo per una richiesta che, per le mie infime conoscenze di vba, sembra insormontabile.
Anzichè utilizzare il classico comando da barra dei menu, vorrei inserire un pulsante (e fino a qui ci arrivo) nella prima pagina della mia cartella di lavoro excel al quale attribuire il comando TROVA (magari associando la combinazione di tasti CTRL+SHIT+T)
Se ciò non fosse possibile (purtroppo credo sia così) ho provato con una macro trovata in rete (che ho un po' adattato) per effettuare la ricerca di una parola all'interno dell'intera cartella.
Purtroppo però riesco ad effettuare la ricerca soltanto nella pagina iniziale e non in tutte le pagine.
Avete qualche suggerimento in merito?
Vi ringrazio per l'attenzione e la collaborazione!
Daniel
Ciao Daniel
Allega il file e la macro che hai preparato.
Ti consiglio, inoltre, di provare con il registratore in quanto il trova ha la possibilità di cercare sia su folgio che su cartella.
Ciao
LucaGrazie per la risposta! Appena riesco provo con il registratore.
Ho la necessità di utilizzare il sistema più semplice possibile.
Ti ringrazio
Sarà sicuramente per incapacità mia, ma con il registratore non riesco a svolgere l'attività di cui sopra.
Posso postare la macro che uso attualmente per cercare all'interno di un foglio di lavoro una parola (tra la colonna A e la Z). L'ho trovata in rete (come dicevo sono completamente a digiuno di macro) ed ho solo fatto una stupida modifica per adattare l'area di ricerca alle mie esigenze nel foglio di lavoro.
Se fosse possibile generalizzarla a tutta la cartella di lavoro avrei già fatto un notevole passo avanti.
Sono conscio che il comando trova è assolutamente in grado di svolgere quanto sto cercando di fare, ma purtroppo mi è stata fatta questa richiesta...
Purtroppo non c'è modo di "spostare" il binocolino dalla barra dei menu ad un pulsante in mezzo ad un file excel... peccato 🙁
Sub CasellaDiTesto3_Click()
On Error GoTo 10
'Dim trovato As Boolean
Dim I As Long
Dim TextToFind As String
Dim Msg As String, Stile As String, Titolo As String
Dim Response As Integer, Record As Integer
TextToFind = InputBox("Cosa vuoi cercare?")Columns("A:Z").Select
Selection.Interior.ColorIndex = xlNone
Record = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
For I = 2 To Sheets.Count
Selection.Find(What:=TextToFind, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False).ActivateTitolo = "Ricerca Record"
Msg = "È stato trovato il Record: " & ActiveCell & " Continuare ?"
Stile = vbYesNo + vbCritical + vbDefaultButton2Response = MsgBox(Msg, Stile, Titolo)
If Response = vbNo Then
ActiveCell.SelectWith Selection.Interior
.ColorIndex = 36
End WithEnd
End If
Next I
End
10:
MsgBox "Testo non trovato!"
Range("A2").Select
End SubRingrazio ancora una volta per la collaborazione e mi scuso per il tempo che vi ho fatto perdere
Ciao Daniel
Ti è stato chiesto di allegare il tuo file (senza dati sensibili) in modo da poterci lavorare sopra.
Ad occhio noto quanto segue:
a) la macro dovrebbe passare in rassegna tutti i fogli ma non c'è nulla che selezioni un foglio dopo l'altro (c'è un Columns("A:Z").Select ma non si riferisce ad alcun Foglio ed è fuori dal ciclo For ... Next
b) se non trova il testo cercato in un Foglio esce dalla sub senza andare al successivo Foglio
c) una volta trovato il testo cercato non specifica nel messaggio nè il Foglio nè la cella.
Aspettiamo il file. Ciao,
Mario
Ciao Marius, mi iscrivo...
...pulisco un po' il foglio e vi mando il tutto!
Per l'ennesima volta: Grazie!
Buongiorno,
allego il file come richiesto.
La ricerca dovrà avvenire ovviamente all'interno delle tabelle excel (in questo caso ho inserito soltanto Settore A e Settore B, ma saranno di più) della cartella di lavoro.
Non occorre che sia vincolata ad una colonna specifica.
L'utente potrebbe dover ricercare un codice o una descrizione.
Nel caso di più risultati, se fosse possibile che la ricerca non si fermasse al primo risulato utile sarebbe un ulteriore plus!
Nel caso in cui non vi fossero risultati è possibile che compaia un avviso?
Lo so che con la funzione TROVA avrei già risolto il problema... ma mi è stata chiesta questa soluzione alternativa.
Vi ringrazio per la ennesima volta.
Allegati:
You must be logged in to view attached files.Ciao
Prova a sostituire la tua macro con questa (che è senz'altro da affinare)
Sub ricerca() titolo = "Ricerca Record" mes = "Inserisci cosa cercare" X = InputBox(mes, titolo) If X = "" Then Exit Sub 'se non scrivo niente nella finestra esco dalla routine For I = 2 To Sheets.Count With Worksheets(I).Range("A2:AE103") Set c = .Find(X, LookIn:=xlValues) '(What:=X, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False)' If Not c Is Nothing Then firstAddress = c.Address Msg = "Trovato " & X & " " & Sheets(I).Name & " " & c.Address & vbLf & "Vuoi Continuare?" Risp = MsgBox(Msg, 4, titolo) If Risp = vbNo Then Exit Sub Else Do Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstAddress End If Else 'se non ha trovato Msg = "Nessuna corrispondenza nel Foglio " & Sheets(I).Name MsgBox Msg, 0, titolo End If End With Next I End SubFai sapere. Ciao,
Mario
Beh punto primo: grazie infinite!
Sei andato vicinissimo alla perfezione al primo colpo!
Ti chiedo soltanto:
- è possibile che visualizzi la pagina in cui trova il risultato?
- non limitare la ricerca al primo risultato utile per pagina?
Ciao
Prova sostituendo la precedente con quest macro (ripeto, sarebbe da affinare)
Sub ricerca() Titolo = "Ricerca Record" mes = "Inserisci cosa cercare" X = InputBox(mes, Titolo) If X = "" Then Exit Sub 'se non scrivo niente nella finestra esco dalla routine For i = 2 To Sheets.Count With Worksheets(i).Range("A2:AE103") Set c = .Find(X, LookIn:=xlValues) primo = c.Address If Not c Is Nothing Then firstAddress = c.Address GoSub Trovato If Risp1 = vbNo Then Exit Sub Else Do Set c = .FindNext(c) If c.Address = primo Then GoTo nxt GoSub Trovato If Risp1 = vbNo Then Exit Do Loop While Not c Is Nothing And c.Address <> firstAddress End If Else 'se non ha trovato Msg = "Nessuna corrispondenza nel Foglio " & Sheets(i).Name MsgBox Msg, 0, Titolo End If End With nxt: Next i Exit Sub ' Trovato: Msg = "Trovato " & X & " " & Sheets(i).Name & " " & c.Address & vbLf & "Vuoi Continuare?" Risp1 = MsgBox(Msg, 4, Titolo) If Risp1 = vbNo Then 'se la risposta è NO 'chiede se vuole selezionare la cella Risp = MsgBox("Vuoi selezionare la cella?", 4, Titolo) If Risp = vbYes Then 'se la risposta è SI Sheets(i).Select 'seleziona Foglio Sheets(i).Range(c.Address).Select 'seleziona cella Exit Sub End If End If Return End SubFai sapere. Ciao,
Mario
E' già una meraviglia!
Ultimo piccolo problema riscontrato: se non trova alcunrisultato dà un errore: Errore di run-time "91":
Variabile oggetto o variabile del blocco With non impostata
Per il resto è perfetta!!
Grazie mille!!!
Ciao
Hai ragione. Un piccolo lapsus
Correggi la riga 9 così
If IsEmpty(c) Then primo = c.AddressFai sapere. Ciao,
Mario
Beh che dire: sei un grande ora non dà più l'errore!
Non so come ringraziarti!
Sei stato veramente troppo gentile ad avermi dedicato il tuo tempo!
Poiché "c" è un oggetto di tipo Range avrei testato meglio con Not Is Nothing(c).
Comunque nel codice vedo che "c" non è dichiarata come variabile di tipo Range quindi vorrei raccomandare sempre di intestare i propri moduli con Option Explicit. Questa raccomandazione la faccio dalla notte dei tempi ma credetemi che può salvarvi molti mal di testa in fase di debug 🙂
Anzi, aggiungete questa direttiva di default dalle opzioni dell'IDE (Strumenti > Opzioni > Editor > Dichiarazioni di variabili obbligatoria)
Passano gli anni e VF non si smentisce. E' il Migliore.
Ciao,
Mario
Così mi fai fare la figura del saputello e non voglio 🙂
Ci sono quelli "più ottimi" di me che lavorano nell'ombra, io cerco di riportare la mia esperienza agli altri come fu fatto con me parecchi anni fa.
SuperMario meno male che ci sei 😉
Mi sono ripromesso di applicarmi e di imparare almeno i fondamenti.
Purtroppo in questo situazione avevo tempi estremamente ristretti e non ci sarei mai riuscito senza il vostro, per me, miracoloso intervento!
If Not (c Is Nothing)è la sintassi corretta.
Proverò ad applicare questa modifica.
In questo momento però la macro non mi dà alcun errore!
Domani vi mostrerò alcuni miei primi tentativi di macro per svolgere semplici operazioni, magari (anzi sicuramente) riuscite a darmi qualche dritta!
Ovviamente nei ritagli di tempo!
Odio non poter essere d'aiuto e chiederlo agli altri...
wrote:Proverò ad applicare questa modifica.
Mica per forza, soprattutto se il codice fa quello che deve. Il mio era solo un suggerimento tecnico per migliorare il codice.
Che tra parentesi, soprattutto nella seconda versione mi piace veramente poco per via dei Gosub e dei Goto che leggo all'interno... brrr 🙂
Beati voi che vedete queste finezze.
Io per copiare dei dati in colonna da un foglio ad un altro ho creato una macro per ogni colonna.
Sto cercando di capire come unificare i copia-incolla in una unica macro.
Sono proprio un asino, ma nel fine settimana comincio a studiare la guida.
Mi sto appassionando pur nella mia incapacità infinita
Appassionarsi è cosa ottima e giusta 🙂
Fai pure i tuoi tentativi e crea nuove discussioni per... discutere insieme a noi 🙂
-
AutoreArticoli
