Login Registrati
Stai vedendo 15 articoli - dal 26 a 40 (di 40 totali)
  • Autore
    Articoli
  • #8024 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      238 pts

      Ci sto lavorando, la faccenda diventa più complicata e quindi, per me, più interessante    ma stasera chiudo, sono un po' stanco.

      #8029 Score: 0 | Risposta

      Seguret
      Partecipante

        aaah non immagini quanto mi ci sto chiudendo XD 

        <em class="bbp-the-quote-cite">vecchio frac wrote:</em>C'è un errore nel calendario di gennaio... la giornata "06" è ripetuta due volte   

        sisi me ne ero già accorto ho già corretto...

        comunque per quanto riguarda il calcolo, come avrai notato ogni settimana, sulla destra, ha il totale delle ore fatte (di straordinario) quindi viene da se che oltre a scendere la settimana dovrà cambiare anche la cella di "riassunto".

        <em class="bbp-the-quote-cite">vecchio frac wrote:</em>Dovremo perciò costruire una function personalizzata da usare come formula al posto della formula(ccia) che vedo in O6.

        creare una funzione per il calcolo della settimana e poi richiamarla per ogni cella di "riassunto"?!?!?! mi sembra una soluzione abbastanza facile e veloce, purché si possano fare poi i vari controlli... cioè la formula(ccia) è un po limitativa quindi non vorrei poi trovarmi nella stessa condizione di dover fare dei calcoli a mente che non vorrei fare.

        allego di nuovo il file cosi è più chiaro

        Allegati:
        You must be logged in to view attached files.
        #8034 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          238 pts

          Ecco stavo per chiederti di riallegare il file corretto   

          Tra parentesi, hai compilato a mano il calendario? nessun automatismo? ogni anno dovrai rifare la stessa cosa... magari con un po' di codice si riesce a farlo fare a Excel (io l'ho fatto in un progetto Access, penso che posso riportare il codice con qualche modifica)

          #8037 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            238 pts

            Sulla base del tuo ultimo foglio, questo è il codice che ti propongo:

            Option Explicit
            
            Sub calc_orari()
            Dim i As Integer
            Dim j As Integer
            Dim r As Range
            Dim iCol As Long
            Dim d As Long
            Dim ore As Integer
            Dim minuti As Integer
            
                Application.ScreenUpdating = False
            
                For i = 6 To 230 Step 19
                
                    For j = 0 To 5
                        
                        For iCol = 1 To 14 Step 2
                            Set r = Range(Cells(i + (j * 3), iCol), Cells(i + 1 + (j * 3), iCol + 1))
                            r.Select
                            d = d + DateDiff("n", r(1), r(2)) + DateDiff("n", r(3), r(4))
                        Next
                        
                        If (d < 0) Then
                            ore = Int((d + 1440) \ 60)
                            minuti = Int((d + 1440)) Mod 60
                        Else
                            ore = d \ 60
                            minuti = d Mod 60
                        End If
            
                        Cells(i + (j * 3), "O") = CDate(ore & ":" & minuti)
                        Cells(i + (j * 3), "O").NumberFormat = "h:mm"
                        d = 0
            
                    Next
                
                Next
                
                Application.ScreenUpdating = True
                Cells(1, 1).Select
                MsgBox "Fatto"
            
            End Sub

            E' un banale inserimento di calcoli guardando i gruppi di quattro celle per volta che rappresentano gli orari di inizio e fine per ogni giornata. Le formule vengono sovrascritte e quindi eliminate, per cui a ogni modifica di orari già inseriti la macro deve essere fatta girare di nuovo.

            Un'alternativa sarebbe di creare una sub simile ma dedicata al ricalcolo solo della riga settimanale su cui insiste la modifica di un range orario quotidiano.

            Ulteriore alternativa è creare una Function come ti dicevo, da usare come qualsiasi altra funzione incorporata, da posizionare nelle celle grigie riassuntive e che operano "al volo", mostrando il risultato aggiornato ad ogni cambiamento che fai. L'inconveniente è che le formule vengono ricalcolate sempre tutte anche quando non serve.

            #8047 Score: 0 | Risposta

            Seguret
            Partecipante

              potrebbe essere una soluzione ma ho notato che se le ore sono < 0 da una sorta di errore... (#########)

              l'alternativa con la function mi sembra buona
              ma non ho capito, il ricalcolo è su tutto il calendario o solo per una settimana???

              tra l'altro c'è modo di avviare in auto la macro all'apertura del foglio????

              #8048 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                238 pts

                Sto lavorando per una implementazione carina di tutta la faccenda... sto creando un setup da cui partire per lanciare la creazione automatica dell'intero calendario partendo da una data stabilita.

                Del ricalcolo settimanale, intendevo dire che si può creare una procedura parallela che ha il vantaggio di lavorare solo sulla riga in corso invece di rielaborare l'intero calendario (come avverrebbe lanciando la macro principale vista).

                Naturalmente c'è modo di avviare la faccenda all'apertura, il codice si inserisce nell'evento Open del Workbook.

                Se ho un pochino di tempo e riesco a finire il progetto iniziato poi mi dici cosa ne pensi.

                #8049 Score: 0 | Risposta

                Seguret
                Partecipante

                  stavo pensando a come fare il calendario automatizzato (come mi consigliavi) e quindi ho buttato giu una bozza...
                  l'ho pensato cosi:

                  so che parto dal mese di gennaio e questo è a mio favore...
                  in base all'anno determino il primo giorno del mese in che giorno della settimana cade (2019 = 3 -> martedì) 
                  avendo a disposizione 7 posizioni faccio un switch: mi posiziono, stampo e formatto (NumberFormat = "dd")
                  da qui posso stampare tutti gli altri giorni facendo un paio di cicli

                  Sub GiorniInMese()
                      Dim GiorniInMese As Integer
                      Dim Anno As Integer
                      Dim pdata As Date
                      Anno = Cells(1, "F")
                      mese = 1
                      
                          pdata = DateSerial(Anno, 1, 1)
                     GiorniInMese = Weekday(pdata)
                      
                      Select Case GiorniInMese
                          Case 1
                              ActiveSheet.Cells(5, 13).Select
                              Cells(6, 13) = pdata
                              Cells(6, 13).NumberFormat = "dd"
                          Case 2
                              ActiveSheet.Cells(5, 1).Select
                              Cells(5, 1) = pdata
                              Cells(5, 1).NumberFormat = "dd"
                          Case 3
                              ActiveSheet.Cells(5, 3).Select
                              Cells(5, 3) = pdata
                              Cells(5, 3).NumberFormat = "dd"
                          Case 4
                              ActiveSheet.Cells(5, 5).Select
                              Cells(5, 5) = pdata
                              Cells(5, 5).NumberFormat = "dd"
                          Case 5
                              ActiveSheet.Cells(5, 7).Select
                              Cells(5, 7) = pdata
                              Cells(5, 7).NumberFormat = "dd"
                          Case 6
                              ActiveSheet.Cells(5, 9).Select
                              Cells(5, 9) = pdata
                              Cells(5, 9).NumberFormat = "dd"
                          Case 7
                              ActiveSheet.Cells(5, 11).Select
                              Cells(5, 11) = pdata
                              Cells(5, 11).NumberFormat = "dd"
                      End Select
                      
                      Dim i As Integer
                      For i = pdata To 14
                      i = i + 2
                      Cells(5, i) = pdata + 1
                      Cells(5, i).NumberFormat = "dd"
                      Next i
                  End Sub

                   PROBLEMI:

                  1- mi sono accorto che facendo andare la Sub passo passo quando arriva al Case esegue le prime 2 istruzioni e poi riinizia da capo l'intera Sub per altre 2 volte (tot 3) la terza esegue la terza istruzione ed esce dallo switch

                  2- come entra nel for mi da errore i overflow immagino che sia i = i + 2 ma comunque sia mi devo spostare di 2 posizioni...

                  #8050 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    238 pts

                    Ci sono alcuni problemi da risolvere in questo schema... ad esempio devi anche dichiarare la variabile "mese" e dimensionarla correttamente. Questo problema del dimensionamento è diffuso ed è abbastanza importante. Metti Option Explicit in testa al modulo e cerca di dichiarare sempre le variabili.

                    1) GiorniInMese vale 3 perchè corrisponde al giorno della settimana del 1/1/2019 (martedì, contando da domenica, è il terzo giorno della settimana: in assenza di altre indicazioni si parte sempre da domenica; poichè in Italia si parte da lunedì devi specificarlo nella funzione Weekday). Quindi il Select esegue il terzo Case, esegue le tre istruzioni e passa alla fine (End Select) dove incontra un ciclo che non può funzionare; punto successivo:

                    2) Overflow perchè pdata è di tipo data ma i è Integer (quindi sopporta al max +32768: ma pdata vale 43466) e quindi il contatore va in overflow. Inoltre non è quasi mai bene influenza il contatore di un ciclo For durante il ciclo, a meno che non serva. Per incrementare il contatore di n passi si usa step: "for i = 1 to 14 step 2". Per spostarti devi tener conto di un contatore della posizione e aggiustare quello.

                    Se permetti, per tua curiosità ti allego il codice che costruisce il calendario di un mese. L'ho buttato giù oggi, dovrebbe funzionare; lo devo adattare affinché costruisca tutto l'anno (nel file principale che sto manipolando).

                     

                    Allegati:
                    You must be logged in to view attached files.
                    #8052 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      238 pts

                      Poiché ci ho lavorato sopra attentamente, ti allego una versione intermedia del file finale, che mi soddisfa abbastanza 🙂

                      E' da finire perchè bisogna implementare la parte che calcola i crediti orari giornalieri/settimanali, ma siccome è una parte di codice che abbiamo già fatto non sarà difficile importarla. Ti lascio il lavoro per analizzarlo (spero domani di riuscire a finirlo).

                      Consta di un foglio Setup dove imposti l'anno e, in una versione futura, la tabella delle festività. C'è un hyperlink che cliccato crea il foglio calendario relativo all'anno che hai introdotto nel setup. C'è un foglio "model" che andrà nascosto in fase finale, che contiene lo scheletro del calendario annuale.

                      Prova a giocarci e dimmi se trovi errori (ricorda, in questo momento non è implementata la parte del calcolo delle ore lavorate).

                      Allegati:
                      You must be logged in to view attached files.
                      #8086 Score: 0 | Risposta

                      Seguret
                      Partecipante

                        cavolo, ottimo!!! sei un genio!!!
                        cosi ho tutti gli anni di lavoro, che fino alla pensione è lunga🤣

                        comunque mi piace, solo che non và il link... ho creato un pulsante ed gli ho assegnato la macro create_calendar, ma ho dovuto renderla pubblica perché altrimenti non riuscivo a vederla nella lista macro da assegnare...

                        immagino che ora la Sub per il calcolo andrà fatta sul modello, giusto???

                        mi sta venendo un dubbio: ma poi il tutto funzionerà su excel per dispositivi diversi da PC o Mac (Tablet vari, iPad, Smartphone, ect...)

                        #8089 Score: 0 | Risposta

                        vecchio frac
                        Senior Moderator
                          238 pts

                          Seguret wrote:solo che non và il link

                          ma come no?    uhm... sto comunque lavorando per aggiungere dinamicamente il calcolo delle ore lavorate, settimana per settimana (quindi senza ricalcolare ogni volta tutto). Inoltre confermami già che ci sei, il totale ore lavorate in una settimana NON comprende i giorni appartenenti al mese precedente e a quello successivo rispetto a quello in corso vero? mi pare ovvio ma meglio chiederlo 🙂

                          La sub per il calcolo rimane in un modulo suo (il modello verrà nascosto e tu non lo vedrai più).

                          Non ho idea se il programmino girerà su piattaforme diverse, ma siccome usa istruzioni del tutto compatibili col modello ad oggetti di Excel e non ci sono trucchi strani, non dovresti avere problemi. Però deve girare su una versione di Excel che supporti l'esecuzione delle macro... ignoro totalmente il comportamento delle versioni su strumenti non desktop. Se funziona dimmelo che facciamo un business   

                          Io ho scaricato un kit in python per sviluppare applicazioni smartphone ma è abbastanza complicato e non mi ci sono messo seriamente 🙂

                          #8109 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            238 pts

                            Allego una nuova revisione.

                            In questa versione:

                            - posso scrivere le ore minuti direttamente senza pensare ai due punti o al punto di separazione (800 viene trascritto come 8.00 automaticamente). Così uso il tastierino numerico di getto senza interruzione;

                            - il calcolo delle ore lavorate avviene in tempo reale settimana per settimana. Inserisco quindi gli orari di una giornata e viene fatto subito il calcolo della settimana corrente per inserire il numero di ore lavorate nella cella corrispondente (colonna O). Non viene fatto il ricalcolo su tutto il calendario ma solo sulla settimana corrente (quindi aumenta la velocità di esecuzione);

                            - per ogni giornata posso inserire quattro orari. Se ne inserisco di meno il totale delle ore lavorate è calcolato ma poiché è parziale il font della cella in colonna O diventa rosso; diventa bianco quando sono compilati i quattro orari giornalieri o quando si cancella il contenuto di un intero range giornata (o settimana). Solo un vantaggio estetico;

                            - il foglio è ora protetto. Quindi posso inserire solo orari giornalieri e non è possibile modificare altro;

                            - nel foglio Setup ho previsto la tabella festività che serve eventualmente solo per colorare di rosso i giorni delle festività diversi da sabati e domeniche. Questa funzionalità non è ancora implementata ma non è difficile farlo;

                            - si può valutare se lasciare in grigio i numeri dei giorni che non appartengono al mese in corso o se risulta più bello esteticamente cancellare le celle con giorni non appartenenti al mese.

                            Enjoy 🙂 (e riportami errori)

                            Allegati:
                            You must be logged in to view attached files.
                            #8114 Score: 0 | Risposta

                            vecchio frac
                            Senior Moderator
                              238 pts

                              Allego una nuova revisione, mi sono accorto di un piccolo bug.

                              Comunque ho implementato l'ultimo punto, adesso puoi scegliere se indicare in grigio i giorni che non appartengono al mese in corso oppure di lasciarli.

                              Allegati:
                              You must be logged in to view attached files.
                              #8135 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                238 pts

                                Allego una nuova revisione, ho fatto una nuova modifica interessante: ho implementato la tabella delle festività, per cui adesso nel calendario sabati e domeniche appaiono in rosso, le festività segnate nella tabella del foglio Setup vengono evidenziate in giallo.

                                Un'ultima chicca da implementare sarebbe quella di calcolare la data di Pasqua e quindi evidenziare il Lunedì dell'Angelo nel calendario (Pasqua è sempre domenica e quindi è già segnata in rosso).

                                Inoltre la procedura nasconde il foglio modello (c'è ancora ma è nascosto e per visualizzarlo devi andare in finestra Immediata e dare il comando sheets("model").visible = true).

                                So che mi sono fatto prendere la mano ma mi sono divertito 😀

                                 

                                Allegati:
                                You must be logged in to view attached files.
                                #8139 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  238 pts

                                  Allego l'ultima revisione, cui ho aggiunto la funzioncina per il calcolo della Pasqua e del Lunedì dell'Angelo; la relativa festività viene inserita nella tabella festività così quando si genera il calendario viene tinta di giallo la cella corrispondente.

                                  Credo che questa sia l'ultima revisione che propongo 🙂

                                  Allegati:
                                  You must be logged in to view attached files.
                                Login Registrati
                                Stai vedendo 15 articoli - dal 26 a 40 (di 40 totali)
                                Rispondi a: differenza ore
                                Gli allegati sono permessi solo ad utenti REGISTRATI
                                Le tue informazioni: