Differenza tra date



  • Differenza tra date
    di Gava (utente non iscritto) data: 04/08/2015 16:48:54

    Salve a tutti
    ho questo problema che mi assilla. Vi ringrazio in anticipo se riuscite a risolverlo

    Ho la seguente tabella con dati incolonnati:
    DATA Lotto mc caricati mc scaricati
    09/03/15 Lotto 1 2,5
    18/03/15 Lotto 1-c 2,5
    10/04/15 Lotto 2 0,5
    14/05/15 Lotto 2-c 0,5
    03/06/15 Lotto 3 4
    11/06/15 Lotto 4 4
    18/06/15 Lotto 3/4-c 8
    12/06/15 Lotto 5 8
    19/06/15 Lotto 5-c 8
    16/07/15 Lotto 6 2

    Nella colonna 1 sono indicate delle date, mentre nella colonna 2 viene caricato il Lotto con numero progressivo (es. Lotto 1).
    In colonna 3 sono indicati i volumi caricati che corrispondono al Lotto (es: Lotto 1 sono stati caricati 2,5 mc in data 9/3/15)
    In colonna 4 sono invece indicati i volumi scaricati che sono evidenziati dallo stesso lotto progressivo, ma con la lettera c (es. Il lotto 1 è stato scaricato il 18/3/15 per un volume uguale a quello caricato.
    Qual'è l'obbiettivo?
    determinare il numero di giorni che sono trascorsi tra il carico e scarico dello stesso lotto (es. prendendo come esempio il Lotto 1. Questo è stato caricato in data 9/3 e scaricato in data 18/3: pertanto i giorni trascorsi saranno 9 giorni. La macro dovrebbe restituire il numero 9.
    La complicazione deriva dal fatto che possono essere scaricati più lotti cintemporaneamente (es: il Lotto 3 è stato caricato in data 3/6 e il Lotto 4 in data 11/6; successivamente i due lotti sono stati scaricati (Lotto 3%4-c) in data 18/6: pertanto i giorni trascorsoi sono 15.

    Non so che pesci prendere, qualcuno può aiutarmi?




  • di Vecchio Frac data: 04/08/2015 18:44:52

    Purtroppo la formattazione è andata e si capisce male, la tabella è simile a questa vero?


    DATA Lotto mc caricati mc scaricati
    09/03/2015 Lotto 1 2,5
    18/03/2015 Lotto 1-c 2,5 
    10/04/2015 Lotto 2 0,5
    14/05/2015 Lotto 2-c 0,5 
    03/06/2015 Lotto 3 4
    11/06/2015 Lotto 4 4
    18/06/2015 Lotto 3/4-c 8 
    12/06/2015 Lotto 5 8
    19/06/2015 Lotto 5-c 8 
    16/07/2015 Lotto 6 2


    La domanda è: se due lotti vengono scaricati insieme, la notazione utilizzata è sempre quella indicata? cioè con la barra "/" ?
    Certo bisogna pensarci un attimo e costruire un codice che giri, ma è fattibile.




  • Differenza tra date
    di Gava (utente non iscritto) data: 04/08/2015 22:11:49

    Ciao...si la formattazione è quella che hai indicato tu a parte la seconda riga dove il valore 2,5 è da spostare sulla colonna a destra (mc scaricati).

    Per l'altra domanda: non è necessario che ci sia (/), deve solo dare l'idea che lo scarico riguarda più di un carico.

    grazie Vecchio Frac



  • di patel data: 05/08/2015 07:13:45

    allega un file di esempio con poche righe ed anche il risultato desiderato





  • di Vecchio Frac data: 05/08/2015 08:38:55

    cit. " a parte la seconda riga dove il valore 2,5 è da spostare sulla colonna a destra (mc scaricati). "
    ---> Sì infatti c'è un "-c" nel nome del lotto.

    cit. "non è necessario che ci sia (/), deve solo dare l'idea che lo scarico riguarda più di un carico"
    ---> Da qui capisco che l'unico criterio fisso da considerare è la presenza di "-c" nel nome del lotto, che indica uno scarico della merce. E' importante che ci sia un criterio discriminante stabile altrimenti non ci sarà nessuna regola da applicare (quindi: scrivi come vuoi, anche "lotto 2 e 3 -c", l'importante è che ci sia *sempre* e invariabilmente l'accoppiata "-c" (scritto proprio "trattino-c" senza spazi).
    Avevo buttato giù una prima bozza, ora vedo di concluderla.




  • Differenza tra date
    di Gava (utente non iscritto) data: 05/08/2015 08:57:47

    Ciao

    Di fatto i criteri sono 2:

    1) quello che dicevi Tu, cioè che la lettera c finale chiude lo scarico pertanto rappresenta il primo elemento per la differenza tra le date: cioè [Lotto 2-c (data) - Lotto 2 (data)]

    2) l'altro criterio è: che uno scarico potrebbe incorporare più carichi (vedi ad esempio Lotto 3 e 4) che sono stati caricati in date diverse (rispettivamente: 3/6 e 11/6) ma sono stati scaricati tutti e due i lotti in data 18/6 pertanto la differenza dovrà essere tra il primo carico (Lotto3: 3/6) e lo scarico (Lotto 3/4 la "/" per indicare che sono più lotti: 18/6)

    spero di essere stato esaustivo



  • di Vecchio Frac data: 05/08/2015 09:35:34

    Sì, non del tutto però, adesso resta da definire come vuoi rendere i dati.
    Se lo scarico riguarda un lotto singolo trovo logico mettere la differenza in date nella riga dello scarico.
    Ma se lo scarico riguarda un lotto multiplo diventa soggettivo come restituire l'informazione.
    Per far capire meglio allego il codice che ho buttato giù finora.
    Mi sembra che funziona bene (fai comunque dei test) anche se sembra un po' contorto :)
    Alla tua tabella iniziale ho aggiunto la colonna E (differenza in giorni) e la colonna F (status) nella quale aggiungo informazione sullo stato del lotto (caricato, scaricato, scaricato successivamente se multiplo, non scaricato).
    La macro deve essere completata perchè non so come rendere l'informazione riguardo allo scarico dei lotti multipli ma prima di continuare dagli un occhio e dicci se continuare o modificare qualcosa.





  • di Vecchio Frac data: 05/08/2015 09:35:56

    Ho dimenticato di allegare il codice ^_^
     
    Option Explicit
    
    Sub calc_diffdays()
    Dim rg As Range, cell As Range, c As Range
    Dim num_lotto() As Integer, tmp() As Integer, i As Long, s As String
    Dim k As Integer, m As String, scaricato_multiplo As Boolean, z As Integer
    Dim date1 As Date, date2 As Date
    
        Set rg = Range("b2:b" & Range("b2").End(xlDown).Row)
        Range("f2:f" & Range("b2").End(xlDown).Row).ClearContents
       
        For i = 1 To rg.Rows.Count
            s = rg(i)
            num_lotto() = strip_numbers(s)
            If num_lotto(0) = 1 Then
                'lotti singoli
                If InStr(s, "-") = 0 Then
                    'lotti singoli "caricati"
                    Cells(i + 1, "F") = "caricato " & num_lotto(1)
                    date1 = Cells(i + 1, "A")
                    Set c = rg.Find(s & "-c", lookat:=xlWhole)
                    If c Is Nothing Then
                        'lotti non scaricati
                        scaricato_multiplo = False
                        For k = i + 1 To rg.Rows.Count
                            tmp() = strip_numbers(rg(k))
                            If tmp(0) > 1 Then
                                For z = 1 To tmp(0)
                                    If num_lotto(1) = tmp(z) Then scaricato_multiplo = True
                                Next
                            End If
                        Next
                        If scaricato_multiplo Then
                            Cells(i + 1, "F") = Cells(i + 1, "F") & " (scaricato successivamente)"
                        Else
                            Cells(i + 1, "F") = "caricato ma non scaricato " & num_lotto(1)
                        End If
                    Else
                        'lotti singoli "scaricati"
                        Cells(c.Row, "F") = "scaricato " & num_lotto(1)
                        date2 = Cells(c.Row, "A")
                        Cells(c.Row, "E") = DateDiff("d", date1, date2)
                    End If
                
                End If
            Else
                'lotti multipli
                m = ""
                For k = 1 To num_lotto(0)
                    m = m & num_lotto(k) & ", "
                Next
                Cells(i + 1, "F") = "scaricati " & Left(m, Len(m) - 2)
            End If
            
        Next
        
    
    
    End Sub
    
    
    Private Function strip_numbers(s As String) As Variant
    Dim i As Integer, m As String, j As Integer, arr() As Integer
    
        j = 0
        For i = 1 To Len(s)
            m = Mid(s, i, 1)
            If m Like "[0-9]" Then
                j = j + 1
                ReDim Preserve arr(j) As Integer
                arr(j) = Val(m)
            End If
        Next
        arr(0) = j
        strip_numbers = arr()
    End Function
    





  • Differenza tra date
    di Gava (utente non iscritto) data: 05/08/2015 10:20:17

    Vi ho allegato il file per semplificazione



  • di Vecchio Frac data: 05/08/2015 10:57:46

    Con un esempio è meglio ^_^
    Nel frattempo ho ottimizzato la procedura.
    Adesso la adatto al tuo foglio.
    La differenza in giorni la vuoi in colonna A? Altre informazioni (caricato successivamente, non scaricato, ecc.) ti servono?





  • di Vecchio Frac data: 05/08/2015 11:01:05

    Ma scusa, nel caso "lotto 3/4c", la differenza in giorni è determinata dal valore del primo lotto? in questo caso il 3? io ho fatto in modo di differenziare l'informazione per cui ad ogni lotto avrai la differenza in giorni corrispondente.





  • di Vecchio Frac data: 05/08/2015 11:23:53

    Ecco la mia proposta aggiornata, tarata sul file che hai allegato.
    Ho preferito lasciare che in colonna L si sviluppassero i commenti su carico/scarico, cosa che puoi togliere in una fase successiva (le righe corrispondenti sono marcate nel codice con "<<< debug only").
    Rimane la perplessità dei post precedenti, intanto vedi come va questo codice.
     
    Option Explicit
    
    Sub calc_diffdays()
    Dim rg As Range, cell As Range, c As Range
    Dim num_lotto() As Integer, tmp As Variant, i As Long, s As String
    Dim k As Integer, m As String, scaricato_multiplo As Boolean
    Dim date1 As Date, date2 As Date, f As String
    Dim re As Object, strip_numbers As Variant, v As Variant
    Dim carico As Collection, scarico As Collection
    Dim initial_row As Long, end_row As Long
        
        initial_row = Range("C2:C1000").Find("Lotto", lookat:=xlWhole).Row + 1
        
        Set re = CreateObject("VBScript.RegExp")
        re.Pattern = "(d+)"
        re.IgnoreCase = True
        re.Global = True
        
        Set rg = Range(Cells(initial_row, "C"), Cells(Cells(initial_row, "C").End(xlDown).Row, "C"))
        end_row = initial_row + rg.Rows.Count - 1
    
        Range("A13:A100").ClearContents
        Range("L13:L100").ClearContents         '<<< debug only
       
        Set carico = New Collection
        Set scarico = New Collection
        
        For i = initial_row To end_row
            s = rg.Cells(i - initial_row + 1)
            Set strip_numbers = re.Execute(s)
            If strip_numbers.Count = 1 Then
                'lotti singoli
                If InStr(s, "-") = 0 Then
                    'lotti singoli "caricati"
                    Cells(i, "L") = "caricato " & strip_numbers(0)      '<<< debug only
                    date1 = Cells(i, "B")    'data di carico del lotto
                    Set c = rg.Find(s & "-c", lookat:=xlWhole)
                    If c Is Nothing Then
                        'lotti non scaricati
                        scaricato_multiplo = False
                        For k = i + 1 To end_row
                            Set tmp = re.Execute(rg.Cells(k - initial_row + 1))
                            If tmp.Count > 1 Then
                                For Each v In tmp
                                    If strip_numbers(0) = Trim(v) Then scaricato_multiplo = True
                                Next
                            End If
                        Next
                        If scaricato_multiplo Then
                            Cells(i, "L") = Cells(i, "L") & " (scaricato successivamente)"       '<<< debug only
                            carico.Add Cells(i, "B"), (strip_numbers(0))
                        Else
                            Cells(i, "L") = "caricato ma non scaricato " & strip_numbers(0)         '<<< debug only
                        End If
                    Else
                        'lotti singoli "scaricati"
                        Cells(c.Row, "L") = "scaricato " & strip_numbers(0)     '<<< debug only
                        date2 = Cells(c.Row, "B")
                        Cells(c.Row, "A") = DateDiff("d", date1, date2)
                    End If
                End If
            Else
                'lotti multipli
                m = "": f = ""
                For Each v In strip_numbers
                    m = m & Trim(v) & ", "
                    date1 = carico((v))
                    date2 = Cells(i + 1, "B")
                    f = f & Trim(v) & ": " & DateDiff("d", date1, date2) & " giorni, "
                Next
                Cells(i, "A") = Left(f, Len(f) - 2)
                Cells(i, "L") = "scaricati " & Left(m, Len(m) - 2)      '<<< debug only
            End If
        Next
    
    End Sub
    






  • di Vecchio Frac data: 05/08/2015 11:26:11

    Allego anche il file ("esempio differenza date VF1") per comodità.




  • Differenza tra date
    di Gava (utente non iscritto) data: 05/08/2015 11:26:13

    Ciao,

    rispondo ai tuoi quesiti.
    Intanto ti dico che ho provato il progetto è funziona bene, rimane come risolvere la questione dei lotti multipli

    La differenza in giorni va sulla colonna A
    Le informazioni caricato etc.. non sono necessarie
    Nel caso di lotti multipli la differenza deve essere fatta tra il Lotto finale scaricato (che contempla più lotti Es. Lotto 3/4-c) e il primo dei lotti multipli (Lotto 3)



  • di Vecchio Frac data: 05/08/2015 11:26:54

    cit. "Nel caso di lotti multipli la differenza deve essere fatta tra il Lotto finale scaricato (che contempla più lotti Es. Lotto 3/4-c) e il primo dei lotti multipli (Lotto 3)"
    ---> Ah ecco... ora ti modifico il codice.




  • Differenza tra date
    di Gava (utente non iscritto) data: 05/08/2015 11:52:21

    Scusa dimenticavo un ultima cosa .

    Il lotto 6 che è stato caricato il 16 Luglio, come puoi vedere ad oggi non ha avuto alcuno scarico. In quel caso la differenza dovrà essere tra la data odierna e la data di carico cioè oggi()- data 16/7



  • di Vecchio Frac data: 05/08/2015 12:05:48

    ok, credo di essere riuscito a semplificare un po' :)
     
    Option Explicit
    
    Sub calc_diffdays()
    Dim rg As Range, c As Range
    Dim i As Long, s As String
    Dim date1 As Date, date2 As Date
    Dim re As Object, strip_numbers As Variant
    Dim j As Long
    Dim initial_row As Long, final_row As Long
    
    
        initial_row = Range("C2:C1000").Find("Lotto", lookat:=xlWhole).Row + 1
        Set rg = Range(Cells(initial_row, "C"), Cells(Cells(initial_row, "C").End(xlDown).Row, "C"))
        final_row = initial_row + rg.Rows.Count - 1
    
        Set re = CreateObject("VBScript.RegExp")
        re.Pattern = "(d+)"
        re.IgnoreCase = True
        re.Global = True
        
        Range("A13:A100").ClearContents
        
        j = 0
        For i = initial_row To final_row
            s = rg.Cells(i - initial_row + 1)
            j = j + 1
            If InStr(s, "c") > 0 Then
                date2 = rg.Cells(i - initial_row + 1).Offset(, -1)
                Set strip_numbers = re.Execute(s)
                Set c = Range(Cells(initial_row, "C"), Cells(final_row, "C")).Find("Lotto " & strip_numbers(0), LookIn:=xlValues)
                date1 = c.Offset(, -1)
                Cells(i, "A") = DateDiff("d", date1, date2)
                j = 0
            End If
        Next
        
        If j <> 0 Then
            'un carico è rimasto in sospeso, l'ultimo
            Cells(i, "A") = DateDiff("d", Cells(i - 1, "B"), Now)
        End If
    
    End Sub
    





  • Differenza tra date
    di Gava (utente non iscritto) data: 05/08/2015 14:21:30

    Grazie Vecchio Frac, funziona perfettamente.

    Visto che ho potuto saggiare la tua bravura e considerato che l'appetito viene mangiando ti chiederei un'ulteriore upgrade.

    Partendo sempre dal file che ti ho inviato, sarebbe interessante che la generazione dei Lotti avvenisse in automatico (sempre nella stessa colonna) in relazione all'imputazione da parte mia di numeri che vanno nella colonna "D" ed "F" (quelle colorate in giallo per intendersi). Naturalmente man mano che introduco il numero in colonna "D" (mc caricati) mi genera in automatico nella colonna "C" un Lotto con numero progressivo..tipo Lotto 1...Lotto 2...etc...
    Mentre quando introduco un numero nella colonna "F" (mc smaltiti) mi genera in automatico nella colonna "C" un Lotto con numero progressivo..tipo Lotto 1-c...Lotto 2-c...etc.

    Il tutto dovrebbe funzionare con Workbook_Change all'immissione del dato.

    Spero di essere stato chiaro

    grazie ancora



  • di Vecchio Frac data: 05/08/2015 15:20:38

    cit. "considerato che l'appetito viene mangiando"
    ---> ^_^
    Purtroppo oggi non posso dedicarmi ulteriormente, abbi pazienza vedo di sbrigarmi appena possibile.
    Comunque a vista quello che chiedi si dovrebbe fare agevolmente. In questo modo avresti anche il controllo assoluto sull'esattezza della dicitura inserita "Lotto n", il che è abbastanza importante per la macro già vista. L'unica perplessità che ho è sulla chiusura ("scarico") di lotti multipli. Ma direi di fare un passo alla volta e pensare prima ai casi normali.




  • Differenza tra date
    di Gava (utente non iscritto) data: 06/08/2015 08:34:24

    Mi spiegheresti l'istruzione che cosa fa?:

    CreateObject("VBScript.RegExp")
    re.Pattern = "(d+)"
    re.IgnoreCase = True
    re.Global = True



  • di Vecchio Frac data: 06/08/2015 10:24:42

    Mi sto dedicando adesso alla tua richiesta :)
    Relativamente alla domanda, ho creato un oggetto di "espressione regolare". Per la definizione e gli esempi ti rinvio a Wikipedia, la pagina è esaustiva, comunque detta in breve si tratta di una funzione che tratta una stringa, verifica se essa segue o meno un certo pattern (cioè una sequenza codificata di elementi) e infine restituisce un risultato (True o False se non ti interessano i valori di ritorno, altrimenti i gruppi o sequenze della stringa che soddisfano il pattern.
    Per esempio, data una stringa qualsiasi puoi verificare se si tratta di un indirizzo email (se contiene il carattere chiocciola "@" è un indirizzo email altrimenti no) e puoi farti restituire le parti di una stringa che costituiscono lo o gli indirizzi email: nella frase "Puoi scrivermi a casa@dominio.it oppure anche qui: ufficio@dominio.eu puoi farti restituire un array che contiene esattamente "casa@dominio.it" e "ufficio@dominio.eu" senza dover impazzire con la gestione delle stringhe (instr, mid, left, right).
    Ci sono tante versioni delle espressioni regolari, quasi una per linguaggio, alcune più potenti di altre. La versione per VBA è tra le meno potenti ma ci si può ricavare qualcosa comunque. Il mio sito di riferimento per i test è regexpal.com.

    Nel caso che ci interessa il pattern è semplicissimo: "(d+)" individua uno o più cifre numeriche (d sta per "digits") all'interno della stringa passata in argomento alla funzione e restituisce un insieme contenente i soli numeri, per cui "Lotto 1" restituisce "1", "Lotto 12" restituisce "12", "Lotto 3/4c" restituisce "3" e "4" separatamente.
    Le istruzioni successive indicano al motore di espressione regolare che la ricerca è case insensitive (inutile in verità quando si cercano numeri) e che la ricerca va compiuto sull'intera stringa.





  • di Vecchio Frac data: 06/08/2015 11:11:49

    Allego il file "esempio differenza date - VF2" modificato come da richiesta, va testato a fondo, spero sia soddisfacente.
    Numera automaticamente i Lotti in carico e, immettendo un valore in smaltimento, si preoccupa di ricercare l'ultimo lotto o la sequenza degli ultimi lotti inseriti, scrivendo la codifica "-c" per il lotto smaltito. Naturalmente scrive dove deve scrivere e inserisce la data odierna di smaltimento. In questo caso fa anche il ricalcolo automatico. Se cambi la data di smaltimento devi provvedere al ricalcolo manualmente lanciando tu la macro che calcola la differenza di date.
    Come sottigliezza finale, quando inserisci un valore di smaltimento, la macro provvede a marcare la zona Lotti caricati - Lotti scaricati di pertinenza con una riga continua per tutto il range A:K (come da tabella). Se premi Canc su una cella di smaltimento valorizzata, la riga di demarcazione dei lotti ritorna tratteggiata.

    Prova un po' a pasticciare e riportami eventuali anomalie.




  • Differenza tra date
    di Gava (utente non iscritto) data: 06/08/2015 11:36:39

    Non riesco a farlo funzionare. Immetto i valori nei campi mc caricati e mc smaltiti, ma non introduce il numero di lotto progressivo. Sbaglio qualcosa ?



  • di Vecchio Frac data: 06/08/2015 11:54:51

    Le macro sono attivate?





  • di Vecchio Frac data: 06/08/2015 11:57:36

    Forse ho allegato il file su cui ho fatto i test, e in quel file ho fatto per sicurezza una copia del foglio originale "amianto-cemento amiant" (che è stato rinominato come "amianto-cemento amiant (2)"). Devi quindi assicurarti di lavorare nel foglio chiamato "amianto-cemento amiant" per far funzionare il codice (che lavora solo nelle celle gialle come da indicazioni).

    Anzi puoi eliminare pure tranquillamente il foglio di test "amianto-cemento amiant (2)".




  • Differenza tra date
    di Gava (utente non iscritto) data: 06/08/2015 12:01:16

    Non riesco a capire, le macro sono attivate e il foglio per il quale ho introdotto i dati è quello giusto cioè amianto-cemento amiant , anche perchè l'altro ho visto che non ha codice




  • di Vecchio Frac data: 06/08/2015 13:27:36

    Hai notizie? Funziona? Se non funziona, descrivi esattamente i passaggi che fai.
    Del resto è semplice:
    - gli eventi si attivano solo se sono modificate le celle gialle
    - gli eventi si attivano se la modifica riguarda celle da riga 13 in giù
    - se inserisci un valore in colonna D (mc caricati) viene indicato il lotto progressivo in colonna C, mentre in colonna B viene immessa la data attuale
    - se inserisci un valore in colonna F (mc smaltiti) viene chiuso il lotto precedente (o i lotti precedenti) indicando in colonna C il numero del/dei lotti con suffisso "-c", viene inserita la data attuale in colonna B, viene lanciata la macro che calcola la differenza in giorni (che viene posizionata in colonna A)
    - se c'è un valore in colonna D, inserire un valore nella stessa riga di colonna F non produce effetto (parimenti a colonne invertite)




  • Differenza tra date
    di Gava (utente non iscritto) data: 06/08/2015 13:39:13

    No, non funziona.
    Ho cancellato i dati presenti nell'intervallo B13:F21
    Successivamente ho aggiunto in colonna D13 un valore e quindi enter - risultato: Non è successo nulla
    lo stesso risultato quando introduco un valore in colonna F13.
    Non viene generato alcun Lotto

    Non capisco



  • di Vecchio Frac data: 06/08/2015 14:14:31

    Uhm... al caso che proponi non avevo pensato purtroppo, cioè l'immissione del dato iniziale!
    Questo codice +è imperfetto. per funzionare ha bisogno che ci siano almeno "Lotto 1" e "Lotto 1-c" altrimenti annega.
    Per questo primo test quindi fai in modo di avere il primo Lotto caricato e smaltito. Il resto è invece gestito bene.
    Appena possibile faccio la correzione.




  • Differenza tra date
    di Gava (utente non iscritto) data: 06/08/2015 14:47:52

    Si in effetti come dici tu devo aggiungere il primo Lotto e la sua chiusura, poi funziona bene



  • di Vecchio Frac data: 07/08/2015 11:31:30

    Ho modificato i codici perchè funzionino a dovere.
    Ho fatto alcuni test e mi sembra che ora giri come deve, puoi da tabella vuota inserire carico e smaltimento e viene impostato in automatico anche il lotto iniziale (o i lotti se più d'uno).
    Li riporto in due post separati, così rimangano in futuro (perché allego anche il file ma questo dopo sette giorni viene rimosso dal sistema).





  • di Vecchio Frac data: 07/08/2015 11:31:59

    Codice di "calc_diffdays" (sostituisce il precedente).
     
    Option Explicit
    
    Sub calc_diffdays()
    Dim rg As Range, c As Range
    Dim i As Long, s As String
    Dim date1 As Date, date2 As Date
    Dim re As Object, strip_numbers As Variant
    Dim j As Long
    Dim initial_row As Long, final_row As Long
    
        Application.EnableEvents = False
        
        initial_row = Range("C2:C1000").Find("Lotto", lookat:=xlWhole).Row + 1
        Set rg = Range(Cells(initial_row, "C"), Cells(Cells(initial_row, "C").End(xlDown).Row, "C"))
        If rg.Cells.Count > 1048500 Then
            final_row = 13
        Else
            final_row = initial_row + rg.Rows.Count - 1
        End If
    
        Set re = CreateObject("VBScript.RegExp")
        re.Pattern = "(d+)"
        re.IgnoreCase = True
        re.Global = True
        
        With Range("A13:A100")
            .Font.Bold = True
            .ClearContents
        End With
            
        j = 0
        For i = initial_row To final_row
            s = rg.Cells(i - initial_row + 1)
            j = j + 1
            If InStr(s, "c") > 0 Then
                date2 = rg.Cells(i - initial_row + 1).Offset(, -1)
                Set strip_numbers = re.Execute(s)
                Set c = Range(Cells(initial_row, "C"), Cells(final_row, "C")).Find("Lotto " & strip_numbers(0), LookIn:=xlValues)
                date1 = c.Offset(, -1)
                Cells(i, "A") = DateDiff("d", date1, date2)
                j = 0
            End If
        Next
        
        If j <> 0 Then
            'un carico è rimasto in sospeso, l'ultimo
            Cells(i, "A") = DateDiff("d", Cells(i - j, "B"), Now)
        End If
        
        Application.EnableEvents = True
    End Sub
    






  • di Vecchio Frac data: 07/08/2015 11:32:31

    Codice dell'evento Worksheet_Change (sostituisce il precedente).
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim re As Object, strip_numbers As Variant, s As String
    Dim last As Variant, i As Long
       
        If Intersect(Target, Range("D:D, F:F")) Is Nothing Then Exit Sub
        If WorksheetFunction.CountA(Target) = 0 Then Exit Sub 'premuto Canc sulla selezione
        If Target.Row < 13 Then Exit Sub
        
        Set re = CreateObject("VBScript.RegExp")
        re.Pattern = "(d+)"
        re.IgnoreCase = True
        re.Global = True
        
        On Error GoTo exit_here
        
        Select Case Target.Column
        Case 4      'colonna D, carico
            If Target.Offset(, -1) <> "" Then Exit Sub
            If Target.Row = 13 Then
                last = 0
            Else
                s = Target.Offset(-1, -1)
                Set strip_numbers = re.Execute(s)
                last = strip_numbers(strip_numbers.Count - 1)
            End If
            Application.EnableEvents = False
            'crea nuovo lotto in carico
            Target.Offset(, -1) = "Lotto " & last + 1
            'sistema la data attuale nella colonna A
            Target.Offset(, -2) = Now
        
        Case 6      'colonna F, smaltimento
            If Target = "" Then
                With Range(Cells(Target.Row, "B"), Cells(Target.Row, "K")).Borders(xlEdgeBottom)
                    .LineStyle = xlDash
                    .Weight = xlHairline
                End With
            End If
                
            If Target.Offset(, -3) <> "" Then Exit Sub
            Application.EnableEvents = False
            s = ""
            For i = Target.Row - 1 To 13 Step -1
                If InStr(Cells(i, "C"), "c") > 0 Then
                    If s <> "" Then
                        s = Left(s, Len(s) - 1) & "-c"
                        Cells(Target.Row, "C") = "Lotto " & s
                        Cells(Target.Row, "B") = Now
                        Range(Cells(Target.Row, "B"), Cells(Target.Row, "K")).Borders(xlEdgeBottom).Weight = xlThin
                        Exit For
                    End If
                Else
                    s = re.Execute(Cells(i, "C"))(0) & "/" & s
                End If
            Next
        End Select
        
        If s <> "" Then
            If Right(s, 1) = "/" Then
                s = Left(s, Len(s) - 1) & "-c"
                Cells(Target.Row, "B") = Now
                Cells(Target.Row, "C") = "Lotto " & s
            End If
        End If
        Call calc_diffdays
        
    exit_here:
        Application.EnableEvents = True
    End Sub
    






  • di Vecchio Frac data: 07/08/2015 11:33:13

    Allego il file ("esempio differenza date - VF3").




  • Differenza tra date
    di Gava (utente non iscritto) data: 07/08/2015 12:30:43

    Grazie Vecchio Frac....funziona perfettamente.
    Sei stato d'aiuto, io nn ci sarei mai arrivato



  • di Vecchio Frac data: 07/08/2015 13:35:36

    Se non scopri altri problemi puoi marcare come "risolta" la discussione.




  • Differenza tra date
    di Gava (utente non iscritto) data: 07/08/2015 16:11:46

    Un'ultima cosa ti vorrei chiedere prima di concludere ( è solo una finezza):

    Ho visto che hai messo giustamente una linea di bordo quando si chiude un Lotto con lo smaltimento (ed Lotto 1-c) attraverso l'istruzione:
    Range(Cells(Target.Row, "B"), Cells(Target.Row, "K")).Borders(xlEdgeBottom).Weight = xlThin
    E' possibile toglierla nel caso in cui cancellassi il valore?
    Cioè se per caso ho messo erroneamente un valore nella colonna mc smaltiti, mi crea la linea di separazione. Questo però mi rimane nel caso è un valore erroneamente introdotto.



  • di Vecchio Frac data: 07/08/2015 16:25:53

    E' stato solo un vezzo stilistico ^_^
    Avevo previsto questa evenienza e l'ho realizzata nel codice del Case 6, dopo "If Target = "" Then".
    Ma se fanno casino, togli pure le righe che riguardano i bordi, non sono essenziali.
    In ogni caso le puoi aggiustare manualmente come più desideri.




  • Differenza tra date
    di Gava (utente non iscritto) data: 07/08/2015 16:36:39

    No, no è una bella idea che hai avuto.
    La tengo come istruzione.

    Ma al momento in cui cancello un valore come posso eliminarla?..per poi essere generata successivamente?



  • di Vecchio Frac data: 07/08/2015 19:24:35

    Non viene già fatto così nella colonna di smaltimento (le istruzioni subito dopo "If Target Then")?
    O intendi anche nella colonna di carico? In questo caso devi replicare le stesse istruzioni da mettere dopo Case 4.




  • Differenza tra date
    di Gava (utente non iscritto) data: 08/08/2015 09:03:15

    Come faccio a tenere aggiornato il carico secondo l'istruzione:
    If j <> 0 Then
    'un carico è rimasto in sospeso, l'ultimo
    Cells(i, "A") = DateDiff("d", Cells(i - j, "B"), Now)
    End If
    dato che l'aggiornamento viene fatto solo al momento in cui immetto un dato ?

    Cioè se apro il file in giorno dopo il dato non viene aggiornato e rimane quello del giorno precedente.



  • di Vecchio Frac data: 08/08/2015 11:50:47

    Devi lanciare manualmente la macro "calc_diffdays".
    Ossia all'apertura (evento Workbook_Open), inserisci un bel "call calc_difdays" che aggiorna la colonna A.