Esecuzione macro con limitazioni



  • 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