Esecuzione macro con limitazioni
Hai un problema con Excel? 
Esecuzione macro con limitazioni
di Gierli data: 12/02/2017 16:42:23
Salve a tutti, premetto di non essere esperto in vba, mi arrangio con qualche routine per migliorarmi il lavoro giornalmente.
Mi serve una macro con una serie di azioni che deve eseguire all'apertura del file in automatico, ma l'esecuzione dev'essere limitata ad una sola volta a settimana iniziando il conteggio della settimana dal lunedì.
La macro é già funzionante e si esegue in automatico, ma non riesco a mettere una routine che faccia eseguire la macro la prima volta che si apra durante la settimana iniziando a considerare la settimana dal lunedì alla domenica
di patel data: 12/02/2017 19:26:21
prova una cosa del genere
Sub a()
nDay = Application.WorksheetFunction.Weekday(Date)
If nDay <> 2 Then exit sub
End Sub |
di Gierli data: 12/02/2017 22:06:09
Ho provato ma nulla, ogni volta che apro il file la macro va in esecuzione
di patel data: 12/02/2017 23:08:30
posta la macro
di Gierli (utente non iscritto) data: 13/02/2017 09:57:35
Sub open_auto()
'
' open_auto Macro
'
'
Sheets("2").Select
Sheets("2").Name = "2"
Sheets("2").Select
Sheets("2").Name = "2a"
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Range("M2").Select
Sheets("2a").Select
Sheets("2a").Move Before:=Sheets(2)
Sheets("1").Select
Sheets("1").Name = "2"
Range("C3:P26").Select
Selection.ClearContents
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()+7"
Sheets("2a").Select
Sheets("2a").Name = "1"
Sheets("Main Page ").Select
Range("A1").Select
End Sub
di patel data: 13/02/2017 20:29:10
prova così
Sub open_auto()
'
nDay = Application.WorksheetFunction.Weekday(Date)
If nDay <> 2 Then exit sub
Sheets("2").Select
Sheets("2").Name = "2"
Sheets("2").Select
Sheets("2").Name = "2a"
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Range("M2").Select
Sheets("2a").Select
Sheets("2a").Move Before:=Sheets(2)
Sheets("1").Select
Sheets("1").Name = "2"
Range("C3:P26").Select
Selection.ClearContents
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()+7"
Sheets("2a").Select
Sheets("2a").Name = "1"
Sheets("Main Page ").Select
Range("A1").Select
End Sub |
di Gierli data: 14/02/2017 14:34:59
facendo la prova 2 aperture file una dolo l'altra ha funzionato
lo sbaglio mio era che separavo le due routine
comunque lunedi lo proverò.
a presto e grazie
di Gierli data: 20/02/2017 08:16:40
Buongiorno
scusate ma ho il computer bloccato dall'amministratore e non posso cambiare la data per fare prove su file
comunque ho provato questa mattina, ma nulla di fatto
o meglio la macro si esegue di continuo ad ogni apertura e non una sola volta
chi ha qualche soluzione
grazie mille
ciao
di patel data: 20/02/2017 08:52:22
il giorno di lunedi la macro viene eseguita ogni volta che apri il file, se vuoi che venga eseguita una sola volta occorre scrivere un dato qualsiasi in una cella, magari di un altro foglio, e controllare se questo dato esiste già, hai una cella disponibile per questo ?
per es.
Sub open_auto()
'
nDay = Application.WorksheetFunction.Weekday(Date)
If nDay <> 2 Then Range("z1") = 0 : exit sub
if Range("z1") = 1 then exit sub
Range("z1") = 1
Sheets("2").Select
Sheets("2").Name = "2"
Sheets("2").Select
Sheets("2").Name = "2a"
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Range("M2").Select
Sheets("2a").Select
Sheets("2a").Move Before:=Sheets(2)
Sheets("1").Select
Sheets("1").Name = "2"
Range("C3:P26").Select
Selection.ClearContents
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()+7"
Sheets("2a").Select
Sheets("2a").Name = "1"
Sheets("Main Page ").Select
Range("A1").Select
End Sub |
di Gierli data: 24/02/2017 19:47:48
Patel scusami, ma non sono riuscito a risponderti prima.
Ho fatto delle prove ma nulla.
Vorrei riassumere la logica della macro che ho in mente
Nel file ci sono 3 fogli di cui "main page" "1" e"2"
La main page la posso utilizzare per i vari conteggi che la macro deve eseguire che di seguito spiego.
premettendo che la settimana vada dal lunedì alla domenica.
In qualsiasi giorno della settimana, alla prima volta che apro il file, la macro va in esecuzione poi scrive nella cella A1 della main page un valore 1, tutte le altre volte che riapro il file fino alla domenica la macro legge nella cella A1 se legge 1 non deve andare In esecuzione. La settimana successiva la macro per capire che é passata una settimana cosi il numeretto della cella A1 passa a 0, per far scrivere 0 nella cella A1 opterei per un contatore che si incrementa settimanalmente nella cella A2, se il contatore è incrementato la macro scrive 0 nella cella A1 e poi va in esecuzione e scrive 0. Infine ancora meglio se chiudo il file vada in auto save
Spero di essermi spiegato
Grazie per la pazienza
di patel data: 26/02/2017 09:11:37
allega un file di esempio
di Gierli data: 03/03/2017 11:45:12
comunque ragionando ho notato che ho omesso alcune funzionalità.
esempio
apro il file in qualsiasi giorno della settimana dal lunedi alla domenica, la macro legge nella cella A1 del foglio main page se trova "0" va in esecuzione:
seleziona il foglio "1" cambia il nome al foglio da "1" a "2" ,seleziona il range da C3:M26 cancella il contenuto, inserisce la data del lunedi successivo nella cella M1; seleziona il foglio "2" cambia il nome del foglio da foglio "2" a foglio "1" inserisce la data nella cella M1 del lunedi della settimana in corso, quando chiudo il file esegue l'auto salvataggio.
la settimana dopo la prima volta (dal lunedi alla domenica) che riapro il file, la macro va a leggere nella cella A2 della main page, se nella cella trova un numero diverso dalla settimana scorsa vuol dire che è passata una settimana va a scrivere "0" nella cella A1 va in esecuzione seleziona il foglio "1" cambia il nome al foglio da "1" a "2" ,seleziona il range da C3:M26 cancella il contenuto, inserisce la data del lunedi successivo nella cella M1; seleziona il foglio "2" cambia il nome del foglio da foglio "2" a foglio "1" inserisce la data nella cella M1 del lunedi della settimana in corso, scrive "1" nella cella A1, quando chiudo il file va in auto save..... e cosi via. la cella A2 l'ho pensata come contatore che ad ogni settimana si incrementa. ovviamente non so se è la strada giusta
grazie per la pazienza
di Gierli data: 03/03/2017 11:45:55
ho allegato anche il file
ciao
di Gierli data: 17/03/2017 11:33:15
Non c'è nessuno che mi puo aiutare?
grazie
di zsadist data: 17/03/2017 12:27:30
Ehm...
ciao..
leggo solo ora..
premetto che anch'io non sono un esperto.. in ogni caso..
non ho capito bene cosa deve fare il tuo file (devo rileggere tutto con calma).. ma il file in allegato non c'è più.. lo puoi rimettere.. magari nella pausa pranzo lo studio un pò... chissà
di zsadist data: 17/03/2017 12:45:05
ridando una rapida lettura...
se all'apertura del tuo file, metti nella fatidica cella A1 il numero della settimana..
vediamo se riesco a farti capire il mio ragionamento..
apro il file.. in cella A1 vi è 11 (numero di questa settimana, ad esempio)
se alla data di apertura il numero della settimana è maggiore al numero della cella A1, eseguo la macro.. e inserisco nella cella A1 il nuovo numero di settimana, se è uguale, non eseguo nulla...
dici che potrebbe andare?
Sub open_auto()
'
nWeek = Application.WorksheetFunction.WeekNum(Date, 21)
If nWeek > Range("A1") Then GoTo Esegui Else GoTo NoEsegui
If nDay <> 2 Then Range("z1") = 0: Exit Sub
Esegui:
Range("A1") = nWeek
Sheets("2").Select
Sheets("2").Name = "2"
Sheets("2").Select
Sheets("2").Name = "2a"
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Range("M2").Select
Sheets("2a").Select
Sheets("2a").Move Before:=Sheets(2)
Sheets("1").Select
Sheets("1").Name = "2"
Range("C3:P26").Select
Selection.ClearContents
Range("M1:P1").Select
ActiveCell.FormulaR1C1 = "=TODAY()+7"
Sheets("2a").Select
Sheets("2a").Name = "1"
Sheets("Main Page ").Select
Range("A1").Select
NoEsegui:
End Sub |
di zsadist data: 17/03/2017 13:54:58
boh..
allora..
tu dici:
"comunque ragionando ho notato che ho omesso alcune funzionalità.
esempio
apro il file in qualsiasi giorno della settimana dal lunedi alla domenica, la macro legge nella cella A1 del foglio main page se trova "0" va in esecuzione:
seleziona il foglio "1" cambia il nome al foglio da "1" a "2" ,seleziona il range da C3:M26 cancella il contenuto, inserisce la data del lunedi successivo nella cella M1; seleziona il foglio "2" cambia il nome del foglio da foglio "2" a foglio "1" inserisce la data nella cella M1 del lunedi della settimana in corso, quando chiudo il file esegue l'auto salvataggio.
la settimana dopo la prima volta (dal lunedi alla domenica) che riapro il file, la macro va a leggere nella cella A2 della main page, se nella cella trova un numero diverso dalla settimana scorsa vuol dire che è passata una settimana va a scrivere "0" nella cella A1 va in esecuzione seleziona il foglio "1" cambia il nome al foglio da "1" a "2" ,seleziona il range da C3:M26 cancella il contenuto, inserisce la data del lunedi successivo nella cella M1; seleziona il foglio "2" cambia il nome del foglio da foglio "2" a foglio "1" inserisce la data nella cella M1 del lunedi della settimana in corso, scrive "1" nella cella A1, quando chiudo il file va in auto save..... e cosi via. la cella A2 l'ho pensata come contatore che ad ogni settimana si incrementa. ovviamente non so se è la strada giusta "
quindi, il codice, se non erro dovrebbe essere quello che ti posto... sicuramente non sara giusto.. però... spero almeno di esserci vicino
'nel modulo
Sub open_auto()
'
nWeek = Application.WorksheetFunction.WeekNum(Date, 21)
lunSS = DateSerial(Year(Date), Month(Date), Day(Date) + 7) - Application.WorksheetFunction.Weekday(DateSerial(Year(Date), Month(Date), Day(Date) + 7 - 2))
lunOO = DateSerial(Year(Date), Month(Date), Day(Date)) - Application.WorksheetFunction.Weekday(DateSerial(Year(Date), Month(Date), Day(Date) - 2))
If lunSS = Date Then
lunSS = DateSerial(Year(Date), Month(Date), Day(Date) + 8) - Application.WorksheetFunction.Weekday(DateSerial(Year(Date), Month(Date), Day(Date) + 8 - 2))
End If
If nWeek > Range("A1") Then GoTo Esegui Else GoTo NoEsegui
Esegui:
Range("A1") = nWeek
Sheets("1").Select
Sheets("1").Name = "da 1 a 2"
Range("C3:M26").ClearContents
Range("M1") = lunSS
Sheets("2").Select
Sheets("2").Name = "1"
Range("M1") = lunOO
Range("M2").Select
Sheets("da 1 a 2").Select
Sheets("da 1 a 2").Name = "2"
Sheets("1").Move Before:=Sheets("2")
Sheets("Main Page ").Select
Range("A1").Select
NoEsegui:
End Sub
'in thisWorkbook o Questa_Cartella_di_lavoro
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
If ThisWorkbook.Saved = False Then
ThisWorkbook.Save
Application.DisplayAlerts = True
End If
End Sub |
di Gierli data: 17/03/2017 14:00:06
zsadist grazie mille
in giornata provo e ti faccio sapere
poi vedo se sono riuscito a farmi capire
grazie di nuovo
di zsadist data: 17/03/2017 14:01:47
figurati
anche se ti consiglio di aspettare qualcuno più esperto..
hai più speranze che ti diano una soluzione funzionante
ciao ciao
Vuoi Approfondire?