Excel e gli applicativi Microsoft Office VBA: ricerca valore

Login Registrati
Stai vedendo 19 articoli - dal 1 a 19 (di 19 totali)
  • Autore
    Articoli
  • #6813 Score: 0 | Risposta

    angra
    Partecipante

      Buonasera a tutti,

      Questo codice cerca, in base al testo inserito nella InputBox, nella colonna 2 il nome corrispondete. Se lo trova, aggiunge "OK" nella riga corrispondente della colonna 3

      Come faccio a fare in modo che la ricerca vada a buon fine anche se digito solo una parte del nome?

      ES: il nome completo indicato in colonna 2, riga 3 è: Sig. Mario Rossi. Vorrei fare in modo che mi trovi questa cella anche se digito Rossi (o Mario Rossi)

      Sub cerca()
      Dim x As String
      Dim i As Integer
      Dim k As Boolean
      
      k = False
      
      x = InputBox("INSERISCI IL NOME CHE VUOI CERCARE")
      For i = 1 To 600
      If Cells(i, 2) = x Then
      Cells(i, 3) = "OK"
      k = True
      End If
      Next
      If k = False Then
      MsgBox ("NOME NON TROVATO")
      End If
      
      End Sub
      

       

       

      #6815 Score: 0 | Risposta

      Marius44
      Moderatore
        58 pts

        Ciao

        puoi mettere sia davanti che dietro un asterisco!

        Mi spiego. Dalla InputBox ti viene fuori, per esempio, "ros" che è assunto dalla variabile x;

        scrivi x= "*" & x & "*"

        In questo modo ti troverà qualsiasi stringa contenga "ros" e cioè Mario Rossi ovvero Rossi Mario ovvero Rossi Italo ovvero Carlo Rossetti.

        Come vedi non credo sia quello che vuoi. Devi anche tener presente, e gestire, un eventuale click su OK della InputBox SENZA che sia stato inserito alcunchè. La variabile in uscita non è vuota. bensì "**"

         

        Ciao,

        Mario 

        #6816 Score: 0 | Risposta

        angra
        Partecipante

          Grazie della risposta

          Modificando il codice aggiungendo i 2 asterischi, il cerca adesso mi da sempre come messaggio "NOME NON TROVATO"  (sia digitando una parte del nome sia digitando il nome per intero

          If Cells(i, 2) = "*" & x & "*" Then
          Cells(i, 3) = "OK"

          Cosa sto sbagliando?

          Grazie della pazienza

          #6818 Score: 0 | Risposta

          angra
          Partecipante

            Mi rispondo da solo: dovevo mettere LIKE

            If Cells(i, 2) Like "*" & x & "*" Then
            Cells(i, 3) = "OK"

            Ultima cosa: perchè non mi consideri le maiuscole e le minuscole nella ricerca come devo fare?

            Grazie

            #6822 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              Ecco, stavo per farlo notare io.

              Attenzione nell'usare il confronto secco con l'uguale, che bisogna stare attenti a maiuscole e minuscole.

              O riduci tutto in minuscolo (o maiuscolo), così il confronto è pari o usi StrComp con l'opzione vbTextCompare.

              Mi pare che Like sia case sensitive quindi fa differenza tra lettere maiuscole e minuscole.

              #6841 Score: 0 | Risposta

              angra
              Partecipante

                Grazie a entrambi per il tempo e la pazienza

                #6900 Score: 0 | Risposta

                angra
                Partecipante

                  Devi anche tener presente, e gestire, un eventuale click su OK della InputBox SENZA che sia stato inserito alcunchè. La variabile in uscita non è vuota. bensì "**"

                  Un'ultima domanda: come faccio a gestire la variabile d'uscita "**"?

                  Perchè il click su OK senza che venga inserito nessun dato dà il risultato che su ogni riga viene aggiunto OK

                  #6902 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    272 pts

                    Ragioniamo un po':

                    - a quale variabile è associato il risultato dell'inputbox?

                    - proviamo tutti i casi: che valore assume questa variabile se inserisci un valore qualsiasi? e se inserisci uno spazio vuoto? se fai Ok senza inserire niente? se premi Annulla? (per verificare tutto questo metti un msgbox dopo l'inputbox che ti mostri il valore della variabile associata all'inputbox)

                    - finalmente puoi rispondere: come fai a gestire il caso che la variabile di uscita non contenga un valore valido?

                     

                    #6924 Score: 0 | Risposta

                    angra
                    Partecipante

                      Mi hai fatto riflettere che, se metto una lettera a caso, il codice con il LIKE

                      If Cells(i, 2) Like "*" & x & "*" Then
                      Cells(i, 3) = "OK"

                      va a mettere OK a tuttte le celle che contengono quella lettera. Quindi non va bene

                      Tornerò al mio codice originario

                      If Cells(i, 2) = x Then
                      Cells(i, 3) = "OK"

                      spiegando all'utente che deve mettere nell'input box il contenuto esatto della cella che deve ricercare 

                      L'unica cosa che mi rimane da gestire è il fatto che l'utente prema invio senza mettere nessun input

                       

                       

                       

                      #6929 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        272 pts

                        angra wrote:L'unica cosa che mi rimane da gestire è il fatto che l'utente prema invio senza mettere nessun input

                        In x hai il valore di ritorno dell'inputbox.

                        Quando premi Invio senza inserire niente che valore ha la variabile x?

                        Fai la prova piazzando un msgbox "-->" & x & "<--" dopo l'inputbox e vedi cosa succede.

                        #6976 Score: 0 | Risposta

                        angra
                        Partecipante

                          Premendo invio senza inseire niente questo è il valore:

                          msgbox

                           

                           

                          #6993 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            Esattamente!! cosa ne concludi? che valore ha "x" ? (le due frecce contrapposte servivano a dimostrarti che... non c'è niente in mezzo).

                            Quindi: che istruzione devi inserire per gestire una variabile vuota?

                            #6998 Score: 0 | Risposta

                            angra
                            Partecipante

                              <em class="bbp-the-quote-cite">vecchio frac wrote:</em>Esattamente!! cosa ne concludi? che valore ha "x" ? (le due frecce contrapposte servivano a dimostrarti che... non c'è niente in mezzo).

                               

                              Nellla mia limitatissima conoscenza del VBA, inserirei questa funzione

                              If x = isNull Then
                              MsgBox ("NOME NON TROVATO")

                               

                              #6999 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                272 pts

                                Ci sei quasi, nel senso che è giusto che devi testare se la variabile x equivale a qualcosa... ma non utilizzi il "qualcosa" corretto 🙂 e forse ti ho messo fuori strada io (parlando di variabile "vuota")

                                Nel senso che devi verificare non se la variabile sia null (che ha un significato preciso: cioè non contiene alcun valore, e per di più solo i Variant possono essere null) ma che sia una stringa vuota, cioè un tipo di dati stringa senza alcun valore.

                                If x = "" Then MsgBox "Nome non trovato"

                                A questo ti aggiungo per completezza che IsNull è una funzione con parametro quindi il test andrebbe eventualmente fatto così:

                                If IsNull(x) Then ...

                                e inoltre che quando confronti valori di stringa vuoti è meglio sincerarsi che la variabile da confrontare sia davvero vuota e che non contenga eventuali spazi; la forma definitiva e corretta del tuo test è quindi questa:

                                If Trim(x) = "" Then MsgBox "Nome non trovato"

                                Spero di non averti incasinato ulteriormente le cose 🙂

                                #7002 Score: 0 | Risposta

                                angra
                                Partecipante

                                  Ho aggiunto  If x = "" Then MsgBox "Nome non trovato" al mio codice, ma una volta premuto invio senza inseire niente, il meassage box viene ripetuto per 600 volte

                                  Inoltre nelle righe vuote (cioè in cui nella colonna 2 non è scritto alcun dato), viene aggiunto OK nel corrispondente campo della colonna 3

                                  Questo il mio codice:

                                  Sub cerca()
                                  Dim x As String
                                  Dim i As Integer
                                  Dim k As Boolean
                                  
                                  k = False
                                  
                                  x = InputBox("INSERISCI IL NOME CHE VUOI CERCARE")
                                  
                                  For i = 1 To 600
                                  
                                  If x = "" Then MsgBox "Nome non trovato"
                                  If UCase(Cells(i, 2)) = UCase(x) Then
                                  Cells(i, 3) = "OK"
                                  Cells.Find(What:=inpt, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate
                                  k = True
                                  
                                  End If
                                  Next
                                  If k = False Then
                                  MsgBox ("NOME NON TROVATO")
                                  
                                  End If
                                  
                                  
                                  End Sub

                                   

                                  #7003 Score: 0 | Risposta

                                  patel
                                  Moderatore
                                    51 pts

                                    il controllo deve essere fatto prima del ciclo for

                                    Sub cerca()
                                    Dim x As String
                                    Dim i As Integer
                                    Dim k As Boolean
                                    k = False
                                    x = InputBox("INSERISCI IL NOME CHE VUOI CERCARE")
                                    If x = "" Then MsgBox "Nome non inserito": Exit Sub
                                    For i = 1 To 600
                                      If UCase(Cells(i, 2)) = UCase(x) Then
                                        Cells(i, 3) = "OK"
                                        Cells.Find(What:=inpt, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext,       MatchCase:=False).Activate
                                        k = True
                                      End If
                                    Next
                                    If k = False Then
                                      MsgBox ("NOME NON TROVATO")
                                    
                                    End If
                                    End Sub
                                    
                                    
                                    #7009 Score: 0 | Risposta

                                    angra
                                    Partecipante

                                      <em class="bbp-the-quote-cite">patel wrote:</em>il controllo deve essere fatto prima del ciclo for

                                       

                                      Perfetto. Grazie ad entrambi per il supporto

                                       

                                      #7015 Score: 0 | Risposta

                                      vecchio frac
                                      Senior Moderator
                                        272 pts

                                        patel wrote:il controllo deve essere fatto prima del ciclo for

                                        Se ci pensi, è abbastanza logico che sia così.

                                        Devo inserire un valore, se è corretto posso andare avanti, altrimenti mi fermo e segnalo l'errore, prima di iniziare il lavoro lungo che si basa su quel valore.

                                         

                                         

                                        #7024 Score: 0 | Risposta

                                        angra
                                        Partecipante

                                          Adesso mi è chiaro. Lo terrò presente per i prossimi codici

                                        Login Registrati
                                        Stai vedendo 19 articoli - dal 1 a 19 (di 19 totali)
                                        Rispondi a: VBA: ricerca valore
                                        Gli allegati sono permessi solo ad utenti REGISTRATI
                                        Le tue informazioni: