Excel e gli applicativi Microsoft Office [VBA] Cerca con più parametri

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

    Alankanz
    Partecipante

      Salve a tutti,

      Su di un file excel ho una macro collegata ad un button che mi ricerca la pratica su di una colonna (A), può succedere che ci sia un doppione della pratica, e a questo punto mi deve cercare se nella colonna (B) si scritto "no" e restituire solo i dati di quella riga, dove è presente il "no" e non se ci è scritto "si".

      Parto da questo script già scritto in precedenza.

       

      Private Sub CommandButton1_Click()
      Dim ulta As Long
      Dim area As Range
      Dim cella As Range
      With Sheets("Foglio1")
          ulta = .Range("A" & Rows.Count).End(xlUp).Row
          Set area = .Range("A3:A" & ulta)
          Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole)
          If Not cella Is Nothing Then
              riga = cella.Row
              Me.TextBox2.Value = UCase(cella.Offset(0, 1).Value) ' Esito
              Me.TextBox3.Value = UCase(cella.Offset(0, 2).Value) ' Scatolone
              Me.TextBox4.Value = UCase(cella.Offset(0, 3).Value) ' Stanza
              Me.Label9.Caption = UCase(cella.Offset(0, 4).Value) ' Stato
      Me.CommandButton4.Enabled = True
      Me.TextBox2.Enabled = True
      Me.TextBox3.Enabled = True
      Me.TextBox4.Enabled = True
              
          Else
              MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE"
          
          End If
          
      End With
      
      Set area = Nothing
      Set cella = Nothing
      End Sub

       

      Grazie per l'aiuto

      #6808 Score: 0 | Risposta

      Luca73
      Partecipante
        58 pts

        Ciao 

        Confermi che per quasiasi sia il numero di volte che compare una pratica esiste una soloa che contenga No in colonna B?

        Ciao

        Luca

        #6811 Score: 0 | Risposta

        Luca73
        Partecipante
          58 pts

          Ciao

          ho dovuto modificare la tua macro per testarla.

          Usa l'esempio e modificala per tornare all'originale.

          Fammi sapere se fa quanto chiedi.

          Ciao Luca

          Dim ulta As Long
          Dim area As Range
          Dim cella As Range
          Dim firstAddress As String
          With Sheets("Foglio1")
              ulta = .Range("A" & Rows.Count).End(xlUp).Row
              Set area = .Range("A3:A" & ulta)
              area.Select
              Set cella = area.Find(.Range("C1").Value, , xlValues, xlWhole)
              If Not cella Is Nothing Then
              firstAddress = cella.Address
                  Do Until UCase(cella.Offset(0, 1).Text) = "NO"
                      'cella.Select
                      Set cella = area.FindNext(cella)
                      'cella.Select
                      If cella.Address = firstAddress Then Exit Do
                  Loop
                  MsgBox "Trvato"
                  'cella.Select
              Else
                  MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE"
              
              End If
              
          End With
          #6817 Score: 0 | Risposta

          Alankanz
          Partecipante

            Ciao Luca,

             Grazie mille per la risposta

            Ho sostituito con il tuo codice, ma purtroppo non funziona, ho modificato come sotto

            ' Il tuo codice 
            Set cella = area.Find(.Range("C1").Value, , xlValues, xlWhole)
            
            'La mia modifica
            Set cella = area.Find(.Range("B1").Value, , xlValues, xlWhole)

            Ma neanche così funziona.

            Visualizzando con il debug si ferma su

            If Not cella Is Nothing Then

            e mi restituisce a video

            MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE"
            #6823 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              Però non è un errore di codice. Significa che non ha trovato il valore.

              #6832 Score: 0 | Risposta

              Luca73

                 

                Il primo argomento del fine dovrebbe essere il tuo originale che puntava alla textbox se non ricordo male. Io avevo puntato ad una cella per fare delle prove.​

                 

                 

                #6833 Score: 0 | Risposta

                Luca73

                  Find non fine con il cellulare e' un po' incasinato....

                   

                  #6846 Score: 0 | Risposta

                  Alankanz
                  Partecipante

                    Ahahahahah apposto avevo notato ora! ^_^'

                     

                    Allora l'ho fatto girare e con il debug ho notato che cerca il "no" ma poi nella form mi mette il risutato con il "si" che poi è il primo che trova.

                    Spero di essermi spiegato XD

                     

                    Riposto il codice per completezza.

                     

                    Private Sub CommandButton1_Click()
                    Dim ulta As Long
                    Dim area As Range
                    Dim cella As Range
                    Dim firstAddress As String
                    With Sheets("Foglio1")
                        ulta = .Range("A" & Rows.Count).End(xlUp).Row
                        Set area = .Range("A3:A" & ulta)
                        area.Select
                        Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole)
                        If Not cella Is Nothing Then
                            firstAddress = cella.Address
                            Do Until UCase(cella.Offset(0, 1).Text) = "no"
                            Set cella = area.FindNext(cella)
                            If cella.Address = firstAddress Then Exit Do
                            Loop
                            Me.TextBox2.Value = UCase(cella.Offset(0, 1).Value) ' Esito
                            Me.TextBox3.Value = UCase(cella.Offset(0, 2).Value) ' Scatolone
                            Me.TextBox4.Value = UCase(cella.Offset(0, 3).Value) ' Stanza
                            Me.Label9.Caption = UCase(cella.Offset(0, 4).Value) ' Stato
                    Me.CommandButton4.Enabled = True
                    Me.TextBox2.Enabled = True
                    Me.TextBox3.Enabled = True
                    Me.TextBox4.Enabled = True
                            
                        Else
                            MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE"
                        
                        End If
                        
                    End With
                    
                    Set area = Nothing
                    Set cella = Nothing
                    End Sub

                     

                    Grazie ancora per la pazienza

                    #6849 Score: 0 | Risposta

                    Alankanz
                    Partecipante

                      Ho provato sostituendo 

                       If cella.Address = firstAddress Then Exit Do

                      con

                       If cella.Address <> firstAddress Then Exit Do

                       

                      Sembra funzionare, ma è corretto?

                      #6850 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        272 pts

                        Di passaggio noto un'anomalia:

                        Do Until UCase(cella.Offset(0, 1).Text) = "no"

                        significa "esegui il loop a meno che il testo della prima cella a destra, RESO MAIUSCOLO, sia uguale a 'no' (MINUSCOLO!)".

                        Quindi mi sembra che il loop venga eseguito sempre, perchè "NO" è diverso da "no" 🙂

                        Perciò una possibile modifica da fare è la seguente, il che mi sembra dia poi un risultato corretto:

                        Do Until LCase(cella.Offset(0, 1).Text) = "no"

                        #6855 Score: 0 | Risposta

                        Alankanz
                        Partecipante

                          Ah ecco! Grazie mille!!!

                          #8365 Score: 0 | Risposta

                          Alankanz
                          Partecipante

                            Sono di nuovo a scrivervi, per un problema su questo script!

                             

                            Non mi prende valori con la virgola ho numeri pratica multipli, esempio della 123456 può esistere la 123456,01 e 123456,02 così com'è lo script si blocca e non mi restituisce nulla, non sapendo come fare mi rimetto alla vostra sapienza! =)

                             

                             

                            Grazie in anticipo

                            #8376 Score: 0 | Risposta

                            vecchio frac
                            Senior Moderator
                              272 pts

                              Alankanz ha scritto:

                              si blocca e non mi restituisce nulla

                              Qual è l'errore che ricevi? in che punto del codice? alleghi un esempio?

                              #8386 Score: 0 | Risposta

                              Luca73
                              Partecipante
                                58 pts

                                Ciao

                                Per capirci tu scrivi 123456  e vuoi che ti trovi 123456,01  e anche 123456,02....?

                                Nell'istruzione di ricerca

                                Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole)

                                L'ultimo parametro fa si che tu cerci per tutto il contenuto della cella e quindi i contenuti devono essere esattamente identici

                                Potresti eliminarlo oppure provare con

                                Set cella = area.Find(Me.TextBox1.Value & "*", , xlValues, xlWhole)
                                
                                #8391 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  272 pts

                                  Fosse così io userei xlPart invece che xlWhole.

                                  Ma non sono certo che sia così, per questo chiedevo esempio 🙂

                                  #8392 Score: 0 | Risposta

                                  Alankanz
                                  Partecipante

                                    Eccolo allegato.

                                    Nel Debug mi seleziona questo pezzo di codice

                                    firstAddress = cella.Address

                                     

                                    Allegati:
                                    You must be logged in to view attached files.
                                    #8394 Score: 0 | Risposta

                                    Luca73
                                    Partecipante
                                      58 pts

                                      Ciao

                                      Ci avevo pensato anche io però dipende da come sono i dati e che tipo di ricerca vuole fare.

                                      concordo sull'esempio.

                                      #8395 Score: 0 | Risposta

                                      Alankanz
                                      Partecipante

                                        Luca73 ha scritto:

                                        Ciao

                                        Ciao,

                                         

                                        Grazie per la risposta.

                                        Nono io voglio cercare puntuale, tanto se ha lo ,01 o ,02 quella intera non esiste.

                                         

                                        #8397 Score: 0 | Risposta

                                        vecchio frac
                                        Senior Moderator
                                          272 pts

                                          La butto lì, ma bisognerebbe vedere una riga dati reale, forse nella textbox metti il punto ma in Excel c'è una virgola nella cella. Non puoi cambiare separatore e mettere ad esempio un trattino?

                                          #8399 Score: 0 | Risposta

                                          Alankanz
                                          Partecipante

                                            Ecco un file d'esempio

                                            Allegati:
                                            You must be logged in to view attached files.
                                            #8404 Score: 0 | Risposta

                                            vecchio frac
                                            Senior Moderator
                                              272 pts

                                              Il problema nel codice relativo all'errore evidenziato è qui:

                                              Dim firstAddress As Range

                                              1) perchè?

                                              2) e come si corregge?

                                              Per quanto riguarda la ricerca di numeri con virgola, il ragionamento invece è più complesso e magari lo faccio a parte.

                                              #8405 Score: 0 | Risposta

                                              vecchio frac
                                              Senior Moderator
                                                272 pts

                                                vecchio frac ha scritto:

                                                nella textbox metti il punto ma in Excel c'è una virgola nella cella

                                                Avevo ragione, un punto per me 🙂

                                                #8406 Score: 0 | Risposta

                                                vecchio frac
                                                Senior Moderator
                                                  272 pts

                                                  Sostituisci

                                                  Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole)

                                                  con

                                                  Set cella = area.Find(Replace(Me.TextBox1.Value, ",", "."), , xlValues, xlWhole)

                                                  Poiché Excel utilizza il punto internamente come separatore decimale, quello che viene passato dalla textbox al find per la ricerca deve rispettare tale notazione. Anche se Excel visualizza un numero con virgola, "dentro" lo tratta come un testo col punto al posto della virgola. Quindi al find devi passare un valore che, se scritto con la virgola, deve ricevere invece un punto. Non preoccuparti che poi restituirà il valore giusto, con la virgola 🙂

                                                  Comunque il codice ha qualche errorino... sto cercando di aggiustarlo.

                                                  Inoltre non serve scrivere due volte lo stesso codice, quando intercetti il Keydown puoi richiamare lo stesso codice del commandbutton e sei a posto 🙂

                                                  #8407 Score: 0 | Risposta

                                                  vecchio frac
                                                  Senior Moderator
                                                    272 pts

                                                    Il codice che ripropongo è questo, se non ho frainteso le esigenze.

                                                    Private Sub CommandButton1_Click()
                                                    Dim ulta As Long
                                                    Dim area As Range
                                                    Dim cella As Range
                                                    Dim firstAddress As String
                                                        TextBox2 = ""
                                                        TextBox3 = ""
                                                        TextBox4 = ""
                                                        With Sheets("Foglio1")
                                                            ulta = .Range("A" & Rows.Count).End(xlUp).Row
                                                            Set area = .Range("A2:A" & ulta)
                                                            Set cella = area.Find(Replace(TextBox1, ",", "."), , xlValues, xlWhole)
                                                            If Not cella Is Nothing Then
                                                                firstAddress = cella.Address
                                                                Do
                                                                    Set cella = area.FindNext(cella)
                                                                    If cella Is Nothing Or LCase(cella.Offset(0, 1).Text) = "no" Then Exit Do
                                                                Loop While firstAddress <> cella.Address
                                                                
                                                                If LCase(cella.Offset(0, 1).Text) = "no" Then
                                                                    TextBox2 = UCase(cella.Offset(0, 1)) ' Esito
                                                                    TextBox3 = UCase(cella.Offset(0, 2)) ' Scatolone
                                                                    TextBox4 = UCase(cella.Offset(0, 3)) ' Stanza
                                                                    Label9.Caption = UCase(cella.Offset(0, 4)) ' Stato
                                                                    CommandButton4.Enabled = True
                                                                    TextBox2.Enabled = True
                                                                    TextBox3.Enabled = True
                                                                    TextBox4.Enabled = True
                                                                Else
                                                                    MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE"
                                                                End If
                                                            Else
                                                                MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE"
                                                            
                                                            End If
                                                        End With
                                                    
                                                        Set area = Nothing
                                                        Set cella = Nothing
                                                    End Sub
                                                    
                                                    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
                                                        If KeyCode = 13 Then Call CommandButton1_Click
                                                    End Sub
                                                    #8419 Score: 0 | Risposta

                                                    Alankanz
                                                    Partecipante

                                                      Grazie mille per tutte le spiegazioni, le trovo molto utili per aumentare la mia conoscenza nel linguaggio VBA.

                                                       

                                                      Ho sostituito tutto come mi hai scritto, ma non mi trova quelle con la virgola mi restituisce MsgBox Nessun valore corrispondente al criterio di ricerca.    

                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 27 totali)
                                                    Rispondi a: [VBA] Cerca con più parametri
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: