Condividi:        

conteggio presenze

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

conteggio presenze

Postdi trittico69 » 05/05/12 18:13

Salve a tutti…chi mi aiuta a fare una modifica a questo programmino..?
in pratica mi servirebbe che in E7, dei fogli da ‘gen’ a ‘dic’, le presenze di lavoro venissero conteggiate dal primo all’ultimo del mese…ovviamente per come è composto il programma il primo del mese può capitare il mese precedente e l’ultimo giorno può capitare il mese successivo..
ad es. se si guarda il mese di marzo il primo giorno capita in A15 e l’ultimo in A17 del foglio di aprile e l’anno successivo capiterà in modo diverso.
Mi servirebbe una formula che dica di conteggiare le celle <> da 0 in corrispondenza alla riga dove capita 01/03/11 da(in questo caso)C15:H15 stessa cosa per gli altri giorni fino all’ultimo del mese.
In questo caso il primo giorno del mese di gennaio capita in A19 ma potrebbe capitare a dicembre dell’anno precedente quindi mi dovrebbe conteggiare dal primo giorno utile di gennaio fino all’ultimo e per dicembre gli ultimi giorni capitano l’anno successivo quindi conteggiare fino all’ultimo giorno utile di dicembre, in questo caso 25/12/11…preferirei formule ma se è troppo complicato va bene anche una macro..grazie!
http://depositfiles.com/files/h8jv9qh47
trittico69
Utente Senior
 
Post: 497
Iscritto il: 16/08/09 18:41

Sponsor
 

Re: conteggio presenze

Postdi Anthony47 » 06/05/12 01:28

L' unica cosa che mi viene in mente e di farlo con una funzione ad hoc:
-metti questo codice in un Modulo standard
Codice: Seleziona tutto
Function pippotri(ByRef interv As Range) As Integer
'vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=95387
'
Dim myPres As Range, DateAddr As String, myMese As String
Dim mDay As Range, myCnt As Integer, I As Integer
'
DateAddr = Application.Intersect(interv, Range("A1:A100")).Address
myMese = UCase(ActiveSheet.Range("H1"))
For I = ActiveSheet.Index To ActiveSheet.Index + 1
    For Each mDay In Sheets(I).Range(DateAddr)
        If UCase(Format(mDay, "mmmm")) = myMese Then
        myCnt = myCnt + Application.WorksheetFunction.CountIf( _
            Application.Intersect(Sheets(I).Range(mDay.Address).Offset(0, 2).Resize(1, 6), Sheets(I).Range(interv.Address)), ">0")
        End If
    Next mDay
Next I
pippotri = myCnt
End Function

-metti poi questo in ThisWorkbook
Codice: Seleziona tutto
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim myWork, Eccez, I As Integer
'
Eccez = Array("RIEP", "codici servizi")  'Elenco fogli da ignorare
For I = LBound(Eccez, 1) To UBound(Eccez, 1)
    If Sh.Name = Eccez(I) Then Exit Sub
Next I
Application.EnableEvents = False
myWork = Sh.Range("C20").Value
Sh.Range("C20").Value = "ZcZc" & Sh.Range("C20").Value
Sh.Range("C20").Value = myWork
Application.EnableEvents = True
End Sub

Poi nel tuo foglio userai una formula del tipo
Codice: Seleziona tutto
=pippotri(A14:J70)

A14:J57 e' l' area che contiene le date da esaminare e le presenze da conteggiare; le date sono in col A, le presenze sono da col C verso dx per max 6 colonne. Si possono indicare piu' righe di quante realmente ne sono utilizzate sul foglio, perche' solo quelle che hanno una data del mese corrente vengono prese in considerazione.
E' necessario che i 12 mesi abbiano la stessa struttura dati, e che i mesi si succedano come da calendario.

La macro in ThisWorkbook serve per forzare il ricalcolo delle presenze quando si attiva il foglio; infatti solo quando si inseriscono nuovi dati dati NEL FOGLIO CORRENTE (all' interno dell' area dichiarata alla funzione "pippotri", A14:J70 nell' esempio) la formula ricalcola automaticamente il risultato, mentre non ricalcolerebbe se i dati sono inseriti /modificati sul foglio "successivo" (con data del mese "precedente").
Per quanto riguarda dicembre immagino che i dati saranno sempre monchi, perche' sul workbook non esiste il mese di Gennaio dell' anno successivo.

Prova e fai sapere.
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: conteggio presenze

Postdi trittico69 » 06/05/12 09:32

nella cella E7 dove ho messo =pippotri(A14:J70) mi da #nome?
trittico69
Utente Senior
 
Post: 497
Iscritto il: 16/08/09 18:41

Re: conteggio presenze

Postdi trittico69 » 06/05/12 10:02

ti aalego il file con i codici da te suggeriti per farti vedere dove io sbaglio e ti ho modificato le date di come potrebbe cambiare il posizionamento delle date in un successivo file....in particolare le date da A50:A56 potrebbero esserci o potrebbero essere vuote...i giorni dlla settimana capitano sempre nella stessa riga e poi guarda tu se potrebbe cambiare qualcosa ceh potrebbe dare problemi al tuo codice...se hai altre domande fa pure...grazie!
trittico69
Utente Senior
 
Post: 497
Iscritto il: 16/08/09 18:41

Re: conteggio presenze

Postdi trittico69 » 06/05/12 10:03

trittico69
Utente Senior
 
Post: 497
Iscritto il: 16/08/09 18:41

Re: conteggio presenze

Postdi Anthony47 » 06/05/12 15:08

Ci sono due errori nel tuo file:
-il codice e' stato inserito non in un "Modulo standard" ma in un Modulo di foglio (Foglio14); spostalo in Modulo3, ad esempio
-il range passato nella tua formula (=pippotri(C14:H70)) non include la colonna A; va modificata in =pippotri(A14:H70)

Per quanto riguarda i VINCOLI che questa funzione pone:
-la data deve essere in colonna A, le colonne predisposte per le presenze sono 6 cioe' C:H; queste colonne devono essere presenti nell' intervallo usato nella formula pippotri. Le righe usate per il calcolo sono quelle indicate nel range passato alla funzione (14:70, nell' esempio di prima)
-tutti i fogli devono avere la stessa struttura di data/presenza; le righe possono essere diverse tra foglio e foglio, in questo caso e' importante che il range passato alla funzione le includa tutte. Bisogna solo tenere presente che un range "troppo generoso" (es A14:H1000) richiedera' piu' tempo per essere calcolato, ma sempre nel range di centesimi di secondo.
-eventuali righe vuote non sono un problema, perche' verrebbero ignorate, come avevo gia' indicato: "Si possono indicare piu' righe di quante realmente ne sono utilizzate sul foglio, perche' solo quelle che hanno una data del mese corrente vengono prese in considerazione."

Spero che questo chiarisca.
Avatar utente
Anthony47
Moderatore
 
Post: 19221
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: conteggio presenze

Postdi trittico69 » 06/05/12 19:10

ok ho fatto un po di casino ma adesso ho messo a posto...dobbiamo fare una modifica perchè se io metto in C14 l'orario di inizio lavoro 8:00 mi segna una presenza e poi mettendo l'orario di uscita in D14 16:00 mi mette un altra presenza...ogni entrata e uscita mi deve mettere una solo presenza.
trittico69
Utente Senior
 
Post: 497
Iscritto il: 16/08/09 18:41

Re: conteggio presenze

Postdi Anthony47 » 06/05/12 22:14

Eh eh, il formato dei tuoi dati lo devi spiegare...
Prova a sostituire l' istruzione
myCnt = myCnt + Application.WorksheetFunction.CountIf( _
Application.Intersect(Sheets(I).Range(mDay.Address).Offset(0, 2).Resize(1, 6), Sheets(I).Range(interv.Address)), ">0")

con
myCnt = myCnt + Application.WorksheetFunction.CountIf( _
Application.Intersect(Sheets(I).Range(mDay.Address).Offset(0, 2).Resize(1, 6), _
Sheets(I).Range(Interv.Address), Sheets(I).Range("C:C,E:E,G:G")), ">0")


In questo modo conta ogni "entrata", dando per scontato che a una entrata corrisponde una uscita...

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

Re: conteggio presenze

Postdi trittico69 » 06/05/12 23:54

mi da errore in E7...ti allego il file...
http://depositfiles.com/files/2vvba0r3z
trittico69
Utente Senior
 
Post: 497
Iscritto il: 16/08/09 18:41

Re: conteggio presenze

Postdi Anthony47 » 07/05/12 01:16

Oopsss... ho sbagliato le istruzioni e ho sbagliato a collaudarle :oops:

Sostituisci tutto il codice con questo:
Codice: Seleziona tutto
Function pippotri(ByRef Interv As Range) As Integer
'vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=95387
'
Dim myPres As Range, DateAddr As String, myMese As String
Dim mDay As Range, myCnt As Integer, I As Integer, mCell As Range, myRng As Range
'
DateAddr = Application.Intersect(Interv, Range("A1:A100")).Address
myMese = UCase(ActiveSheet.Range("H1"))
For I = ActiveSheet.Index To ActiveSheet.Index + 1
    For Each mDay In Sheets(I).Range(DateAddr)
        If UCase(Format(mDay, "mmmm")) = myMese Then
            Set myRng = Application.Intersect(Sheets(I).Range(mDay.Address).Offset(0, 2).Resize(1, 6), _
                Sheets(I).Range(Interv.Address), Sheets(I).Range("C:C, E:E, G:G"))
            For Each mCell In myRng
                If mCell > 0 Then myCnt = myCnt + 1
            Next mCell
        End If
    Next mDay
Next I
pippotri = myCnt
End Function


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

Re: conteggio presenze

Postdi trittico69 » 07/05/12 18:29

adesso va bene grazie
trittico69
Utente Senior
 
Post: 497
Iscritto il: 16/08/09 18:41


Torna a Applicazioni Office Windows


Topic correlati a "conteggio presenze":


Chi c’è in linea

Visitano il forum: Nessuno e 51 ospiti