Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel]Find is Nothing ma non dovrebbe esserlo

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Zannando » 13/11/12 09:51

Io lavoro con un office 2007, e con il codice che segue avrei voluto riempire una textbox, rinominata come indirizzo, con un contenuto plausibile.
Nel caso in cui si abbia a che fare con una cella della colonna indirizzo piena non si incontrano problemi ma nel momento in cui si dovrebbe ricercare l'alternativa fondamentalmente questo non avviene.

L'alternativa dovrebbe corrispondere alla casella sulla colonna 5 ,indirizzi, sulla riga corrispondente ad un soggetto con lo stesso cognome, esso dovrebbe essere trovato selezionando la colonna 1, Cognomi, escludendo la "Linea" del soggetto iniziale.

Il problema è che il risultato della ricerca pare essere sempre nullo (Nothing), come mai?

Per aiutarvi ad inquadrare il problema vi dico che la tabella di origine dei dati è costituita da 5 colonne rispettivamente: Cognome, Nome, Data di nascita, Luogo di nascita e Indirizzo

Codice: Seleziona tutto
Private Sub Indirizzo_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Linea = ActiveCell.Row
'MsgBox Str(Linea)
If Cells(Linea, 5) = "" Then
Lineasup = Str(Linea) - 1
Lineainf = Str(Linea) + 1
'MsgBox Str(Lineasup)
Cognome = Cells(Linea, 1)
'MsgBox Cognome
c1 = Cells(Lineasup, 1)
c2 = Cells(3, 1)
c3 = Cells(50, 1)
c4 = Cells(Lineainf, 1)
If Not Worksheets("Dati completi").Range("c2:c1", "c3:c4").Find(What:=Cognome, LookIn:=xlValues) Is Nothing Then
Worksheets("Dati completi").Range("c2:c1", "c3:c4").Find(What:=Cognome, LookIn:=xlValues).Activate
G = ActiveCell.Row
'MsgBox Str(G)
Indirizzo = Cells(G, 5)
End If
Else
Indirizzo = Cells(Linea, 5)
End If
End Sub
Win 7 - Office 2007
Zannando
Utente Junior
 
Post: 11
Iscritto il: 13/11/12 08:59

Sponsor
 

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Anthony47 » 13/11/12 11:20

Ciao Zannando, benvenuto nel forum.
Prima di approfondire il contenuto della macro ti chiedo:
fondamentalmente la tua macro esegue un Cerca di un Cognome nelle celle C1:C4
a) i tuoi Cognomi sono in Colonna C?
b) la ricerca e' volutamente eseguita solo su quelle 4 celle?

Poi, per una migliore analisi puoi allegare un esempio di dati su cui ragionare congiuntamente? Per come fare guarda qui: viewtopic.php?f=26&t=80395
Inoltre, ragionando sui dati pubblicati, dovresti nuovamente descrivere la logica che stai cercando di realizzare.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Zannando » 13/11/12 12:33

No, la ricerca non voleva essere quella, si trattava solo di una sostituzione "ignorante", ora quel problema ho cercato di sistemarlo ma mi compare l'errore 10045.

Codice: Seleziona tutto
Private Sub indirizzo_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Linea = ActiveCell.Row
If Cells(Linea, 5) = "" Then
Lineasup = Str(Linea) - 1
Lineainf = Str(Linea) + 1
Cognome = Cells(Linea, 1)
cell1 = Cells(Lineasup, 1)
cell2 = Cells(3, 1)
cell3 = Cells(50, 1)
cell4 = Cells(Lineainf, 1)
If Not Range("cell2:cell1", "cell3:cell4").Find(What:=Cognome, LookIn:=xlValues) Is Nothing Then
Range("cell2:cell1", "cell3:cell4").Find(What:=Cognome, LookIn:=xlValues).Activate
Gino = ActiveCell.Row
Indirizzo = Cells(Gino, 5)
End If
Else
Indirizzo = Cells(Linea, 5)
End If
End Sub


Qui un file simile
Win 7 - Office 2007
Zannando
Utente Junior
 
Post: 11
Iscritto il: 13/11/12 08:59

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Anthony47 » 13/11/12 15:12

Ok il file, ma (perdona) la macro mi sembra piu' confusa di prima.
Puoi descrivere che cosa vorresti fare, partendo dai dati che hai pubblicato?

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Zannando » 13/11/12 15:39

questa macro si attiva quando clicco sulla casella di testo della userform è ha come obiettivo quello di inserire un possibile idirizzo collegato al soggetto che potrà essere confermato o modificato.

Entrando nel codice

Private Sub indirizzo_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Linea = ActiveCell.Row
'in questo modo definisco su quale riga si trova la persona di cui voglio supporre l'indirizzo
If Cells(Linea, 5) = "" Then
'Qui invece dico di intervenire a cercare un indirizzo differente da quello più plausibile ovvero quello situato sulla stessa linea del 'soggetto solo se la cella dove dovrebbe essere l'indirizzo è vuota.
'Di seguito comincio a definire alcuni oggetti che mi potranno essere utili dopo

Lineasup = Str(Linea) - 1
Lineainf = Str(Linea) + 1
Cognome = Cells(Linea, 1)
cell1 = Cells(Lineasup, 1)
cell2 = Cells(3, 1)
cell3 = Cells(50, 1)
cell4 = Cells(Lineainf, 1)

'Quindi dichiaro di voler fare una ricerca del cognome del soggetto sulla linea dei cognomi per una cinquantina di righe escludendo quella iniziale, questo perché se hanno lo stesso cognome è probabile siano fratelli e vivano allo stesso indirizzo

If Not Range("cell2:cell1", "cell3:cell4").Find(What:=Cognome, LookIn:=xlValues) Is Nothing Then
Range("cell2:cell1", "cell3:cell4").Find(What:=Cognome, LookIn:=xlValues).Activate
Gino = ActiveCell.Row
Indirizzo = Cells(Gino, 5)
End If

Else 'quindi termino il primo "periodo ipotetico"
Indirizzo = Cells(Linea, 5)
End If
End Sub
Win 7 - Office 2007
Zannando
Utente Junior
 
Post: 11
Iscritto il: 13/11/12 08:59

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Anthony47 » 13/11/12 16:28

Ti ringrazio per questi commenti; ma siccome la macro NON FA quello che hai in mente di fare non mi consentono di capire che cosa stai cercando di fare.
Rilevo comunque che certamente c' e' un problema nelle istruzioni che usano ad esempio "cell2:cell1" perche' questa e' una stringa che non somiglia per niente un valido indirizzo di celle.
Se vuoi indirizzare mettiamo 10 celle prima e 10 celle dopo la riga corrente, in colonna A userai qualcosa come
Range("A" & Inizio & ":A" & Fine)
Avrai prima calcolato Inizio e Fine, ad esempio:
Codice: Seleziona tutto
Inizio = RigaCorrente - 10
Se Inizio<1 Allora Inizio = 1

Fine = RigaCorrente +10
(Sono istruzioni di principio)

Se con questo spunto non risolvi allora riprova ancora a spiegare come riprodurre il problema e che ragionamenti vorresti fare per risolverlo.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Zannando » 13/11/12 18:38

Ok infatti il problema stava lì, solo che mi serviva una selezione con intervalli separati e pensavo di risolvere il problema nel modo sbagliato...grazie, per essermi stato dietro nonostante la poca chiarezza.

eccovi la mia soluzione
Codice: Seleziona tutto
Private Sub indirizzo_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Linea = ActiveCell.Row
If Cells(Linea, 5) = "" Then
Lineasup = Str(Linea) - 1
Lineainf = Str(Linea) + 1
cognome = Cells(Linea, 1)
Dim Unione As Range, t1 As Range, t2 As Range
Worksheets("Dati completi").Activate
Set t1 = Range("A3:A" & Lineasup)
Set t2 = Range("A" & Lineainf & ":A50")
Set Unione = Union(t1, t2)
If Not Unione.Find(What:=cognome, LookIn:=xlValues) Is Nothing Then
Unione.Find(What:=cognome, LookIn:=xlValues).Activate
Gino = ActiveCell.Row
Indirizzo = Cells(Gino, 5)
End If
Else
Indirizzo = Cells(Linea, 5)
End If
End Sub
Win 7 - Office 2007
Zannando
Utente Junior
 
Post: 11
Iscritto il: 13/11/12 08:59

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Anthony47 » 13/11/12 23:49

Ok.
Se vuoi semplificarti la vita puoi dimenticarti Lineasup, Lineainf, Unione, t1, t2 e invece di Unione.Find puoi usare Range("A3:A50").Find; perche' questa e' la traduzione di quanto ora usi.

Mi permetto anche di suggerire di non usare l' evento MouseUp per popolare i controlli della userform, ma piuttosto TextBoxXYZ_Enter; in questo modo la macro scatterebbe anche se "arrivi" nel textbox per vie che non sia il puntatore del mouse.
Inoltre io userei l' evento UserForm_Activate per popolare tutti i campi (nel caso di selezione di una persona gia' in elenco) o per azzerarli tutti (se nominativo non in elenco)

Ma, non conoscendo il tuo flusso di lavorazione, sono suggerimenti generici.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Zannando » 14/11/12 00:19

Non so perché ma se faccio quello che tu dici sostituendo "Unione" non fa più quello che dovrebbe in particolar modo se il tipo che sto cercando si trova più in alto di suo fratello, in tal caso infatti la macro non è più in grado di trovarlo.

Per quanto riguarda gli altri due suggerimenti, in effetti potranno essermi utili, anche se devo trovare il modo per evitare che l'enter mi cancelli un contenuto appena modificato, ho ancora tanto da imparare ;-)
Grazie ancora
Win 7 - Office 2007
Zannando
Utente Junior
 
Post: 11
Iscritto il: 13/11/12 08:59

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Anthony47 » 14/11/12 12:56

Nel mio test la ricerca viene regolarmente effettuata; ad esempio introducendo un nuovo nominativo con cognome gia' in elenco:
Immagine

Uploaded with ImageShack.us

Il codice usato e'
Codice: Seleziona tutto
Private Sub indirizzo_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Linea = ActiveCell.Row
If Cells(Linea, 5) = "" Then
'    Lineasup = Str(Linea) - 1
'    Lineainf = Str(Linea) + 1
    cognome = Cells(Linea, 1)
'    Dim Unione As Range, t1 As Range, t2 As Range
    Worksheets("Dati completi").Activate
'    Set t1 = Range("A3:A" & Lineasup)
'    Set t2 = Range("A" & Lineainf & ":A50")
'    Set Unione = Union(t1, t2)
       
    If Not Range("A3:A50").Find(What:=cognome, LookIn:=xlValues) Is Nothing Then
        Range("A3:A50").Find(What:=cognome, LookIn:=xlValues).Activate
        Gino = ActiveCell.Row
        Indirizzo = Cells(Gino, 5)
    End If
Else
    Indirizzo = Cells(Linea, 5)
End If
End Sub
Le righe precedure dall' apostrofo sono tutte escluse.

Ricordo che se vuoi cercare all' interno di "tutti" i cognomi puoi usare invece di Range("A3:A50") una cosa piu' articolata che appunto finisce all' ultima riga usata di colonna A; ad esempio
Codice: Seleziona tutto
Range(Range("A3"), Cells(Rows.Count, "A").End(xlUp))


Avrai notato che quando riapri una userform contiene ancora i dati della "volta precedente", dati da cancellare prima di introdurre quelli nuovi. Il modo piu' smart di evitare cio' e' di usare (come detto ieri) l' evento UserForm_Activate; il modo piu' semplice e' usare Unload UserFormXYZ invece di UserFormXYZ.Hide (la form sara' ricreata vuota).

[. . . ] devo trovare il modo per evitare che l'enter mi cancelli un contenuto appena modificato
Per evitare che il text sia rimodificato all' entrata del textbox forse ti bastera' sondare se il textbox e' vuoto; ad esempio
Codice: Seleziona tutto
Else    'Esistente
    If Indirizzo.Text = "" Then Indirizzo = Cells(Linea, 5)    '<<< Modificata

Tuttavia la situazione va analizzata in dettaglio prima di passare alla programmazione visto che, mi sembra, quella form e' usata in piu' casi.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Zannando » 15/11/12 10:52

A me la ricerca non funzionava se per dire cancellavo(da tabella) i dati di berlusconi silvio, che si trova più in alto rispetto a silvia, in tal caso infatti la userform non richiamava i dati di silvio.

Il problema dell'azeramento della userform io l'ho ovviato mettendo all'interno dello UserForm_Activate per ogni TextBox=""...l'avessi saputo prima...vabbò poco male almeno così è più controllabile.

Ora ho anche aggiunto una colorazione gialla alle caselle che se ne và solo se si interviene sulle caselle ed il dato è stato recuperato dalla sua riga della tabella o da una modifica dell'utente

Per l'ultimo punto ho inserito semplicemente un if simile a quello da te proposto
Codice: Seleziona tutto
if  TextBox="" Then
'formula di prima
End if


P.S. subito dopo l'inserimento di un nuovo nome e conseguentemente della nuova riga per ora copia la formula superiore (nel file che ti ho dato non ci sono formule ma su quello finale ce ne sono) ma non cambia i riferimenti come farebbe con un trascinamento normale hai una dritta anche su questo? per ora opera con un CopyOrigin:=xlFormatFromLeftOrAbove...

Grazie ancora
Win 7 - Office 2007
Zannando
Utente Junior
 
Post: 11
Iscritto il: 13/11/12 08:59

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Anthony47 » 15/11/12 14:08

A me la ricerca non funzionava se per dire cancellavo(da tabella) i dati di berlusconi silvio, che si trova più in alto rispetto a silvia, in tal caso infatti la userform non richiamava i dati di silvio.
Non ho capito: se prima cancelli i dati di Silvio, che cosa vorresti richiamare?

Il codice che hai usato per evitare di ripristnare un textbox pieno e' esattamente quello che ti avevo suggerito, solo usando la sintassi dell' If su piu' righe.

Per il Copy che non aggiorna il riferimento non sono riuscito a replicarlo, probabilmente perche' non so replicare la tua struttura dati.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel]Find is Nothing ma non dovrebbe esserlo

Postdi Zannando » 15/11/12 15:14

A me la ricerca non funzionava se per dire cancellavo(da tabella) i dati di berlusconi silvio, che si trova più in alto rispetto a silvia(supponendo che di essa vi fossero più dati), in tal caso la userform non richiamava i dati di silvia. ;)

Questo può capitare quando devi aggiornare una linea già esistente...
Win 7 - Office 2007
Zannando
Utente Junior
 
Post: 11
Iscritto il: 13/11/12 08:59


Torna a Applicazioni Office Windows


Topic correlati a "[Excel]Find is Nothing ma non dovrebbe esserlo":


Chi c’è in linea

Visitano il forum: Nessuno e 20 ospiti