Condividi:        

riavviare una macro

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

riavviare una macro

Postdi papiriof » 24/07/23 18:29

Ho questa macro che mi inserisce 10 numeri diversi nell' 'intervallo E11:N11 in T7 ho un contatore che prima di una modifica qui evidenziata da
If [T7] = 1000 Then '<---------------------------inserito
Exit Sub '<------------------------------------------- inserito
End If '<--------------------------------- inserito

Codice: Seleziona tutto
Sub Ricerca2()
    Dim ind As Integer
    [T7] = ""
    Do
        Pescaggio
       If [T7] = 1000 Then '<---------------------------inserito
       Exit Sub    '<------------------------------------------- inserito
       End If       '<--------------------------------- inserito
   
        [T7] = [T7] + 1
    Loop Until ([D12]) >= ([T9]) And ([AA10] < [AA11])
End Sub


continuava l'inserimento , ma dopo un certo numero tendeva a rallentare. Così ho inserito queste 3 righe che mi permettono di sfruttare la velocità di inserimento e arrivato , il contatore, a 1000 la macro si blocca e io riclicco sul bottone e riavvio la macro per altri 1000 , se in questi 1000 trova in T9 il numero = sueriore comunque si ferma .La domanda è senza che io riclicco ogni volta che il contatore raggiunge 1000 come riavviare la macro , insomma se sei arrivato a 1000 e non hai soddisfatto le due condizioni riavviati!!
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Sponsor
 

Re: riavviare una macro

Postdi Anthony47 » 24/07/23 19:48

Non escludo che la velocità di esecuzione rallenti dopo un pò (anzi che all'inizio sia piu' veloce) solo per "illusione ottica"
Se invece e' proprio così allora potrebbero esserci delle variabili che "si allargano" con l'uso, e si resettano con il riavvio manuale della macro.
Per verificare se questo e' il caso ed eventualmente resettarle in modo mirato bisognerebbe guardare l'intera macro, in particolare il contenuto di Pescaggio
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: riavviare una macro

Postdi papiriof » 25/07/23 05:53

E, si lo avevo pensato . Ecco ma macro Pescaggio : (non è roba mia, ma trovata sul Web di mio solo le 3 righe :oops: :oops: )
Sub Pescaggio(Optional ofs&)
Dim i&, j&, n&, T, p(), v(), Cel As Range
Randomize
p = Array(Array("E1:N9", "E11:N11"))
For j = 0 To UBound(p)
For Each Cel In Range(p(j)(0))
If Not IsEmpty(Cel) Then n = n + 1: ReDim Preserve v(1 To n): v(n) = Cel.Value
Next
For i = n To 2 Step -1
T = v(1): v(1) = v(1 + Int(n * Rnd)): v(1 + Int(n * Rnd(0))) = T
Next
ReDim Preserve v(1 To 10)
Range(p(j)(1)).Offset(ofs) = v
Erase v
n = 0
Next

End Sub
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Re: riavviare una macro

Postdi Anthony47 » 25/07/23 12:03

Confermo che secondo me interrompere e riavviare crea solo l’illusione che la macro vada piu’ veloce: ho usato questa variante della tua Sub Ricerca2 per misurare i tempi di esecuzione di 1000 cicli di “Pescaggio” se eseguiti in continuazione.
Codice: Seleziona tutto
Sub Ricerca2()
    Dim ind As Integer
    [T7] = ""
    pipp = Timer
    Application.ScreenUpdating = False
    Do
        Pescaggio
       If [T7] Mod 1000 = 0 Then  '<
            Debug.Print [T7], Format(Timer - pipp)
            DoEvents
'           Exit Sub    '<
'            [T7] = 0
            pipp = Timer
       End If       '<
    [T7] = [T7] + 1
    Loop Until ([D12]) >= ([T9]) And ([AA10] < [AA11])
Application.ScreenUpdating = True
End Sub

Ebbene in 100 cicli da 1000 i tempi sono sempre gli stessi con una variabilità di +/- 0.02 sec.

Un miglioramento di circa il 18% e’ stato ottenuto con l’aggiunta di Application.ScreenUpdating = False/True (mancante nel tuo codice)

Comunque se vuoi provare l’emozione di fermare la macro e rilanciarla dopo 1 secondo puoi usare “OnTime”; ad esempio con questa variante della Sub Ricerca2
Codice: Seleziona tutto
Sub Ricerca33()
    Dim ind As Integer
    [T7] = ""
    Application.ScreenUpdating = False
    Do
        Pescaggio
        If ([D12]) >= ([T9]) And ([AA10] < [AA11]) Then Exit Do
        If [T7] = 1000 Then '
            Application.OnTime Now + TimeSerial(0, 0, 1), "Ricerca33"
            End
        End If       '
        [T7] = [T7] + 1
    Loop
Application.ScreenUpdating = True
End Sub

Ho aggiunto Application.ScreenUpdating False /True; se preferisci vedere le modifiche sullo schermo allora elimina le istruzioni
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: riavviare una macro

Postdi papiriof » 25/07/23 16:09

Grazie Anthony, ho scelto il primo suggerimento ...... Non saprei se è più veloce perchè il "Pescaggio" è random per cui solo quelli bravi sanno come misurare questo!!! Per quanto potuto ho dovuto dichiarare la variabile pipp (all'inizio del modulo generale, infatti, c'era Option Explicit), io ho messo pipp As Variant c'è un tipo migliore? o Variant va comunque bene?
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Re: riavviare una macro

Postdi Anthony47 » 25/07/23 16:45

La prima macro non era un vero suggerimento, ma solo il metodo con cui avevo dimostrato che continuando a eseguire la macro i tempi di esecuzione rimanevano invariati; trovi i tempi di esecuzione registrati nella "finestra Immediata" del vba, così anche tu puoi controllare se, continuando la macro, i tempi si allungano o rimangono (come e' risultato a me) costanti.
E' equivalente alla tua con l'aggiunta di Application.ScreenUpdating.
Avendo adottato quella macro, puoi vedere i tuoi tempi di esecuzione: dal vba, apri la finestra Immediata (dovrebbe bastare digitare Contr-g; altrimenti Menu /Visualizza /Finestra Immediata); troverai il tempo necessario a eseguire ogni 1000 cicli, che a me sono risultati costanti con una variazione di +/- 0.02 secondi, del tipo
Codice: Seleziona tutto
 1000         1,491094
 2000         1,520313
 3000         1,504688
etc etc
 53000        1,503586
etc etc
(tempo per i primi 1000 cicli, i secondi, i terzi etc etc)

Per pipp la dichiarazione ottimale sarebbe As Single, ma As Variant va bene lo stesso
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: riavviare una macro

Postdi papiriof » 25/07/23 17:09

il secondo suggerimento non gira ovvero gira e si ferma a 1000 dopo di che appare una scritta che mi dice impossibile esguire la macro Ricerca33 . E' possibile che tale macro non sia disponibile nella cartella di lavoro o che tuttele macro siano disattivate. Ma se le altre funzionano ?!!?
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Re: riavviare una macro

Postdi Anthony47 » 25/07/23 19:35

La Sub Ricerca33 e' inserita in un modulo standard del vba (e non in un "[FoglioXXX codice)])?
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: riavviare una macro

Postdi papiriof » 25/07/23 21:31

capito, ma la sostanza non cambia . Grazie!!
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Re: riavviare una macro

Postdi Anthony47 » 25/07/23 23:52

Ma la Sub Ricerca33 in quale modulo vba e' stata caricaata? Me ne copi il codice? E che succede quando la esegui?
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: riavviare una macro

Postdi papiriof » 26/07/23 06:56

Anthony47 ha scritto:Ma la Sub Ricerca33 in quale modulo vba e' stata caricaata? Me ne copi il codice? E che succede quando la esegui?

Si , adesso l'ho caricata su un modulo normale .In principio non funzionava perchè richiedeva "pescaggio"il codice del quale risedieva nel foglio xxx . Non ho fatto altro che copiarlo e metterlo ANCHE nel modulo normale dove ho messo Ricerca33. In questo modo si comporta esattamente come AVEVI PROSPETTATO arriva fino a 1000 , si ferma un secondo e riparte per un altro giro di 1000 :?: nel corso del quale st intercetta la condizione si ferma. Dopo queste prove preferisco la prima soluzione. Mi sembra di ricordare che il codice che si mette nei fogli viene preceduto da"Private" ma evidentemente si può mettere anche senza. Quello che mi sembrava strano è che non si vedono :?:
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Re: riavviare una macro

Postdi papiriof » 26/07/23 07:59

Questa mattina ho ripreso a fare qualche prova Ricerca33 andava bene come ho detto nel post precedente mentre Ricerca2 una volta lanciata mi sbatteva fuori. Sono andato nel codice dove ho messo Ricerca33 insieme a Pescaggio e a quest'ultima gli ho cambiato nome con Pescaggioo una O in più. Ora funzionana tutto però ho un po' di confusione :roll: :roll:
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Re: riavviare una macro

Postdi papiriof » 26/07/23 08:38

Accidenti se aziono Ricerca 2 (ad ogni riapertura ) mi sbatte fuori se vado sul codice cambio qualcosa o meglio movimento qualcosa allora funziona salvo chiudo rientro e si ripete la cosa :?: :?: :?: :?:
Win 7+Office 2010
papiriof
Utente Senior
 
Post: 408
Iscritto il: 16/02/10 13:23

Re: riavviare una macro

Postdi Anthony47 » 26/07/23 09:31

Nei moduli di foglio per evitare errori ci metterai solo le "macro di evento", tipo Worksheet_Calculate, Worksheet_SelectionChange, etc etc; tutto il resto va in Moduli Standard
Quindi Sub RicercaXX e Sub Ripescaggio vanno in un modulo standard (le macro inserite in moduli di foglio rispondono a regole particolari)
Io faccio così e mi trovo bene
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "riavviare una macro":


Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti