Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 2 di 2 primaprima 12
Visualizzazione dei risultati da 11 a 20 su 20

Cercare celle contenenti una stringa ma che non contengono un'altra stringa

  1. #11
    Chico non  in linea Scolaretto
    Se ho ben capito, il tuo codice originario funzionava bene tranne il caso in cui:
    ErrNumECol(CicloCercaBase, 1) = 1
    che anche il valore discriminante del Select Case.

    Quindi l'errore si genera solo nel "Case 1".

  2. #12
    genespos non  in linea Scribacchino
    Esatto!
    In pratica ho reso impossibile il "Case 1" e ho aggirato l'ostacolo.

    Per mi sorto un PROBLEMA PIU' GROSSO:

    Come ho spiegato cerco 23 stringhe differenti per avere un massimo di 19 risultati utili da utilizzare.

    Una delle stringhe parte di un'altra (e a questo non si pu rimediare)

    Facevo l'esempio:
    "libro di Marco giallo" (mi interessa)
    "libro di Marco rosso" (mi interessa)
    "libro di Marco a casa di Mario" (non mi interessa)
    "Penna di Mario sul libro di Marco" (non mi interessa)
    "libro di Marco a casa di Giorgio" (non mi interessa)
    Succede che quando si cerca la stringa "libro di Marco" e viene trovata "libro di Marco a casa di Mario" il SelectCase confronta il testo da escludere (ad esempio "casa") e ripete la ricerca.

    Il problema sorge quando nella colonna selezionata manca una stringa tipo "libro di Marco rosso" perch il ciclo va in loop trovando sempre la stessa stringa ed escludendola perch non soddisfa i requisiti.

    Come posso evitare questo loop infinito?

    Mi venuto in mente di mettere un contatore che si azzera ad ogni ciclo di ricerca e un GoTo se il numero diventa troppo alto, che nepensate?

    Ciao.

  3. #13
    genespos non  in linea Scribacchino
    Cercando ho trovato qualcosa di pi corretto ma che non so come adattare al mio caso:

    ho trovato un codice con un Do Loop ed un'istruzione che interrompe il Loop quando Cell.Address del primo trovato equivalente a Cell.Address dell'ultimo trovato.

    Praticamente proprio quello che serve a me (solo che dovrei cambiare un For Next con un Do Loop) ma scritto con un linguaggio che mi sembra diverso dal VBA che conosco.

    Avrei bisogno di una "attualizzazione" o di una traduzione.

    Questo il link:
    Re: VBA Find e .FindNext che non scorre ...

    Spero possiate aiutarmi.

    Grazie

  4. #14
    Chico non  in linea Scolaretto
    Ho dato uno sguardo al link. A me sembra scritto esattamente in VBA.
    Comunque, se vuoi mantenere il ciclo FOR ...NEXT e interrompere la ricerca al raggiungimento di una condizione, puoi utilizzare l'istruzione EXIT FOR
     If (search_rng Is Nothing) And (search_rng.Address <> firstAddress) Then Exit For
    

  5. #15
    Chico non  in linea Scolaretto
    Mi venuto in mente di mettere un contatore che si azzera ad ogni ciclo di ricerca e un GoTo se il numero diventa troppo alto, che nepensate?
    ...dimenticavo,
    l'idea del contatore mi pare buona.
    Puoi inserire il confornto con il numero massimo di stringhe trovate all'interno della stessa condizione IF...THEN... EXIT FOR
    If ((search_rng Is Nothing) And (search_rng.Address <> firstAddress)) Or contatore = MaxNumber Then Exit For
    

  6. #16
    genespos non  in linea Scribacchino
    Grazie, in effetti cambiare da for next a do loop mi spaventava un po'. Exit for mi sembra un ottimo suggerimento

    Ora provo, per avrei bisogno di qualche spiegazione sui passaggi perch sono istruzioni che non ho mai usato:

    Ad esempio: serch_rng

    una variabile range che devo definire?
    se s in quale punto del codice bene inserirla?

    Stessi chiarimenti mi servirebbero per firstAddress

    Grazie in anticipo

  7. #17
    genespos non  in linea Scribacchino
    Funziona, per invece di exit for ho usato un GoTo che manda all'istruzione di azzeramento della matrice e poi al Next.

    Ora (ovviamente) sorto un altro problema ma relativo alla fase di assegnazione dei valori quindi (per non farmi tirare le orecchie) aprir un altro thread.(Poi magari posto qui il link).

    Ciao e grazie ancora

    PS Comunque la spiegazione che ho chiesto prima rimane gradita

  8. #18
    genespos non  in linea Scribacchino
    Come non detto

    Mi sono accorto che il Find non si limita a cercare nella selezione (ovvero nella colonna) ma trova anche stringhe in colonne successive.

    Ho provato ad inserire un "With Selection" ma forse l'ho usato male

    Trascrivo il codice cos magari mi aiutate a capire cosa non va

    Sub Trova_e_Escludi_Errori()
    Set AppSh = ActiveWorkbook.Worksheets("Appunti")
    StringaBase = AppSh.Range("A1:A23")
    ErrNumECol = AppSh.Range("B1:C23")
    Dim TestoErrore As Variant
    '
    For CicloFoglio = 1 To Sheets.Count - 2
        Sheets(CicloFoglio).Activate
        UC = ActiveCell.SpecialCells(xlLastCell).Column
            For CicloColonna = 1 To UC
            Cells(1, CicloColonna).Activate
            Lett1 = InStr(2, ActiveCell.Address, "$", vbTextCompare)
            LetteraCol = Mid(ActiveCell.Address, 2, Lett1 - 2)
            UltRiga = Range(LetteraCol & Rows.Count).End(xlUp).Row
            Range(ActiveCell.Address & ":" & LetteraCol & UltRiga).Select
                For CicloCercaBase = 1 To 24
                Contatore = 0
    Cerca:
                        On Error Resume Next
                        Cells(1, CicloColonna).Activate
                        With Selection
                            Cells.Find(What:=StringaBase(CicloCercaBase, 1), After:=ActiveCell, LookIn:=xlFormulas, _
                            LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
                            MatchCase:=False, SearchFormat:=False).Activate
                        End With
                        Trovato = ActiveCell.Value
                        TrovatoAdd = ActiveCell.Address
    Casi:
                        Contatore = Contatore + 1
                        If Contatore > 19 Then GoTo CercaAltro
                        Select Case ErrNumECol(CicloCercaBase, 1)
                            Case 0
                                GoTo AssegnaValore
                            Case 1
                                TestoErrore = AppSh.Range(ErrNumECol(CicloCercaBase, 2) & "1:" & ErrNumECol(CicloCercaBase, 2) & ErrNumECol(CicloCercaBase, 1))
                                If InStr(1, Trovato, TestoErrore, vbTextCompare) = 0 Then
                                GoTo AssegnaValore
                                Else:
                                Selection.FindNext(After:=ActiveCell).Activate
                                Trovato = ActiveCell.Value
                                GoTo Casi
                                End If
                            Case 2
                                TestoErrore = AppSh.Range(ErrNumECol(CicloCercaBase, 2) & "1:" & ErrNumECol(CicloCercaBase, 2) & ErrNumECol(CicloCercaBase, 1))
                                If InStr(1, Trovato, TestoErrore(1, 1), vbTextCompare) = 0 _
                                And InStr(1, Trovato, TestoErrore(2, 1), vbTextCompare) = 0 Then
                                GoTo AssegnaValore
                                Else:
                                Selection.FindNext(After:=ActiveCell).Activate
                                Trovato = ActiveCell.Value
                                GoTo Casi
                                End If
                            Case 3
                                TestoErrore = AppSh.Range(ErrNumECol(CicloCercaBase, 2) & "1:" & ErrNumECol(CicloCercaBase, 2) & ErrNumECol(CicloCercaBase, 1))
                                If InStr(1, Trovato, TestoErrore(1, 1), vbTextCompare) = 0 _
                                And InStr(1, Trovato, TestoErrore(2, 1), vbTextCompare) = 0 _
                                And InStr(1, Trovato, TestoErrore(3, 1), vbTextCompare) = 0 Then
                                GoTo AssegnaValore
                                Else:
                                Selection.FindNext(After:=ActiveCell).Activate
                                Trovato = ActiveCell.Value
                                GoTo Casi
                                End If
                            Case 4
                                TestoErrore = AppSh.Range(ErrNumECol(CicloCercaBase, 2) & "1:" & ErrNumECol(CicloCercaBase, 2) & ErrNumECol(CicloCercaBase, 1))
                                If InStr(1, Trovato, TestoErrore(1, 1), vbTextCompare) = 0 _
                                And InStr(1, Trovato, TestoErrore(2, 1), vbTextCompare) = 0 _
                                And InStr(1, Trovato, TestoErrore(3, 1), vbTextCompare) = 0 _
                                And InStr(1, Trovato, TestoErrore(4, 1), vbTextCompare) = 0 Then
                                GoTo AssegnaValore
                                Else:
                                Selection.FindNext(After:=ActiveCell).Activate
                                Trovato = ActiveCell.Value
                                GoTo Casi
                                End If
                            End Select
    '
    AssegnaValore:
    ' Parte omessa 
    '
    CercaAltro:
                        Erase TestoErrore
                Next CicloCercaBase
            Next CicloColonna
    Next CicloFoglio
    End Sub
    
    Aspetto con impazienza vostri suggerimenti perch non capisco proprio dove sia l'errore.

  9. #19
    genespos non  in linea Scribacchino
    Ok mi sento abbastanza stupido la soluzione l'avevonel mio codice
    Dovevo scrivere Selection.Find e non Cells.Find, infatti nel "trova successivo" c' Selection.FindNext.

    Ma non ancora finita

    Quando non trova il testo cercato la variabile "Trovato" viene comunque impostata al valore della cella attiva quindi:
    1) devo resettarla alla fine del ciclo (e lo so fare: Trovato = Nothing)
    2) devo saltare l'istruzione "Trovato = ActiveCell.Value" quando Selection.Find non trova la stringa (e NON LO SO FARE).

    Ora mi metto a cercare un po' su come si verifica che la stringa cercata sia stata trovata o no (se nel frattempo qualcuno che legge me lo suggerisce lo ringrazio)

    Ci risentiamo presto

    AGGIORNAMENTO:
    Ho trovato la soluzione:
    ho attribuito il valore di Selection.Find alla variabile Cercato e ho inserito un If con un GoTo per il caso di valore "".

    Ora devo solo farla girare e vedere che succede.

    A presto.
    Ultima modifica di genespos; 11-07-2013 16:10  Motivo: Aggiornamento

  10. #20
    genespos non  in linea Scribacchino
    Ragazzi credo sia fatta!

    Un ringraziamento a tutti

    anche solo con la vostra presenza mi date modo di riflettere e di trovare le soluzioni.

    Sono riuscito a fare cose che solo qualche mese fa avrei detto impossibili per me.

    GRAZIE A TUTTI e alla prossima.

+ Rispondi al messaggio
Pagina 2 di 2 primaprima 12

Potrebbero interessarti anche ...

  1. Cercare una stringa
    Da CC88 nel forum Microsoft SQL Server
    Risposte: 6
    Ultimo Post: 13-07-2017, 16:37
  2. Ricerca da VBA di una stringa all'interno di un'altra stringa
    Da giovepan nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 25-01-2017, 09:17
  3. inserire una stringa all'interno di un'altra stringa
    Da giuseppe morris nel forum Python
    Risposte: 2
    Ultimo Post: 11-08-2015, 20:35
  4. cercare stringa co vba
    Da antonello74 nel forum Microsoft Word
    Risposte: 3
    Ultimo Post: 01-01-2009, 15:10
  5. cercare una stringa in tutti i file
    Da theiden nel forum Visual Basic .Net
    Risposte: 0
    Ultimo Post: 25-05-2007, 17:04