Condividi:        

Stessa macro lanciata in due situazioni diverse

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

Stessa macro lanciata in due situazioni diverse

Postdi BG66 » 11/11/17 08:39

Ciao,
vorrei imparare questa quisquilia.
Questa macro:
Codice: Seleziona tutto
Sub AggPROD()
    Dim LastB As Long
    Application.ScreenUpdating = False
    With ThisWorkbook
      .Unprotect Password:="pippo"
      With .Sheets("PRODUZIONE")    '<<<
        .Unprotect Password:="pippo"
        LastB = .Cells(.Rows.Count, "B").End(xlUp).Row
        'Copia formule:
        .Range("M2:P2").Copy .Range(.Range("M3"), .Range("M" & LastB))
        'Copia valori:
        .Range(.Range("M3"), .Range("P" & LastB)).Copy
        .Range("M3").PasteSpecial xlPasteValues
        Application.CutCopyMode = False
        .Protect Password:="pippo"
      End With
      .Protect Password:="pippo"
    End With
    Application.ScreenUpdating = True
    ThisWorkbook.Save
    MsgBox "Aggiornamento effettuato"
   End Sub



viene lanciata in due momenti diversi. La prima volta ad orario prefissati:
Codice: Seleziona tutto
Private Sub Workbook_Open()
Application.OnTime TimeValue("06:20"), "AggPROD"
Application.OnTime TimeValue("14:20"), "AggPROD"
Application.OnTime TimeValue("22:20"), "AggPROD"
End Sub


La seconda volta prima di chiudere il file:

Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Call AggPROD
ThisWorkbook.Close
End Sub


Ma in questo ultimo caso vorrei che non si attivasse l'ultima riga dello script:
Codice: Seleziona tutto
MsgBox "Aggiornamento effettuato"
.

Ovviamente anche con le mie basse conoscenze, sono conscio che mi basterebbe creare un nuovo script (es. aggPROD2") senza quest'ultima riga. Ma mi piacerebbe comunque capire ed imparare un pezzettino di qualcosa di nuovo.

Riassumendo vorrei che durante l'esecuzione della macro si tenesse conto del momento di avvio della stessa ( da script "timer "attivato all'apertura del file o da "Workbook_BeforeClose").

Sperando di essere stato chiaro, vi ringrazio anticipatamente.
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Sponsor
 

Re: Stessa macro lanciata in due situazioni diverse

Postdi wallace&gromit » 11/11/17 14:00

Perché il messaggio non lo mandi dalla sub on time? Penso che risolverebbe il caso.

Ps oppure potresti anche creare una sub che contiene solo il messaggio e chiamala solo quando ti serve.
Avatar utente
wallace&gromit
Utente Senior
 
Post: 2174
Iscritto il: 16/01/12 14:21

Re: Stessa macro lanciata in due situazioni diverse

Postdi Zer0Kelvin » 11/11/17 14:29

Ciao.
Due possibili soluzioni:
1) togliere il messaggio dalla sub ed incapsularla in un'altra sub che richiama il messaggio
Codice: Seleziona tutto
Private Sub Workbook_Open()
    Application.OnTime TimeValue("06:20"), "CallAggPROD"
...

 Sub CallAggPROD()
        AggProd
        MsgBox "Aggiornamento effettuato"
 End Sub

2) usere un boolean
Codice: Seleziona tutto
Public MessaggioOn as boolean

Private Sub Workbook_Open()
   MessaggioOn =True
       Application.OnTime TimeValue("06:20"), "AggPROD"
...
End Sub

Sub AggPROD()
    ...
    if MessaggioOn then MsgBox "Aggiornamento effettuato"
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   MessaggioOn = False
    Call AggPROD
   ThisWorkbook.Close
End Sub
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Stessa macro lanciata in due situazioni diverse

Postdi BG66 » 11/11/17 16:11

Ciao,
approfondisco il punto 2 quindi...segue domanda stupida:
Codice: Seleziona tutto
Public MessaggioOn as boolean"

dove và inserito?
Ho provato sia in "questa cartella di lavoro" che in un nuovo modulo standard senza risultato.

Grazie
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: Stessa macro lanciata in due situazioni diverse

Postdi Anthony47 » 11/11/17 17:58

Una variante all'idea "variabile boolean" suggerita da Z0K:
a) in testa al modulo che contiene la sub aggiungi
Codice: Seleziona tutto
Public NoMsg As Boolean


b) modifichi la sub in fondo (vedi righe ***)
Codice: Seleziona tutto
ThisWorkbook.Save
If Not NoMsg Then MsgBox "Aggiornamento effettuato"     '*** MOD
NoMsg = False                                           '*** ADD
End Sub


c) infine modifichi la Workbook_BeforeClose:
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 NoMsg = False                               '*** ADD
 Call AggPROD
ThisWorkbook.Close
End Sub

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

Re: Stessa macro lanciata in due situazioni diverse

Postdi Zer0Kelvin » 11/11/17 19:43

@BG66
La variabile, come precisato da Anthony va in un modulo standard e così dovrebbe funzionare.
Che problema hai riscontrato?
@Anhony
Credo ci sia un refuso qui
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 NoMsg = False                               '<<=== dovrebbe essere True
 Call AggPROD
ThisWorkbook.Close
End Sub
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

[RISOLTO] Stessa macro lanciata in due situazioni diverse

Postdi BG66 » 12/11/17 08:14

Ciao a tutti,
rifacendo tutti i passi da zero ( o meglio dire Z0K) :lol: -> funziona.

Grazie ancora.
Ultima modifica di BG66 su 12/11/17 08:27, modificato 3 volte in totale.
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

[RISOLTO] Stessa macro lanciata in due situazioni diverse

Postdi BG66 » 12/11/17 08:16

Per completezza di questo thread: confermo che è stato necessario modificare in True perchè tutto funzionasse a dovere.

Alla prossima
BG66
Excel2010
Avatar utente
BG66
Utente Senior
 
Post: 320
Iscritto il: 20/08/16 07:44

Re: Stessa macro lanciata in due situazioni diverse

Postdi Anthony47 » 12/11/17 22:36

@Anhony
Credo ci sia un refuso qui
Codice: Seleziona tutto
'
     NoMsg = False                               '<<=== dovrebbe essere True

Eh, vittima della doppia negazione...


Visto che il quesito aveva un obbiettivo didattico allora cito anche un secondo metodo che piacera' piu' ai puristi.

A) Modifica la Sub AggPROD affinche' accetti il parametro "messaggio Si/no"; poi usi questo parametro al momento del messaggio. Esempio:
Codice: Seleziona tutto
Sub AggPROD(Optional ByVal SiNo As Boolean = True)
'
'
If SiNo Then MsgBox "Aggiornamento effettuato"
'   
End Sub


B) Poi aggiungi questo parametro nella Sub Workbook_BeforeClose
Codice: Seleziona tutto
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Call AggPROD(False)       'Modificata
ThisWorkbook.Close
End Sub


Il parametro e' opzionale (se manca assume il valore di default = Vero).

Volendo evitare anche i MsgBox sui lanci pianificati (in effetti credo sia piu' utile evitare il messaggio delle 6:20 che non alla chiusura del file) devi usare questa sintassi:
Codice: Seleziona tutto
Application.OnTime TimeValue(Orario), "'AggPROD False'"
(nota gli apostrofi prima e dopo la stringa)

In questo modo pero' non potrai eseguire manualmente la AggPROD (salvo che non crei una ulteriore Sub AggProdManuale che fa la Call della AggProd)

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


Torna a Applicazioni Office Windows


Topic correlati a "Stessa macro lanciata in due situazioni diverse":


Chi c’è in linea

Visitano il forum: Nessuno e 40 ospiti