Moderatori: Anthony47, Flash30005
Function Xstra(Data, InOuTable, DefOrario, TipoXstra, Optional TotH) As Single
'Data=cella contenente la data; InOuTable=prima delle 4 timbrature (E-U, E-U)
'DefOrario=indirizzo tabella con la matrice gg/hh/tipo di straordinario
'TipoXstra= valore del "tipo" richiesto; oppure 0=Ore lavorate
'
Dim GSett As Integer
Dim In1 As Single: Dim In2 As Single: Dim CTy As Single
Dim Out1 As Single: Dim Out2 As Single
Dim WHours As Single
Dim DefCols As Integer: Dim I As Integer: Dim CT As Integer
Dim TabTy(16) As Single: Dim TabTy0 As Single: Dim TabTyOld As Single
If TipoXstra > 16 Then Exit Function
If DefOrario <> "DefOrari" Then Exit Function
Application.Volatile
'aaaa = Data
GSett = Weekday(Data, vbMonday)
'MODIF --->
If GSett < 6 Then
If Data.Offset(0, 1) = 1 Then
GSett = (9 + Data.Offset(1, 1))
Else
If Data.Offset(1, 1) = 1 Then GSett = 8
End If
End If
If Weekday(Data, vbMonday) = 6 Then
If Data.Offset(0, 1) = 1 Then
GSett = 10
Else
GSett = 6
End If
End If
If Weekday(Data, vbMonday) = 7 Then
If Data.Offset(1, 1) = 1 Then GSett = 10
End If
'<--MODIF
In1 = InOuTable
Out1 = InOuTable.Offset(0, 1).Value + (InOuTable.Offset(0, 1) < In1) * -1
'In2 = InOuTable.Offset(0, 2).Value + (InOuTable.Offset(0, 2) < InOuTable.Offset(0, 1)) * -1
1 'MODIF:
If InOuTable.Offset(0, 2).Value = 0 Then In2 = Out1 Else: In2 = InOuTable.Offset(0, 2).Value + (InOuTable.Offset(0, 2) < Out1) * -1
'MODIF:
If InOuTable.Offset(0, 3).Value = 0 Then Out2 = In2 Else Out2 = InOuTable.Offset(0, 3).Value + (InOuTable.Offset(0, 3).Value < In2) * -1
DefCols = DefOrario.End(xlToRight).Column - DefOrario.Column
WHours = Out2 - In2 + Out1 - In1
If TipoXstra = 0 Then
Xstra = WHours: Exit Function
End If
Xstra = WHours - DefOrario.Offset(GSett, 1)
If Xstra <= 0.0001 Then '<= 9 sec
Xstra = 0: Exit Function
End If
For I = DefCols To 2 Step -1
If Out2 > DefOrario.Offset(0, I) Then Exit For
Next I
CalcTy:
CT = DefOrario.Offset(GSett, I + 1)
TabTy0 = Out2 - DefOrario.Offset(0, I)
If In2 >= DefOrario.Offset(0, I) Then TabTy0 = TabTy0 + DefOrario.Offset(0, I) - In2
If Out1 >= DefOrario.Offset(0, I) Then TabTy0 = TabTy0 + Out1 - DefOrario.Offset(0, I)
If In1 >= DefOrario.Offset(0, I) Then TabTy0 = TabTy0 + DefOrario.Offset(0, I) - In1
TabTy0 = TabTy0 - TabTyOld
TabTy(CT) = TabTy0 + TabTy(CT)
TabTyOld = TabTyOld + TabTy0
Xstra = Xstra - TabTy0
If Xstra <= 0.00001 Then
TabTy(CT) = TabTy(CT) + Xstra
Xstra = TabTy(TipoXstra)
Exit Function
End If
I = I - 1
If I > 1 Then GoTo CalcTy
Xstra = "XXX" 'Errore, I=<2 e non ancora completato il calcolo
End Function
=SE(E(CONTA.SE(festivi;A4)>0;B4="Riposo");1;0)
spero di essere stato chiaro
=SE(SOMMA(--(($A8:$A16)*($B8:$B16)=1))>0;SOMMA(A$1:A$30);0)
=SE(SOMMA(--(($A17:$A30)*($B17:$B30)=1))>0;SOMMA(A$1:A$30);0)
Che c'entra il foglio successivo con quello che hai descritto?in tutto deve proseguire per il foglio successivo che é il mese successivo
=SE(Y4=1;MATR.SOMMA.PRODOTTO(--(C5:C18<=(C4+10));--(Z5:Z18=1));"")
=SE(Y4=1;1-AA4;"")
=INDIRETTO(INDIRIZZO(RIF.RIGA(C4);RIF.COLONNA(C4);4;1;TESTO(FINE.MESE($C13;0)+1;"mmmm")))
La formula che ti ho dato valeva se "No, non si possono lavorare piu' Riposo senza aver prima fatto il recupero precedente" e usava la colonna Z per marcare le righe che dovevano essere intese come Recuperi.Ho provato le formule, il concetto è corretto ma non mi da il risultato sperato
(in U4 ho la rilevazione "1" del giorno di riposo lavorato con questa formula [=CONTA.SE(B4;"*Riposo/*")] ecco perché in B4 ho le due voci [Riposo] e [Riposo/] con menù a tendina) Quindi Es. B4 "Riposo/", U4 "1"
(in V4 ho la rilevazione "1" del giorno che rileverò quando recupero il giorno di riposo con questa formula [=CONTA.SE(B4;"Recupero Riposo")] quindi in B4 ho anche la voce [Recupero Riposo] nel menù a tendina) Quindi Es. B6 "Recupero Riposo", V6 "1"
Es.
B4 "Riposo/", U4 "1"
B14 "Recupero Riposo", V16 "1" (dentro i 7 sette giorni effettivamente lavorati) magg. 30%
B12 "Riposo/" U12 "1"
B14 "Recupero Riposo", V23 "1" (oltre i 7 sette giorni effettivamente lavorati) magg. 40%
5) Evitate di pubblicare strutture dati diverse da quelle che in realta' dovete gestire, a meno che non siete certi di riuscire ad adattare autonomamente le risposte che vi verranno fornite.
Questa non l'ho capita, perche' dagli "1" in col U e V non si capisce se la maggiorazione deve essere al 30% o al 40%. Insomma il calcolo lo dovrai fare su un'altra colonna dove metteremo l'esito della verifica della distanza tra Lavorato e Recuperato.Di conseguenza calcolerò le maggiorazioni del 30% in V35, cioè deve sommare solo i giorni che ho recuperato nei famosi 7 giorni in modo da fare Es. =E35+magg.30%= €35,00
e calcolerò le maggiorazioni del 40% in V36, cioè deve sommare solo i giorni che ho recuperato oltre famosi 7 giorni in modo da fare Es. =E36+magg.40%= €40,00
in U35 ho la somma della colonna U in V35 quella di V, in U36 ho la sottrazione tra U35 e V35 in caso che Es. lavoro due riposi ma ne recupero solo uno in quanto i giorni li dovrò sempre recuperare non c'è un termine un mese un anno si sommano sempre.
=INDIRETTO(INDIRIZZO(RIF.RIGA(V2);RIF.COLONNA(V2);4;1;TESTO(FINE.MESE($C13;-1);"mmmm")))
=MATR.SOMMA.PRODOTTO(--(MESE(C4:C45)=MESE(C13));U4:U45)-MATR.SOMMA.PRODOTTO(--(MESE(C4:C45)=MESE(C13));V4:V45)+U2
=INDIRETTO(INDIRIZZO(RIF.RIGA(U4);RIF.COLONNA(U4);4;1;TESTO(FINE.MESE($C13;0)+1;"mmmm")))
=SOMMA(V$4:V4)-$U$2
Function myRecuperi(ByRef myWorkRec As Range, ByRef myData As Range, Optional ByVal myDb As Boolean = False) As Variant
Dim WArr1, WArrD, myOut() As String, I As Long, J As Long, UBW1 As Long, LBW1 As Long
Dim myCDate As Date, Paired As Boolean, WCnt As Long, myD As Double
ReDim myOut(1 To myWorkRec.Rows.Count)
If myWorkRec.Rows.Count <> myData.Rows.Count Then
myOut = CVErr(xlErrValue): myRecuperi = myOut
Exit Function
End If
WArr = myWorkRec.Value
WArrD = myData.Value
UBW1 = UBound(WArr, 1)
LBW1 = LBound(WArr, 1)
ReDim myOut(LBW1 To UBW1)
For I = LBound(WArr, 1) To UBW1
If WArr(I, LBW1) = 1 And Month(WArrD(I, 1)) = Month(WArrD(1, 1)) Then
Paired = False: WCnt = WCnt + 1
myCDate = WArrD(I, 1)
For J = I + 1 To UBW1
If myDb Then myD = J / 1000
If WArr(J, LBW1 + 1) = 1 And WArr(J, LBW1 + 2) = WCnt Then
Paired = True
If WArrD(J, 1) < myCDate + 10 Then
myOut(I) = 1 + myD
Else
myOut(I) = 2 + myD
End If
Else
'nulla
End If
If Paired Then Exit For
Next J
If Not Paired Then myOut(I) = "P"
End If
Next I
myRecuperi = Application.WorksheetFunction.Transpose(myOut)
End Function
=myRecuperi(U4:W44;C4:C44)
Torna a Applicazioni Office Windows
Come impostare il formato data predefinito in excel? Autore: wallace&gromit |
Forum: Applicazioni Office Windows Risposte: 5 |
Creare un file Excel con fogli visibili in base all'accesso Autore: JanVathek |
Forum: Applicazioni Office Windows Risposte: 24 |
Screenshot automatizzato fogli excel:script?macro o...? Autore: Paolo67met |
Forum: Programmazione Risposte: 9 |
Visitano il forum: Nessuno e 14 ospiti