VBA quesito per divertimento



  • VBA quesito per divertimento
    di Raffaele_53 (utente non iscritto) data: 16/08/2014 21:29:19

    Da un'altro forum, una problematica che non riesco a fare (dopo farò la somma).
    Mettere in colonna I le ore lavorate dalle ore 06:00:00 sino alle 22:00:00
    Mettere in colonna J le ore lavorate dopo le ore 22:00:00 sino alle ore 06:00:00 del giorno dopo
    Caso anamalo, se l'orario fosse anteriore alle 22:00:00 e superiore alle 06:00:00, mettere in I l'orario precedente, in J = 8 ore e in K il rimanente dell'orario
    Allegato con un pezzo di codice (non funzionante)



  • di lepat (utente non iscritto) data: 16/08/2014 22:46:02

    prova questa
     
    Sub calcola()
    Dim UR As Long, X As Long, DD1 As Long, DD2 As Long
    Dim Tot As Date, Tot1 As Date, Tot2 As Double
    Dim Inizio1 As Date, Fine1 As Date, Inizio As Date, Fine As Date
    Inizio1 = #6:00:00 AM# 'orario inizio normale
    Fine1 = #10:00:00 PM# 'orario fine normale
    UR = Range("A" & Rows.Count).End(xlUp).Row
        For X = 2 To UR
            DD1 = Day(Cells(X, 4))
            DD2 = Day(Cells(X, 5))
            Inizio = Format(Cells(X, 4), "hh:mm:ss")
            Fine = Format(Cells(X, 5), "hh:mm:ss")
            Tot = 0
            If Fine <= Fine1 And Inizio <= Fine1 And Inizio >= Inizio1 Then
              If DD2 = DD1 Then
                    Tot = Format(Fine - Inizio, "hh:mm:ss")
    '                Tot1 = Tot1 + Tot
              Else
                Tot = Format(Fine1 - Inizio, "hh:mm:ss")
    '            Tot2 = Tot2 + Tot
              End If
            End If
            Cells(X, 9) = Tot
        Next X
    End Sub
    



  • di Raffaele_53 (utente non iscritto) data: 16/08/2014 23:39:08

    Ciao Lepat
    Per FarMi capire ho chiesto il risultato in colonne (vorrei solo il totale delle Ore Diurne e Notturne) tramite VBA
    Se noti, alcuni Orario inizio sono del giorno precedente.EX Riga3--> Risultato interventi...
    I3 =nulla, dato che ha iniziato dopo le 22:00
    J3= 01:10:09 = Orario notturno
    K3= nulla dato che ha finito prima delle 06:00

    Altro ipotetico esempio, Inizio ore 21:30 e Fine ore 06:30 del giorno successivo.
    Colonna I = 0:30:00 'diurno ha iniziato prima delle 22:00
    Colonna J = 8:00:00 'Orario Notturno
    Colonna H = 0:30:00 'Di nuovo diurno (che verrà sommato alla colonna I , differente da "Orario notturno" "colonna J")

    Ps. Non c'è bisogno di scriverli in colonna, basta la somma totale degli orari diurni/notturni
    PPs. Il totale lavorato è già in colonna G

    @ninai, cosa useresti MATR.SOMMA.PRODOTTO? Dopo Ti copio in VBA.



  • di Raffaele_53 (utente non iscritto) data: 17/08/2014 11:39:14

    Questa l'ho trovata con g o o g l e, dall'allegato
    I2 =STRINGA.ESTRAI(D2;12;8)
    J2 =STRINGA.ESTRAI(E2;12;8)
    K2 =RESTO(E2-D2;1)
    L2 =ASS(K2-M2) --->Diurne
    M2 =ASS((RESTO(J2-I2;1)*24-(J2Notturne
    Orario Turni 6-22 che si possono cambiare nella formula in M2

    Però in VBA non so proprio da che parte iniziare



  • di Raffaele_53 (utente non iscritto) data: 17/08/2014 11:40:42

    Errata corrige
     
    M2 =ASS((RESTO(J2-I2;1)*24-(J2Notturne



  • di lepat (utente non iscritto) data: 17/08/2014 12:22:50

    cosa c'è che non va nella mia macro ?



  • di Raffaele_53 (utente non iscritto) data: 17/08/2014 15:52:02

    Ciao Lepat,
    Alcune righe non le calcola e non fa distinzione tra notturno/diurno
    Vedi allegato Raf-gg



  • di lepat (utente non iscritto) data: 17/08/2014 16:46:16

    la mia macro calcola solo il diurno, mi sembra che funzioni, era solo il primo step e volevo sapere se ti andava bene



  • di lepat (utente non iscritto) data: 17/08/2014 18:04:12

    quella definitiva (un po' contorta), valida per il tuo allegato è (dovrebbe essere)
     
    Sub calcola2()
    Dim UR As Long, X As Long, DD1 As Long, DD2 As Long
    Dim Tot As Date, Tot1 As Date, Tot2 As Double
    Dim Inizio1 As Date, Fine1 As Date, Inizio As Date, Fine As Date, mezzanotte As Date, ore2 As Date
    Inizio1 = #6:00:00 AM# 'orario inizio normale
    Fine1 = #10:00:00 PM# 'orario fine normale
    ore2 = #2:00:00 AM#
    UR = Range("A" & Rows.Count).End(xlUp).Row
        For X = 2 To UR
            DD1 = Day(Cells(X, 4))
            DD2 = Day(Cells(X, 5))
            Inizio = Format(Cells(X, 4), "hh:mm:ss")
            Fine = Format(Cells(X, 5), "hh:mm:ss")
            Tot = 0
            If Fine <= Fine1 And Inizio <= Fine1 And Inizio >= Inizio1 Then
              If DD2 = DD1 Then
                    Tot = Format(Fine - Inizio, "hh:mm:ss")
              Else
                Tot = Format(Fine1 - Inizio, "hh:mm:ss")
              End If
              Cells(X, 14) = Format(Tot, "hh:mm:ss")
            End If
            If Fine <= Inizio1 Then ' And Inizio >= Fine1 Then
              If DD2 = DD1 Then
                Tot = Format(Fine - Inizio, "hh:mm:ss")
              Else
                If Inizio < Fine1 Then Inizio = Fine1
                Tot = Format(ore2 + Fine - Inizio + Fine1, "hh:mm:ss")
              End If
              Cells(X, 15) = Format(Tot, "hh:mm:ss")
            
            End If
    
        Next X
    End Sub
    
    



  • di Raffaele_53 (utente non iscritto) data: 17/08/2014 18:33:01

    Complimenti
    Funziona ed è perfetta.



  • di lepat (utente non iscritto) data: 17/08/2014 20:07:35

    sul perfetta non sono d'accordo, credo che sia un esempio di cattiva programmazione, il risultato è ottenuto mettendo varie pezze quà e là



  • di Raffaele_53 (utente non iscritto) data: 23/08/2014 16:54:33

    Ciao lepat
    Scusa se ritorno sul quesito, mi sembrava che fosse più articolato.
    Invece col Tuo codice sembrava facile, purtroppo aggiungendo una riga
    Cremeria luca 4 2014-08-07 23:52:34 2014-08-08 13:31:51 Free overtime 13:39:17 0
    Non viene calcolato. Non ho testa per risolvere.
    Mi sembra che si debba calcolare diverse opzioni



  • di lepat (utente non iscritto) data: 23/08/2014 18:00:31

    te l'avevo detto che era mal riuscito, comunque non riesco ad aggiungere la riga, mi cambia formato



  • di Raffaele_53 (utente non iscritto) data: 23/08/2014 19:56:16

    Faccio una prova per vedere se riesco a scrivere una formula, dopo che nei post sopra era incompleta.
    Mi piacerebbe tramutare questa formula senza gli "" in VBA
    "=ASS((RESTO(J2-I2;1)*24-(J2 
    "=ASS((RESTO(J2-I2;1)*24-(J2



  • di Raffaele_53 (utente non iscritto) data: 23/08/2014 19:59:53

    Vedo la formula incompleta sia nel testo che in codice VBA, non saprei come fare a meno di spostare un altro allegato con la formula in una determinata cella.



  • di Raffaele_53 (utente non iscritto) data: 23/08/2014 20:12:39

    Ho allegato il file lello.zip
    Mi piacerebbe tramuttare la formula in M2 con codice VBA



  • di lepat (utente non iscritto) data: 24/08/2014 07:28:29

    non ho capito bene, vuoi una soluzione vba o applicare la formula tramite vba ?



  • di Raffaele_53 (utente non iscritto) data: 30/08/2014 15:54:59

    Un ringraziamento a Lepat
    Mi hanno cambiato le carte in tavola che adesso non c'entra più nulla col quesito fatto.
    Calcolo ore tramite codice, in base all'orario entrata/uscita determina il diurno/notturno con una variazione all'orario annullabile comunque.
    Può calcolare ogni 15 minuti oppure 30 minuti
    Se serve lo allego