gabri Inserito: 24 giugno 2003 Segnala Inserito: 24 giugno 2003 Salve a tutti!Ho 1 problema con l'istruzione find next in VBA per 1programmino in excel che sto facendo..Quando lancio l'istruzione "find next" il risultato è sempre "Nothing", eppure sono certo che nell'area di ricerca sono presenti!!Se ci fosse qualche esperto in "ascolto" supplico aiuto e allego il codice della parte incriminata.....Grazie in anticipo SalutiPrivate Sub Cerca(ValoreRicerca, AreaRicerca)With Worksheets(\"DATI\") Set f = .Range(\"C5:C25\").Find(Fornitore.Value, LookIn:=xlValues) forn = f.Row FileDaAprire = Cells(forn, 4).Value colsconti = Cells(forn, 6).Value AreaTab = .Cells(forn, 7).ValueEnd WithWorkbooks.Open (FileDaAprire)With Worksheets(1).Range(AreaRicerca) Set c = .Find(ValoreRicerca, LookIn:=xlValues)End WithDo If c Is Nothing Then MsgBox (\"RICERCA ALL'INTERNO DEL LISTINO \" & Fornitore.Value & \" EFFETTUATA\") Exit Sub Else linea = c.Row With Worksheets(1) CodCorr = .Cells(linea, 1) DescrizList = .Cells(linea, 3) ' se è numerico allora prendo direttamente lo sconto If IsEmpty(AreaTab) Then Sconto.Value = .Cells(linea, colsconti) Else ' se sigla cerco la tabella Sconto.Value = Sconta(.Cells(linea, colsconti)) End If PrezzoList.Value = .Cells(linea, 4) Response = MsgBox(CodCorr + \" : \" + DescrizList, vbAbortRetryIgnore, \"Ricerca Prodotto\") If Response = vbIgnore Then Exit Sub End With With Worksheets(1).Range(AreaRicerca) If Response = vbRetry Then Set c = .FindNext© End With If Response = vbAbort Then CodProd.Value = CodCorr Descriz.Value = DescrizList End If End IfLoop While Response = vbRetryEnd Sub
dago_ Inserita: 24 giugno 2003 Segnala Inserita: 24 giugno 2003 With Worksheets("DATI") Set f = .Range("C5:C25").Find(Fornitore.Value, LookIn:=xlValues) forn = f.Row FileDaAprire = Cells(forn, 4).Value colsconti = Cells(forn, 6).Value AreaTab = .Cells(forn, 7).ValueEnd WithSenza il "punto" (.Cells) FileDaAprire e colsconti probabilmente rimangono vuoti.
gabri Inserita: 24 giugno 2003 Autore Segnala Inserita: 24 giugno 2003 ciao Dago (e ciao a tutti...),il problema non è quello, avevo già fatto esperimenti a riguardo e le2 sintassi in questo caso danno lo stesso risultato.Comunque grazie x l'attenta analisi, in ogni caso ora ho aggiunto i punti Il problema è l'elemento "c" che risulta con valora "Nothing" quando eseguo il find next, tra l'altro ho l'impressione che il malfunzionamento sia iniziato da quando ho inserito questa parte: ' se è numerico allora prendo direttamente lo sconto If IsEmpty(AreaTab) Then Sconto.Value = .Cells(linea, colsconti) Else ' se sigla cerco la tabella Sconto.Value = Sconta(.Cells(linea, colsconti)) End If
dago_ Inserita: 24 giugno 2003 Segnala Inserita: 24 giugno 2003 (modificato) If IsEmpty(AreaTab)... significa piu' o meno "Se la variabile e' stata inizializzata...", C'e' qualcosa che non mi torna, perche' questa condizione ? Modificato: 24 giugno 2003 da dago_
gabri Inserita: 24 giugno 2003 Autore Segnala Inserita: 24 giugno 2003 E' 1 discorso1po' lungo...Selezionando il fornitore al quale inviare l'ordine, seleziono la cella un cui ho l'area della tabella codici-sconti per il fornitore stesso.Se x esempio cerco un prodotto fornito da siemens, selezionando SIEMENS nella maschera, carico il link al listino (C:\Documenti\XL0403.xls) e l'area nel mio file excel in cui ho inserito la tabella corrispondenza codici-sconti, quindi AreaTab=B10..C53 e tra quelle celle cercherò il codice corrispondente tramite la funzione Sconta(.Cells(linea,Colsconti), che è bella astrusa anche lei... alcuni fornitori non hanno 1corrispondenza codici-sconti, quindi AreaTab=Empty e vado direttamente a leggere la colonna sconti nel loro listino.Tutto questo fortunatamente funziona..... Siccome la prima volta mi trova tranquillamente il valore richiesto, non capisco perchè con in find next mi dia Nothing in "c", forse il problema è che qualcosa mi annulla il valore di "c"!!!!!!!Oppure che per l'inserimento di qualche istruzione(ho sospetti sugli "With")mi si annulli la possibilità di eseguire il find next tenendo buono lo stesso elemento...Grazie Ancora e...buon pranzo che è ora (se mi passate la rima obbligata)
dago_ Inserita: 24 giugno 2003 Segnala Inserita: 24 giugno 2003 Questo esempio funziona:Sub Cerca()'Listino Siemens XL0603.xls Call ProvaFindNext(\"A1:A30000\", \"6ES7\")End SubSub ProvaFindNext(Area, Codice)Dim ResponseDim ContaWith Worksheets(1).Range(Area) Set c = .Find(Codice, LookIn:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do Conta = Conta + 1 Response = MsgBox(\"Trovato: \" + c.Value + vbCrLf + \"Vuoi continuare ?\" _ , vbYesNo, \"FindNext \" + CStr(Conta)) Set c = .FindNext© If Response <> vbYes Then Exit Sub Loop While Not c Is Nothing And c.Address <> firstAddress End IfEnd WithEnd Sub
gabri Inserita: 24 giugno 2003 Autore Segnala Inserita: 24 giugno 2003 Grandissimo!Grazie1000Ora lo provo e ti faccio sapere se son riuscito ad applicarloPurtroppo non riesco a capire cosa c'e' che non va nel tuo codice.
dago_ Inserita: 24 giugno 2003 Segnala Inserita: 24 giugno 2003 Ho provato con il tuo codice,ho tolto alcune cose altrimenti era troppo una menata,in ogni caso la parte "incriminata" sembra a posto.Private Sub Cerca(AreaRicerca, ValoreRicerca)With Worksheets(1).Range(AreaRicerca) Set c = .Find(ValoreRicerca, LookIn:=xlValues)End WithDo If c Is Nothing Then MsgBox (\"RICERCA ALL'INTERNO DEL LISTINO \" & Fornitore.Value & \" EFFETTUATA\") Exit Sub Else linea = c.Row With Worksheets(1) CodCorr = .Cells(linea, 1) DescrizList = .Cells(linea, 3) ' se è numerico allora prendo direttamente lo sconto If IsEmpty(AreaTab) Then 'Sconto.Value = .Cells(linea, colsconti) Else ' se sigla cerco la tabella 'Sconto.Value = Sconta(.Cells(linea, colsconti)) End If 'PrezzoList.Value = .Cells(linea, 4) Response = MsgBox(CodCorr + \" : \" + DescrizList, vbAbortRetryIgnore, \"Ricerca Prodotto\") Select Case Response Case vbIgnore Exit Sub Case vbRetry Set c = .Range(AreaRicerca).FindNext© Case vbAbort ' End Select End With End IfLoop While Response = vbRetryEnd Sub
gabri Inserita: 24 giugno 2003 Autore Segnala Inserita: 24 giugno 2003 RISOLTO L'ARCANO!Ho notato che la maggiore differenza tra il tuo codice e il mio è che nel mio c'era una giungla di With, worksheets ecc...Evidentemente se sono già in una condizione di with non posso uscire dal "percorso" e usarne un'altra... mi spiego: non è possibile una situazione del genere:With worksheets(1).range(A10..B20)....Sconto=worksheet(1).cells(linea,3)end withEssendo già in un with non posso ripetere nello stesso un altro worksheets, se no si incasina!!!Ora è un po' + pulito...e funzionante DagoThanks thousands again(anche se sicuramente non si dirà così.....)e,tanto che ci siamo, postiamo la soluzione definitiva, così se x caso la reincasino torno nel forum e la riprendo!!! Private Sub Cerca(ValoreRicerca, AreaRicerca)With Worksheets(\"DATI\") Set f = .Range(\"C5:C25\").Find(Fornitore.Value, LookIn:=xlValues) forn = f.Row FileDaAprire = .Cells(forn, 4).Value colsconti = .Cells(forn, 6).Value AreaTab = .Cells(forn, 7).ValueEnd WithWorkbooks.Open (FileDaAprire)With Worksheets(1) Set c = .Range(AreaRicerca).Find(ValoreRicerca, LookIn:=xlValues) Do If c Is Nothing Then MsgBox (\"RICERCA ALL'INTERNO DEL LISTINO \" & Fornitore.Value & \" EFFETTUATA\") Exit Sub Else linea = c.Row CodCorr = .Cells(linea, 1) DescrizList = .Cells(linea, 3) ' se è numerico allora prendo direttamente lo sconto If IsEmpty(AreaTab) Then Sconto.Value = .Cells(linea, colsconti) Else ' se sigla cerco la tabella Sconto.Value = Sconta(.Cells(linea, colsconti)) End If PrezzoList.Value = .Cells(linea, 4) Response = MsgBox(CodCorr + \" : \" + DescrizList, vbAbortRetryIgnore, \"Ricerca Prodotto\") If Response = vbIgnore Then Exit Sub If Response = vbRetry Then Set c = .Range(AreaRicerca).FindNext© If Response = vbAbort Then CodProd.Value = CodCorr Descriz.Value = DescrizList End If End If Loop While Response = vbRetryEnd WithEnd Sub
Claudio Monti Inserita: 24 giugno 2003 Segnala Inserita: 24 giugno 2003 gabri+24 Jun 2003, 03:23 PM-->(gabri @ 24 Jun 2003, 03:23 PM)Ho sentito usare questa espressione:thousand thanks
dago_ Inserita: 24 giugno 2003 Segnala Inserita: 24 giugno 2003 Grazie mille o mille grazie fa lo stesso, un thanks era piu' che sufficiente
nll Inserita: 26 aprile 2004 Segnala Inserita: 26 aprile 2004 se era uno solo... thank (senza "s") basta già, ma gli inglesi usano più di uno (thanks), senza porre limiti al loro numero (si usa anche "thanks a lot")
TRUNC Inserita: 22 febbraio 2006 Segnala Inserita: 22 febbraio 2006 Riprendo questa discussione perchè anch'io sto facendo letteralmente a pugni con il metodo Find, anche se per motivi diversi da quelli di gabri. Il mio codice:Private Sub cbtStartProcess_Click() Dim i1 As Integer Dim i2 As Integer Dim i3 As Integer Dim i4 As Integer Dim i5 As Integer Dim i6 As Integer Dim i7 As Integer Dim s1 As String Dim s2 As String i2 = Me.cbxColumnDataToFind.ListIndex + 1 i3 = Me.cbxColumnToLookIn.ListIndex + 1 i5 = Me.cbxColumnSource.ListIndex + 1 i6 = Me.cbxColumnDestination.ListIndex + 1 i7 = 0 On Error Resume Next For i1 = 2 To rngDataDestination.Rows.Count s1 = rngDataDestination.Cells(i1, i2).Value Err.Clear 'Workbooks(Me.cbxWBSource.Value).Sheets(Me.cbxSheetSource.Value) 'xlWhole i4 = Workbooks(Me.cbxWBSource.Value).Sheets(Me.cbxSheetSource.Value).Columns(i3) _ .Find(What:=s1, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Row '.Activate If Err Then If Me.optEmptyDestination Then rngDataDestination.Cells(i1, i6).Value = "" If Me.optMarkDestination Then With rngDataDestination.Cells(i1, i6).Interior .ColorIndex = 3 .Pattern = xlSolid End With End If If Me.optStopAll Then MsgBox ("Errore: trasferimento dati interrotto alla riga " & i1 & Chr$(13) & _ "Sono stati trasferiti " & i7 & " dati."): Exit Sub Else 'i4 = ActiveCell.Row s2 = rngDataSource.Cells(i4, i5).Value rngDataDestination.Cells(i1, i6).Value = s2 i7 = i7 + 1 End If Next i1 MsgBox "Sono stati trasferiti " & i7 & " dati." Err.ClearEnd Sub
TRUNC Inserita: 18 marzo 2006 Segnala Inserita: 18 marzo 2006 Sono riuscito, o almeno credo, ad "aggirare" il problema di cui al precedente post.In pratica, anche se non so il perchè, il metodo Find ha bisogno di essere "svegliato" applicandolo in modo "semplice" prima di essere usato in modo più elaborato.Ho notato, infatti, che dopo aver copiato, incollato ed eseguito su di un modulo il codice di esempio del metodo Find della guida, tutto prende a funzionare alla grande. Quindi, senza perdere altro tempo, non ho fatto altro che richiamare questa routine subito prima dell'esecuzione della mia subroutine.Chissà cosa penserebbe qualcuno che dovesse vedere il mio programma!!! :ph34r: ... comunque, l'importante è che funzioni. Ciao!
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora