errore nel metodo Find



  • errore nel metodo Find
    di beppexile data: 27/11/2015 11:26:27

    Salve ragazzi, qualcuno mi potrebbe spiegare in maniera semplice come utilizzare il metodo Find?
    In pratica ho un'elenco dati associato su una userform ad una combobox, selezionando una voce nella Combobox, deve iniziare un ciclo di ricerca e trovarmi l'indirizzo della cella in cui è contenuta quella voce.
    Le voci sono tutte diverse, la colonna in cui sono contenute le voci è la colonna D, e la combobox prende i dati da un'altro elenco in un'altro foglio.
    Ho ipotizzato il codice in basso, ma mi restituisce il seguente errore sulla riga del Find:
    "Errore di run-time 1004: Errore definito dall'applicazione o dall'oggetto.
    Ci ho gia perso la mattina ama non riesco a capire dove sbaglio.
    Ho controllato un milione di guide sul Find, e mi sembra di averlo applicato bene.
    Ho provato a cambiare dichiarazione del tipo di dato per prodotto e per h, ma nulla da fare.
     
     
    Sub CercA()
    Dim prodotto As Variant
    Dim h As Variant
    p = ComboBox1.Text
    h = Range("D7:D500").Find(what:=prodotto , LookIn:=xlValues, LookAt:=xlWhole).Address
    h = Range("A1").Value
    End Sub



  • di scossa data: 27/11/2015 11:55:06

    cit.: "Ho controllato un milione di guide sul Find, e mi sembra di averlo applicato bene."

    Ciao,

    se mettessi in pratica il consiglio, scritto in millemila post in millemila forum, di usare Option Explicit lo scopriresti subito ......


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di alfrimpa data: 27/11/2015 11:59:59

    Ciao Beppe

    Nel tuo codice dichiari una variabile Prodotto ma poi non dici a cosa questa deve essere uguale.

    Anche se non ci fosse stato l'errore la tua macro, così come è scritta non fa nulla.

    Giusto per darti uno spunto (ovviamente da adattare al tuo caso) ti propongo la macro qui sotto.

    Se hai bisogno d'altro sono qua.

    Alfredo
     
    Sub cerca()
    Dim rng As Range
    Dim parola As String
    Dim val As String
    Set rng = Worksheets("Foglio2").Range("a1:a4")
    parola = InputBox("Immettere valore")
    val = rng.Find(parola, LookAt:=xlWhole).Address(0, 0)
    MsgBox val
    End Sub
    






  • di beppexile data: 27/11/2015 13:00:51

    Scusami, avevo sbagliato a scrivere....

    Applico il tuo codice è ti faccio sapere. La cosa strana è che il mio codice, in determinate occasioni, funziona, ma non capisco quali sono queste occasioni particolari!

    Aggiungo una comanda sull'utilizzo del Set:
    a fine istruzioni non conviene mettere rng=Nothing?
     
    Sub CercA()
    Dim prodotto As Variant
    Dim h As Variant
    prodotto = ComboBox1.Text
    h = Range("D7:D500").Find(what:=prodotto , LookIn:=xlValues, LookAt:=xlWhole).Address
    h = Range("A1").Value
    End Sub



  • di scossa data: 27/11/2015 13:11:54

    cit.: "Nel tuo codice dichiari una variabile Prodotto ma poi non dici a cosa questa deve essere uguale."

    Io cercavo di spronarlo ad imparare a pescare, tu gli hai dato il pesce .....

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee.
    (George Bernard Shaw)



  • di beppexile data: 27/11/2015 13:20:16

    Non mi funziona nemmeno il tuo codice!

    Ho allegato il file (che poi è sempre lo stesso);
    per arrivare al punto con l'errore, sulla prima scheda Ricevimento, clicca sul tasto "MODALITA' MODIFICA" in alto e poi clicca su una riga qualsiasi della listbox in basso; in pratica i valori del lotto selezionato si dovrebbero caricare nelle textbox in alto per permettere all'utente la modifica.

    Come vedrai questa sub e divisa in due parti quasi identiche, una eseguita quando il tasto "MODALITA' MODIFICA" è premuto e l'altra quando non è premuto ma si seleziona un prodotto dalla combo dedicata.

    La cosa buffa è che la prima parte funziona, mentre la seconda no.

    Ecco di seguito la sub in questione:
     
            Sub Genera_Date_C()
                Dim d As Variant
                Dim p As Variant
                Dim h As Variant
                Dim dtrip, dtprelav, dtlav, dtasc, dtprestg, dtstg, dtsug, dtsca As Variant
                Dim ggrip, ggprelav, gglav, ggasc, ggprestg, ggstg, ggsug, ggsca As Variant
    'PRIMA PARTE FUNZIONANTE            
                If UserForm1.ToggleButton1.Value = False Then
                    d = UserForm1.DataLotto.Value
                    p = UserForm1.ComboBox_Prodotto_C.Value
                    If p <> "" Then
                        Workbooks(FILE_LAVORO).Worksheets("LISTE").Select
    '                    On Error Resume Next
                            h = Range("D7:D500").Find(what:=p, LookIn:=xlValues, LookAt:=xlWhole).Address
                            ggrip = Range(h).Offset(0, 1).Value
                            ggprelav = Range(h).Offset(0, 2).Value
                            gglav = Range(h).Offset(0, 3).Value
                            ggasc = Range(h).Offset(0, 4).Value
                            ggprestg = Range(h).Offset(0, 5).Value
                            ggstg = Range(h).Offset(0, 6).Value
                            ggsug = Range(h).Offset(0, 7).Value
                            ggsca = Range(h).Offset(0, 8).Value
                            dtrip = d + ggrip
                            dtprelav = dtrip + ggprelav
                            dtlav = dtprelav + gglav
                            dtasc = dtlav + ggasc
                            dtprestg = dtasc + ggprestg
                            dtstg = dtprestg + ggstg
                            dtsug = dtstg + ggsug
                            dtsca = dtsug + ggsca
                            Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                            Range("PARK_DATA_RIP").Value = dtrip
                            Range("PARK_DATA_PRELAV").Value = dtprelav
                            Range("PARK_DATA_LAV").Value = dtlav
                            Range("PARK_DATA_ASC").Value = dtasc
                            Range("PARK_DATA_PRESTG").Value = dtprestg
                            Range("PARK_DATA_STG").Value = dtstg
                            Range("PARK_DATA_SUG").Value = dtsug
                            Range("PARK_DATA_SCA").Value = dtsca
    '                    Resume
                    End If
    'SECONDA PARTE CON ERRORE 
                ElseIf UserForm1.ToggleButton1.Value = True Then
                    d = UserForm1.TB_DataLotto_Bis.Value
                    p = UserForm1.ComboBox_Prodotto_C.Value
                    If p <> "" Then
                        Workbooks(FILE_LAVORO).Worksheets("LISTE").Select
    '                    On Error Resume Next
                            h = Range("D7:D500").Find(what:=p, LookIn:=xlValues, LookAt:=xlWhole).Address 'ERRORE?
                            ggrip = Range(h).Offset(0, 1).Value
                            ggprelav = Range(h).Offset(0, 2).Value
                            gglav = Range(h).Offset(0, 3).Value
                            ggasc = Range(h).Offset(0, 4).Value
                            ggprestg = Range(h).Offset(0, 5).Value
                            ggstg = Range(h).Offset(0, 6).Value
                            ggsug = Range(h).Offset(0, 7).Value
                            ggsca = Range(h).Offset(0, 8).Value
                            dtrip = d + ggrip
                            dtprelav = dtrip + ggprelav
                            dtlav = dtprelav + gglav
                            dtasc = dtlav + ggasc
                            dtprestg = dtasc + ggprestg
                            dtstg = dtprestg + ggstg
                            dtsug = dtstg + ggsug
                            dtsca = dtsug + ggsca
                            Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                            Range("PARK_DATA_RIP").Value = dtrip
                            Range("PARK_DATA_PRELAV").Value = dtprelav
                            Range("PARK_DATA_LAV").Value = dtlav
                            Range("PARK_DATA_ASC").Value = dtasc
                            Range("PARK_DATA_PRESTG").Value = dtprestg
                            Range("PARK_DATA_STG").Value = dtstg
                            Range("PARK_DATA_SUG").Value = dtsug
                            Range("PARK_DATA_SCA").Value = dtsca
    '                    Resume
                    End If
                End If
                Set d = Nothing
                Set p = Nothing
                Set h = Nothing
                Set dtrip = Nothing
                Set dtprelav = Nothing
                Set dtlav = Nothing
                Set dtasc = Nothing
                Set dtprestg = Nothing
                Set dtstg = Nothing
                Set dtsug = Nothing
                Set dtsca = Nothing
                Set ggrip = Nothing
                Set ggprelav = Nothing
                Set gglav = Nothing
                Set ggasc = Nothing
                Set ggprestg = Nothing
                Set ggstg = Nothing
                Set ggsug = Nothing
                Set ggsca = Nothing
            End Sub



  • di alfrimpa data: 27/11/2015 13:48:58

    Mi spiace ma se cerco di aprire il tuo file mi dice che sul mio computer non sono disponibili oggetti che evidentemente tu hai usato.

    Alfredo





  • di beppexile data: 27/11/2015 15:41:14

    cit. scossa: "Ciao, se mettessi in pratica il consiglio, scritto in millemila post in millemila forum, di usare Option Explicit lo scopriresti subito ...... "

    Non avevo notato per niente questo tuo post. Scusami
    Option Explicit ormai ho imparato ad usarlo, avevo semplicemente omesso il codice, che per semplificarlo, lo avevo scritto in diretta semplificando le diciture usate, e nel semplificare avevo dimenticato di cambiare
    "p = ComboBox1.Text"
    in
    "prodotto = ComboBox1.Text"

    cit. alfrimpa: Mi spiace ma se cerco di aprire il tuo file mi dice che sul mio computer non sono disponibili oggetti che evidentemente tu hai usato.

    Grazie lo stesso, attenderò qualche altro consiglio.



  • di beppexile data: 30/11/2015 12:46:46

    Salve ragazzi, ho ancora lo stesso problema... non riesco a capire cosa ci sia di sbagliato.



  • di Cucù data: 30/11/2015 14:20:14

    @ Tutti

    Volevo solo sottolineare una cosa fondamentale:
    il metodo find restituisce una valore di tipo Range



  • di beppexile data: 02/12/2015 14:12:49

    cit. Cucù: Volevo solo sottolineare una cosa fondamentale:
    il metodo find restituisce una valore di tipo Range

    Quindi, sto sbagliando qualcosa?



  • di beppexile data: 04/12/2015 15:34:10

    Alla fine credo di aver risolto trasformando il metodo Find in un ciclo for.
     
            Sub Genera_Date_C()
                Dim d As Date
                Dim p As Variant
                Dim h, i As Variant
                Dim dtrip, dtprelav, dtlav, dtasc, dtprestg, dtstg, dtsug, dtsca As Variant
                Dim ggrip, ggprelav, gglav, ggasc, ggprestg, ggstg, ggsug, ggsca As Variant
                Application.ScreenUpdating = False
                p = UserForm1.ComboBox_Prodotto_C.Text
                If UserForm1.ToggleButton1.Value = False Then
                    d = UserForm1.DataLotto.Value
                    If p <> "" Then
                        Workbooks(FILE_LAVORO).Activate
                            For i = 7 To 500
                                If Worksheets("LISTE").Range("D" & i).Value = p Then
                                    h = Worksheets("LISTE").Range("D" & i).Address
                                    ggrip = Worksheets("LISTE").Range(h).Offset(0, 1).Value
                                    ggprelav = Worksheets("LISTE").Range(h).Offset(0, 2).Value
                                    gglav = Worksheets("LISTE").Range(h).Offset(0, 3).Value
                                    ggasc = Worksheets("LISTE").Range(h).Offset(0, 4).Value
                                    ggprestg = Worksheets("LISTE").Range(h).Offset(0, 5).Value
                                    ggstg = Worksheets("LISTE").Range(h).Offset(0, 6).Value
                                    ggsug = Worksheets("LISTE").Range(h).Offset(0, 7).Value
                                    ggsca = Worksheets("LISTE").Range(h).Offset(0, 8).Value
                                    dtrip = d + ggrip
                                    dtprelav = dtrip + ggprelav
                                    dtlav = dtprelav + gglav
                                    dtasc = dtlav + ggasc
                                    dtprestg = dtasc + ggprestg
                                    dtstg = dtprestg + ggstg
                                    dtsug = dtstg + ggsug
                                    dtsca = dtsug + ggsca
                                    Worksheets("DATABASE").Range("PARK_DATA_RIP").Value = dtrip
                                    Worksheets("DATABASE").Range("PARK_DATA_PRELAV").Value = dtprelav
                                    Worksheets("DATABASE").Range("PARK_DATA_LAV").Value = dtlav
                                    Worksheets("DATABASE").Range("PARK_DATA_ASC").Value = dtasc
                                    Worksheets("DATABASE").Range("PARK_DATA_PRESTG").Value = dtprestg
                                    Worksheets("DATABASE").Range("PARK_DATA_STG").Value = dtstg
                                    Worksheets("DATABASE").Range("PARK_DATA_SUG").Value = dtsug
                                    Worksheets("DATABASE").Range("PARK_DATA_SCA").Value = dtsca
                                End If
                            Next
                    End If
                ElseIf UserForm1.ToggleButton1.Value = True Then
                    d = UserForm1.TB_DataLotto_Bis.Value
                    If p <> "" Then
                        Workbooks(FILE_LAVORO).Activate
                            For i = 7 To 500
                                If Worksheets("LISTE").Range("D" & i).Value = p Then
                                    h = Worksheets("LISTE").Range("D" & i).Address
                                    ggrip = Worksheets("LISTE").Range(h).Offset(0, 1).Value
                                    ggprelav = Worksheets("LISTE").Range(h).Offset(0, 2).Value
                                    gglav = Worksheets("LISTE").Range(h).Offset(0, 3).Value
                                    ggasc = Worksheets("LISTE").Range(h).Offset(0, 4).Value
                                    ggprestg = Worksheets("LISTE").Range(h).Offset(0, 5).Value
                                    ggstg = Worksheets("LISTE").Range(h).Offset(0, 6).Value
                                    ggsug = Worksheets("LISTE").Range(h).Offset(0, 7).Value
                                    ggsca = Worksheets("LISTE").Range(h).Offset(0, 8).Value
                                    dtrip = d + ggrip
                                    dtprelav = dtrip + ggprelav
                                    dtlav = dtprelav + gglav
                                    dtasc = dtlav + ggasc
                                    dtprestg = dtasc + ggprestg
                                    dtstg = dtprestg + ggstg
                                    dtsug = dtstg + ggsug
                                    dtsca = dtsug + ggsca
                                    Worksheets("DATABASE").Range("PARK_DATA_RIP").Value = dtrip
                                    Worksheets("DATABASE").Range("PARK_DATA_PRELAV").Value = dtprelav
                                    Worksheets("DATABASE").Range("PARK_DATA_LAV").Value = dtlav
                                    Worksheets("DATABASE").Range("PARK_DATA_ASC").Value = dtasc
                                    Worksheets("DATABASE").Range("PARK_DATA_PRESTG").Value = dtprestg
                                    Worksheets("DATABASE").Range("PARK_DATA_STG").Value = dtstg
                                    Worksheets("DATABASE").Range("PARK_DATA_SUG").Value = dtsug
                                    Worksheets("DATABASE").Range("PARK_DATA_SCA").Value = dtsca
                                End If
                            Next
                    End If
                End If
                Application.ScreenUpdating = True
                Set i = Nothing
                Set p = Nothing
                Set h = Nothing
                Set dtrip = Nothing
                Set dtprelav = Nothing
                Set dtlav = Nothing
                Set dtasc = Nothing
                Set dtprestg = Nothing
                Set dtstg = Nothing
                Set dtsug = Nothing
                Set dtsca = Nothing
                Set ggrip = Nothing
                Set ggprelav = Nothing
                Set gglav = Nothing
                Set ggasc = Nothing
                Set ggprestg = Nothing
                Set ggstg = Nothing
                Set ggsug = Nothing
                Set ggsca = Nothing
            End Sub