Ricerca dati ed evidenzia



  • Ricerca dati ed evidenzia
    di visma (utente non iscritto) data: 17/12/2012 22:59:40

    Ciao a tutti rieccomi con un altro problema
    allego file vorrei effettuare sul foglio storico una ricerca di un dato qualsiasi nell'esempio H 1399
    una volta trovato ricopiare automaticamente nel foglio analisi storico l'intera riga di dati ed evidenziare il dato cercato in questo caso riga 2 e riga 7 cella A2 G7
    se cercassi esempio H 121 nello storico copia nel foglio analisi storico della riga 12 e 19
    il dato da ricercare puo essere messo in a1 o nella prima riga in un userform ancora meglio
    Grazie visma



  • di HarryBosch data: 18/12/2012 01:44:49

    Ciao Visma
    più che una Userform, la richiesta del valore da ricercare si potrebbe attuare con un Inputbox. Ti riallego un esempio di come si potrebbe sfruttare il "FIND" quando la ricerca trova più elementi.

    Puoi richiamare la macro con CTRL + r (che ovviamente puoi modificare a piacere):
    - apparirà l'Inputbox che ti chiederà il valore da ricercare
    - se la ricerca è fruttuosa le righe verranno riportate nel foglio Analisi e verrà evidenziato il valore trovato

    Ti ho inserito anche i commenti; posto il codice anche qua sotto a beneficio di tutti.
     
    Option Explicit
    
    Sub ricerca()
        Dim valore As Variant
        Dim conta As Integer, i As Integer
        Application.ScreenUpdating = False
    
    riprova:
        'chiedo l'inserimento di un valore tramite Inputbox
        valore = InputBox("inserisci il valore da cercare")
        'se premo Annulla esco
        If StrPtr(valore) = 0 Then Exit Sub
    
        'se non inserisco nulla, avviso e ripeto la ricerca
        If valore = "" Then
            MsgBox "Inserisci un valore prima di eseguire la ricerca"
            GoTo riprova
        End If
    
        'se ho inserito un valore calcolo quante volte appare nella tabella
        conta = WorksheetFunction.CountIf([a2].CurrentRegion, valore)
    
        'se il risultato è 0 significa che il valore non è stato trovato ed esco
        If conta = 0 Then
            MsgBox "Il valore """ & valore & """ non è stato trovato"
            Exit Sub
        End If
    
        'altrimenti attivo il primo valore trovato
        Cells.Find(valore).Activate
        'nel foglio Analisi cancello valori e colorazioni precedenti
        With Sheets("Analisi Storico")
            .Cells.ClearContents
            .Cells.Interior.ColorIndex = 0
    
            'copio l'intera riga trovata nel foglio Analisi ed evidenzio il valore cercato
            Rows(ActiveCell.Row).Copy Destination:=.Cells(1, 1)
            .Cells(1, ActiveCell.Column).Interior.ColorIndex = 6
    
            'proseguo con la ricerca, per tutti i valori trovati meno quello (-1) che abbiamo appena copiato
            'se trovo un solo valore il ciclo non partirà (da 1 a 0 !)
            For i = 1 To conta - 1
                Cells.FindNext(ActiveCell).Activate
                Rows(ActiveCell.Row).Copy Destination:=Sheets("Analisi Storico").Cells(i + 1, 1)
                .Cells(i + 1, ActiveCell.Column).Interior.ColorIndex = 6
            Next
    
            'seleziono il foglio Analisi
            .Select
        End With
        Application.ScreenUpdating = True
    End Sub
    



  • di visma (utente non iscritto) data: 18/12/2012 19:21:20

    Be intanto un grazie per la soluzione
    nel file allegato funziona tutto alla perfezione ma quando lo incorporo nel
    file che sto usando mi da errore
    Cells.Find(valore).Activate
    dove sbaglio
    Grazie visma



  • di visma (utente non iscritto) data: 19/12/2012 12:19:19

    Ciao a tutti allego un file dove si puo vedere l'errore
    se cerco 4856 A2 tutto ok
    ma se cerco ad esempio 20 mi dice nessun dato
    Grazie visma



  • di Vecchio Frac data: 19/12/2012 15:20:26

    Ti allego il codice di Harry con una piccola modifica, che serve sia a tener conto del problema che hai riscontrato, sia per non copiare due volte la stessa riga (se cerchi "20" viene riportata due volte la stessa riga perchè il valore 20 compare in due celle diverse, ma credo che a te basti riportare solo un risultato).

    L'ultimo errore saltava fuori per via delle colonne vuote in questo punto:
    conta = WorksheetFunction.CountIf([a2].CurrentRegion, valore)

    che ho modificato così:
    conta = WorksheetFunction.CountIf([a2].EntireRow, valore)

    Inoltre ho eliminato quel "Goto riprova" che non mi piaceva per niente ^_^

     
    Sub ricerca()
    Dim valore As Variant
    Dim conta As Integer, i As Integer, ri As Long
        
        Application.ScreenUpdating = False
    
        'chiedo l'inserimento di un valore tramite Inputbox
        Do
            valore = InputBox("inserisci il valore da cercare")
            'se premo Annulla esco
            If StrPtr(valore) = 0 Then Exit Sub
            'se non inserisco nulla, avviso e ripeto la ricerca
            If Trim(valore) = "" Then MsgBox "Inserisci un valore prima di eseguire la ricerca"
        Loop Until Trim(valore) <> ""
        
        'se ho inserito un valore calcolo quante volte appare nella tabella
        conta = WorksheetFunction.CountIf([a2].EntireRow, valore)
        
        'se il risultato è 0 significa che il valore non è stato trovato ed esco
        If conta = 0 Then
            MsgBox "Il valore """ & valore & """ non è stato trovato"
            Exit Sub
        End If
    
        'altrimenti attivo il primo valore trovato
        Cells.Find(valore).Activate
        
        'nel foglio Analisi cancello valori e colorazioni precedenti
        With Sheets("Analisi Storico")
            .Cells.Clear
    
            'copio l'intera riga trovata nel foglio Analisi ed evidenzio il valore cercato
            Rows(ActiveCell.Row).Copy Destination:=.Cells(1, 1)
            .Cells(1, ActiveCell.Column).Interior.ColorIndex = 6
            ri = ActiveCell.Row
    
            'proseguo con la ricerca, per tutti i valori trovati meno quello (-1) che abbiamo appena copiato
            'se trovo un solo valore il ciclo non partirà (da 1 a 0 !)
            For i = 1 To conta - 1
                Cells.FindNext(ActiveCell).Activate
                If ri <> ActiveCell.Row Then
                    Rows(ActiveCell.Row).Copy Destination:=Sheets("Analisi Storico").Cells(i + 1, 1)
                    .Cells(i + 1, ActiveCell.Column).Interior.ColorIndex = 6
                    ri = ActiveCell.Row
                End If
            Next
    
            'seleziono il foglio Analisi
            .Select
        End With
        Application.ScreenUpdating = True
    End Sub






  • di visma (utente non iscritto) data: 19/12/2012 18:32:20

    Grazie davvero mi si ripresenta un errore (allego file) valore non trovato un numero qualsiasi del foglio
    per quanto riguarda la ricerca esempio K 100 M dovrei copiare tutte le righe da 12 a 22 per sapere in quante righe dello storico si presentano
    con lo stesso valore
    Grazie del vostro tempo visma



  • di HarryBosch data: 19/12/2012 19:12:09

    Però credo che Visma voglia controllare i valori su tutta la tabella e non su una riga.
    Con il primo codice che avevo inserito, in effetti se il numero ricercato appariva più volte sulla stessa riga, quest'ultima veniva copiata più volte.

    Ho apportato alcune correzioni:
    - ho tenuto la modifica di VecchioFrac che ha giustamente eliminato quell'orribile Goto ^_^
    - ho modificato il CurrentRegion, perché non si capisce bene se la tabella è unita o se hai delle colonne vuote in mezzo, visto che hai postato due file con diversa strutturazione.. ho inserito un range che va dalla colonna A:AH eventualmente da modificare a seconda dell'ultima colonna utilizzata
    - ho aggiunto un Trim quando ricerchi il valore inserito: questo perché se inavvertitamente inserivi degli spazi prima o dopo, la ricerca ti generava un errore

    ps: comunque la ricerca del 20 a me dava esito positivo :)
    Prova adesso con l'allegato 5



  • di HarryBosch data: 19/12/2012 19:15:48

    Chiedo venia a VecchioFrac: aveva già sistemato quanto ho detto, sia con il trim, sia con il controllo del doppione! ^_^
    Mi sono accorto adesso di aver ripreso un codice precedente, e non l'ultimo che ti aveva postato



  • di visma (utente non iscritto) data: 19/12/2012 19:26:43

    Sono ansioso di provarlo ma non vedo l'allegato 5
    Grazie visma



  • di HarryBosch data: 19/12/2012 19:38:10

    Scusa... ecco qua.
    Purtroppo in questi giorni non riesco a seguire le discussioni, con il lavoro sono impegnatissimo (e per fortuna direi, visti i tempi che corrono).

    Non cambia niente dal codice di VecchioFrac se non per la selezione della tabella da controllare.



  • di visma (utente non iscritto) data: 19/12/2012 21:09:21

    Ciao a tutti scusatemi ma continuo con i problemi
    il file allegato risponde a come dovrebbe essere la struttura dello storico fino a circa DA
    ricopiando il codice che nell'allegato 5 con dati fittizzi funziona perfettamente qua non va
    forse (anzi sicuramente commetto qualche errore che non riesco a individuare)
    mi dice che il dato cercato non esiste scusate se vi rubo del tempo
    concordo con HarryBosch (visto i tempi che corrono) avere un lavoro che ci impegna tantissimo è una fortuna
    Grazie visma



  • di HarryBosch data: 20/12/2012 02:11:18

    Mi sa che è sparito un pezzo del tuo ultimo commento ^_^
    E non devi scusarti: se qualcosa non funziona ti invito io stesso a chiedere, perché la mia/nostra soddisfazione è risolvere il thread :)

    Dunque, il codice funziona con il file che alleghiamo, ma se lo riporti nel tuo file qualcosa non torna.
    L'unica cosa che mi viene da pensare, è che il range di ricerca, cioè la tabella con tutti i dati, abbia dei riferimenti diversi; per esempio nell'ultimo allegato la ricerca si eseguiva nell'intervallo A1:AH, fino all'ultima riga determinata dalla colonna AH: se però questa è vuota ti esce un messaggio che il valore non è stato trovato.
    Set rng = Range("a1:ah" & Cells(Rows.Count, "ah").End(xlUp).Row)
    conta = WorksheetFunction.CountIf(rng, valore)

    Nel primo codice avevo utilizzato il CurrentRegion, che però non va bene se hai delle colonne vuote nel mezzo:
    conta = WorksheetFunction.CountIf([a2].CurrentRegion, valore)

    Nel tuo file originale come sono i riferimenti della tabella Storico?



  • di visma (utente non iscritto) data: 20/12/2012 11:02:51

    Grazie per la disponibilita (mi sono comprato un libro perchè non serve solo la pappa pronta ma cerco di capire
    proprio come risolvete il problemi)
    il foglio storico è strotturato in questo modo esempio
    colonna A codice pezzo univoco es. 56486
    colonna D tipo di lavorazione es. K 142 M
    colonna G tipo di materiale es. hrtye
    colonna J altro tipo es. F 281 M
    e così via continuando ad aggiungere lavorazioni lo storico diventa molto lungo
    quindi se cerco es. lavorazione F 102 M risposta riga 4 e 5 con i relativi parametri quindi tutta la riga da copiare
    la lunghezza dello storico puo variare a seconda de casi
    la colonna N es. riporta il totale di L+M (le formule sono state tolte perchè prendevano dati da altri fogli)
    quindi alcune colonne es. L e M dovrebbero essere nascoste
    spero di essere stato chiaro
    Grazie visma
    allego file storico7



  • di HarryBosch data: 21/12/2012 01:15:48

    Come avevo pensato: l'errore, ovvero la ricerca nulla, avviene perché non si controlla il giusto intervallo, proprio come ti avevo spiegato nel mio ultimo intervento.
    Ci sono delle colonne vuote che impediscono l'uso del Current Region e la colonna "AH", inserita come riferimento nell'ultimo codice, è vuota.
    Ok, vedi il file "storico-8" e vedrai che stavolta funziona.
    In sostanza controllo l'ultima cella dell'intero foglio, tenendo come ultima colonna di ricerca AH (eventualmente da sostituire).



  • di visma (utente non iscritto) data: 21/12/2012 15:24:34

    Grazie 1000 HarryBosch funziona alla perfezione senza nessun intoppo
    ringrazio anche Vecchio Frac e vi auguro buone feste
    Visma
    ¨¨¨¨¨¨¨¨¨. *
    ¨¨¨¨¨¨¨¨¨ **
    ¨¨¨¨¨¨¨¨¨*o*
    ¨¨¨¨¨¨¨¨*♥*o*
    ¨¨¨¨¨¨¨***o***
    ¨¨¨¨¨¨**o**♥*o*
    ¨¨¨¨¨**♥**o**o**
    ¨¨¨¨**o**♥***♥*o*
    ¨¨¨*****♥*o**o****
    ¨¨**♥**o*****o**♥**
    ¨******o*****♥**o***
    ****o***♥**o***o***♥ *
    ¨¨¨¨¨____!_!____
    ¨¨¨¨¨_________/¨¨



  • di HarryBosch data: 21/12/2012 16:17:46

    Sono stupito!
    Ho visto spesso questi effetti costruiti con i caratteri ma non mi sono mai cimentato nella realizzazione... bellissimo ^_^

    Buone feste anche a te... a presto