Condividi:        

intersect target

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

intersect target

Postdi miko » 24/06/13 09:28

buon giorno,
sto realizzando questo progetto, ancora in fase embrionale, la cui macro principale è una macro "TROVA" dei numeri in un range.
molte delle rourine del progetto non le ho ancora realizzate poichè ho già piccoli inconvenienti con quelle che ho creato.
nel file che allego trovate tutto quello che, fino ad ora, ho a disposizione.
http://www.filedropper.com/intersecttarget
al posto delle macro mancanti ho inserito dei msgbox.
la colonna B, formattata nel default di excel, contiene le date;
la routine si svolge in questi termini:

1) se nella cella B2 digito una data, deselezionando B2 con tasto invio, tasti freccia o mouse,
automaticamente viene ricercata la data da B8 fino all' ultima riga del range B8:B;
se tale data esiste viene selezionata la cella contenente la data,
ed automaticamente si avvia la macro "trova", che ricerca i numeri
a partire dalla riga selezionata, che ho chiamato NRow, fino alla fine del range.
in questa fase ho notato che se in B2 si inserisce una data recente, la routine funziona,
ma se digito una data del tipo 4 10 1492 non succede nulla; pare che excel non riconosca la data.

N.B. ho fatto prove inserendo varie date nel range B8:B e/o modificando il formato data di colonna B.
questo problema, poco importante ai fini della routine, dal momento che le estrazioni non hanno date obsolete,
mi incuriosisce dal punto di vista conoscitivo.

2) se clicco su una qualunque cella di B8:B si avvia la macro "TROVA" ed in B2 viene riportata la data selezionata
mentre in A2 la corrispondente riga;

3) ho inserito 2 forme, next e prec, associati a 2 macro che permettono di avanzare od indietreggiare di una riga;
una volta selezionata la riga, e quindi la cella di colonna B, si avvia la macro "TROVA" , in B2 viene riportata la data selezionata
mentre in A2 la corrispondente riga;

il codice che ho scritto funziona, ma ho notato che qualunque sia il modo di procedere, punti 1), 2), 3),
la macro CELLA_B2, che cerca la data nel range B8:B, viene invocata 2 volte per completare l'elaborazione.
relativamente a questa ultima macro, per come è stata scritta, per cercare una data devo partire sempre dalla
prima cella B8 fino all'ultima, quindi mi pongo il problema di applicare questa macro in un range molto più esteso.
cercavo una soluzione differente, ma non ho idea di come procedere.
fin qui vi ho descritto i problemi che attualmente mi si presentano.

quello che segue è ancora tutto da realizzare ma poichè nel file troverete dei riferimenti
completo la descrizione;
ho inserito nel range O1:AA1, ancora molto generico, i numeri da trovare;
mentre cliccando in una cella del range O2:O7 trovo il primo numero dopo la linea in esame, NRow, e riporto in A3 il numero di riga, in B3
la data ed in A4 la distanza tra la riga in esame e quella di sortita.
ma ripeto quest'ultima parte è ancora da definire e realizzare.
credo che l'uso del file permetterà di comprendere meglio la descrizione.
grazie e buona giornata
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: intersect target

Postdi ricky53 » 24/06/13 10:29

Ciao,
al momento non posso scaricare il tuo file (blocco del nostro firewall).

Vado a sensazione: se esegui una macro "scatenata" da un "evento" devi disabilitare gli eventi.
da inserire all'inizio del codice
Esempio
Codice: Seleziona tutto
    Application.EnableEvents = False


e questa da inserire ala fine del codice
Codice: Seleziona tutto
    Application.EnableEvents = True
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: intersect target

Postdi Anthony47 » 24/06/13 11:26

Mi accodo al suggerimento di Ricky, ampliandolo:
-poiche' tu hai delle macro di Worksheet_Change e Worksheet_SelectionChange, dovresti inserire l' istruzione Application.EnableEvents = False in tutte le macro che modificano una cella o che modificano la selezione di cella. Metterai l' istruzione Application.EnableEvents = True in tutti i punti di uscita delle macro.

Tieni anche presente che Excel gestisce date da 1-gen-1900 in avanti.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: intersect target

Postdi Flash30005 » 24/06/13 11:29

Aggiungo a quanto detto da Ricky e Anthony che le macro funzionano bene
Se inserisci una data "non recente" puoi non ottienere nulla se quella data non esiste in elenco.

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: intersect target

Postdi scossa » 24/06/13 12:07

Anthony47 ha scritto:Mi accodo al suggerimento di Ricky, ampliandolo:
-poiche' tu hai delle macro di Worksheet_Change e Worksheet_SelectionChange, dovresti inserire l' istruzione Application.EnableEvents = False in tutte le macro che modificano una cella o che modificano la selezione di cella. Metterai l' istruzione Application.EnableEvents = True in tutti i punti di uscita delle macro.

Tieni anche presente che Excel gestisce date da 1-gen-1900 in avanti.


Premesso che nemmeno io posso scaricare il file, per cui la mia riflessione è basata solo su quanto citato sopra:
secondo me, se più macro scatenano eventi del foglio, sarebbe meglio gestire l'eventuale ricorsività della chiamata alle routine di evento, esclusivamente all'interno delle stesse mediante una variabile static di tipo boolean, impostata a True alla prima chiamata e reimpostata a False all'uscita.
In questo modo si deve intervenire solo sulle routine di evento e soprattutto non si disbilitano gli eventi (cosa che, soprattutto se fatta da più routine e non perfettamente gestita, potrebbe anche avere implicazioni impreviste).
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: intersect target

Postdi scossa » 24/06/13 13:16

scossa ha scritto:...secondo me, se più macro scatenano eventi del foglio, sarebbe meglio gestire l'eventuale ricorsività della chiamata alle routine di evento, esclusivamente all'interno delle stesse mediante una variabile static di tipo boolean, impostata a True alla prima chiamata e reimpostata a False all'uscita.
.....


Un esempio per chiarire quanto sopra espresso:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)

  Static bRicorsivo As Boolean
 
  If bRicorsivo Then Exit Sub 'se Vero = chiamata da se stessa
 
  If Not (Intersect(Target, Range("B2:B20")) Is Nothing) Then
    bRicorsivo = True
    With Target
      .Value = UCase(.Value) ' ricorsività!!
    End With
    bRicorsivo = False
  End If
       
End Sub
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: intersect target

Postdi miko » 24/06/13 18:22

buona sera,
quando ho inserito il post avevo verificato se l'hosting permetteva il download, ma dal momento che avete problemi
invio il file tramite un altro hosting:
http://wikisend.com/download/355526/INTERSECT%20TARGET.xls
ho provato ad inserire le linee di codice che mi avete suggerito, ma non risolvo il problema;
ho tentato anche di modificare l'esempio publicato da scossa, ma evidentemente non ci sono riuscito.
ciao grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44

Re: intersect target

Postdi Anthony47 » 26/06/13 01:16

Per la "curiosità" sulle date immagino che la risposta precedente ti abbia risolto.

Immagino quindi che riparli della macro CELLA_B2 che si attiva piu' volte nell' ambito dello stesso processo di ricerca.
Questa macro e' attivata dalla tua Worksheet_Change, che si attiva sia quando tu "a mano" scrivi qualcosa in B2 sia quando B2 e' scritta da una istruzione macro.
Inoltre hai una Worksheet_SelectionChange che lavora tutte le volte che selezioni una cella nel range "B8:Bxxx"
Il risultato di tutto cio' e' che, nell' ipotesi che lavori scrivendo una data in B2 (metodo 1):
a)parte la Worksheet_Change
b)viene lanciata CELLA_B2
c)prima o poi viene compilata la cella A2
d)parte la Worksheet_Change, che pero' si conclude senza altre operazioni
e)viene selezionata la cella con la data prescelta
f)parte la Worksheet_SelectionChange, che dopo alcuni step scrive in B2 la data gia' presente in B2
g)parte la Worksheet_Change, che rilancia una seconda istanza di CELLA_B2 (b), che rifa' la (c), la (d) e la (e); sembrerebbe che siamo entrati in loop, ma fortunatamente stavolta la "e" ("viene selezionata la cella con la data prescelta") non innesca la (f) perche' quella cella e' gia' selezionata.
Questa fortunata situazione consente il completamento della seconda istanza di CELLA_B2 e della seconda Worksheet_SelectionChange; poi si conclude la prima istanza di CELLA_B2 e l' iniziale Worksheet_Change (step a).

E' evidente che gli eventi Worksheet_Change e Worksheet_SelectionChange si succedono e vengono processati in continuazione, col rischio di entrare in loop (il vba comunque ha al suo interno un counter di mi pare max 100 loop per evitare di entrare il un loop senza fine); ora tu dovresti sapere come le macro e gli eventi devono interagire tra di loro e di conseguenza sapere quando bloccare la gestione di ulteriori eventi.
A spanne mi pare che i due eventi devono partire ed essere processati una sola volta; puoi ottenere questo modificando la Worksheet_Change come segue
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
With Worksheets("ENALOTTO")
   If Intersect(Target, .Range("B2")) Is Nothing Then Exit Sub
   Application.EnableEvents = False
   CELLA_B2
   Application.EnableEvents = True
End With
End Sub

Analogo intervento dovrebbe essere fatto sulla Worksheet_SelectionChange.

TUTTAVIA devi valutare tu, in funzione del modo con cui le macro interagiscono per risolvere il tuo processo, se detti interventi sono idonei e sufficienti, ed eventualmente aggiungere altre istruzioni Application.EnableEvents = False /True in altre macro per disabilitare (o viceversa abilitare) la gestione degli eventi.

Una ultima nota:
nella tua Worksheet_Change usi
Codice: Seleziona tutto
With Worksheets("ENALOTTO")
   If Intersect(Target, .Range("B2")) Is Nothing Then Exit Sub
'. . .
End With

La notazione With Worksheets("ENALOTTO") /End With nel contesto non solo e' inutile (in un modulo di classe il riferimento e' per definizione al foglio a cui quel modulo appartiene), ma anche pericolosa, perche' ti potrebbe far pensare che si possa anche usare With Worksheets("UnAltroFoglio") che risultarebbe incompatibile con l' argomento "Target" (un range appartenente al Foglio "Enalotto"). Non e' quindi solo una questione di stile, ma anche di trappole da evitare.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: intersect target

Postdi miko » 30/06/13 20:15

buona sera e buona domenica a tutti,
come sempre sei preciso ed esaustivo nei tuoi contributi;
mi stupisce, in senso positivo, anche l'analisi degli eventi, che senza usare il file inviatovi,
hai saputo intuitivamente descrivere, cosa che non avevo saputo fare.
avevo più volte ripetuto prove inserendo gli :
Application.EnableEvents = False
Application.EnableEvents = True
e dopo il tuo ultimo post ho ripetuto il test, variando il punto di inserimento
delle linee precedenti;
a seconda della macro in cui inserisco queste linee, funziona qualche evento o macro mentre altre non funzionano,
oppure non funziona nulla.
ho riesaminato allora l'intervento di Scossa, che al pari tuo senza il file,
aveva esposto, in diverso modo, una analisi corretta degli eventi;
Egli infatti aveva individuato e risolto il problema, ma per mia incapacità avevo
in un primo momento intuito ma non interpretato.
inserendo nell'evento change l'intero codice di Scossa sostituendo la linea:
.Value = UCase(.Value) ' ricorsività!!
con la call alla mia macro:
CELLA_B2
tutto funziona perfettamente.
ho provato ad inserire lo stesso codice nell'evento selection_change, ma qui ottengo risultati
non corretti, in quanto vengono inseriti dei valori strani anche in celle non interessate dall'evento o dalle altre macro.
nell'evento selection_change attualmente ho solo un problema di poco conto:
vi ricordo che le celle di colonna B contengono le date:
se è già selezionata una cella di B, e quindi le macro richiamate hanno eseguito la loro funzione,
e successivamente in B2 inserisco la stessa data, si ripete la ricorsività come prima,
mentre a mio parere non dovrebbe verificarsi nulla dal momento che la cella di B era già selezionata
e le macro richiamate avevano completato il loro lavoro.
grazie a tutti voi per il vostro impegno.
buona serata
windows 10 - office 2013
miko
Utente Senior
 
Post: 520
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "intersect target":


Chi c’è in linea

Visitano il forum: Nessuno e 128 ospiti