Macro per verificare date progressive



  • Macro per verificare date progressive
    di Jaqen77 (utente non iscritto) data: 28/08/2014 23:01:46

    Ciao a tutti e complimenti per il forum...mi sto da poco cimentando con VBA, anche con buoni risultati ma non vengo a capo di un problema, spero che qualcuno mi possa aiutare.

    Ho un file da condividere in rete ed accessibile da diversi utenti. Su un foglio faccio girare una macro che mi riporta data, ora e utente (su un altro foglio nascosto) di ogni modifica effettuata, e compila le righe in maniera progressiva; avrei quindi i record di tutte le modifiche in ordine crescente di orario. Se però un utente portasse indietro l'orario del PC e poi effettuasse una modifica non avrei più un ordine crescente ma - anche se solo in un record - decrescente.
    Ecco, io dovrei compilare una macro che mi effettuasse questo controllo sulla colonna delle date e mi segnalasse (tramite una cella compilata con VERO/FALSO o 1/0) l' "anomalia" portando una cella di controllo su VERO (o 1). Come posso fare?
    Per ora ho ovviato al problema tramite valangate di =SE(....) che però mi portano il file da 6 a 27 mega....

    Qualcuno mi dia qualche dritta...

    Intanto grazie a tutti!



  • di lepat (utente non iscritto) data: 29/08/2014 08:21:44

    allega il file con le spiegazioni



  • di Jaqen77 data: 29/08/2014 08:46:34

    Ok ci provo



  • di Jaqen77 data: 29/08/2014 09:06:23

    Ecco qua.... ho caricato il file.
    Praticamente qualsiasi modifica effettuata sul foglio4 viene registrata sul foglio 5.
    Se però cambiassi data al PC e poi inserissi qualcosa avrei nell'ordine sequenziale dei record, una riga con data "non crescente". Quello di cui ho bisogno è che sul foglio4 (o anche un altro) mi venga segnalato - tramite un 1/0 su una cella - quando si presenta questa "anomalia".
    Spero di essere stato chiaro...e grazie per l'aiuto!



  • di Grograman (utente non iscritto) data: 29/08/2014 10:06:51

    Il file allegato è vuoto



  • di Grograman (utente non iscritto) data: 29/08/2014 10:08:25

    Ah ora ho visto il codice!



  • di Grograman (utente non iscritto) data: 29/08/2014 10:16:07

    Spannometricamente:

    p.s. selezionando l'intero foglio4 ti va in overflow,
     
    Dim vOldVal
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim bBold As Boolean
    If Target.Cells.Count > 1 Then Exit Sub
    On Error Resume Next
      
      With Application
      .ScreenUpdating = False
      .EnableEvents = False
      End With
      
      If IsEmpty(vOldVal) Then vOldVal = ""
      bBold = Target.HasFormula
      With Foglio5
        
        If .Range("A1") = vbNullString Then
          .Range("A1:E1") = Array("CELLA MODIFICATA", "VECCHIO VALORE", "NUOVO VALORE", "DATA & ORA MODIFICA", "AUTORE MODIFICA")
        End If
        With .Cells(.Rows.Count, 1).End(xlUp)(2, 1)
          .Value = Target.Address
          .Offset(0, 1) = vOldVal
          With .Offset(0, 2)
            If bBold = True Then
              .ClearComments
            End If
            .Value = Target
            .Font.Bold = bBold
          End With
          .Offset(0, 3) = Format(Now, "dd/MM/yyyy h:mm:ss")
          If .Offset(-1, 3) > .Offset(0, 3) Then .Offset(0, 3) = "AIUTOOOOOOOOO"   'AGGIUNTO QUESTO
          .Offset(0, 4) = Environ("USERNAME")
        End With
        .Cells.Columns.AutoFit
      End With
    
      vOldVal = vbNullString
      
      With Application
        .ScreenUpdating = True
        .EnableEvents = True
      End With
    On Error GoTo 0
    
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      vOldVal = Target
    End Sub
    



  • di Jaqen77 (utente non iscritto) data: 29/08/2014 10:35:04

    C' è qualcosa che non va....

    ora sulla colonna "DATA & ORA MODIFICA" del Foglio5 mi riporta sempre "AIUTOOOOOOOOO".
    Su quella colonna i riferimenti di data e ora devono rimanere, però vorrei un controllo che mi indicasse (ad esempio nella cella A1 del Foglio4) se nella colonna "DATA & ORA MODIFICA" i valori in temini temporali sono sempre crescenti; in questo caso dovrei avere sempre un VERO, altrimenti un FALSO in caso ci fosse un valore che "torna indietro nel tempo.




  • di pisolo (utente non iscritto) data: 30/08/2014 09:17:14

    Avrei pensato ad una cosa di questo tipo; vedi allegato.



  • di Jaqen77 data: 03/09/2014 10:30:34

    Grande! Funziona bene ... ma volendo ottimizzare facendo si che sulla cella G1 del Foglio5 - al posto della formula =MAX($D:$D) - ci siano data e ora di apertura del file, come potrei fare?

    Grazie ancora!



  • di pisolo (utente non iscritto) data: 03/09/2014 11:38:21

    non è un problema inserire data e ora di apertura del file, basta capire cosa vuoi fare se il valore in G1 è inferiore ai valori in colonna "D".

    Vuoi chiudere il file senza salvarlo?
    Vuoi, in modo più "punitivo", chiudere Excel senza salvare i file aperti.

    Già che siamo in argomento, da Sub Verifica(), toglierei l'informazione
    Range("Foglio5!G1") = "=MAX($D:$D)"
    è ridondante.

    In realtà salverei il Foglio5 con già le intestazioni e eliminerei da Sub Worksheet_Change del Foglio4 il controllo
    If .Range("A1") = vbNullString Then
    meno controlli = più velocità d'esecuzione.



  • di Jaqen77 data: 03/09/2014 13:34:44

    In realtà il mio problema è riuscire a farmi segnalare se prima di modificare il file qualcuno ha portato indietro l'ora del PC; avendo tutti i record delle modifiche precedenti sul Foglio5 un controllo di coerenza sugli orari di modifica mi basterebbe perchè le date e gli orari delle modifiche dovrebbero essere sempre progressive e mai tornare indietro nel tempo... spero di essermi fatto capire, scusa ma mi sono affacciato da poco in questo mondo....la soluzione che mi hai dato può anche andar bene ma mi chiedevo se visto il mio scopo non sia ottimizzabile.

    Scenario: Gino modifica il file oggi e Paolo lo fa domani, ed è tutto OK.
    Pino domani porta indietro la data del PC e lo modifica un giorno indietro: con il tuo codice mi viene segnalato e va bene.
    Ma se Pino dopodomani portasse indietro l'ora a domani e poi modificasse il file, non me ne accorgerei perchè le date rimarrebbero progressive.

    Da qui mi chiedevo quindi se non fosse meglio avere sulla cella G1 l'orario di apertura del documento. O qualsiasi altro suggerimento ....

    Grazie ancora!



  • di pisolo (utente non iscritto) data: 03/09/2014 14:48:44

    potresti provare con l'evento:
    Workbook_Open

    In questo caso è necessario cancellare almeno l'istruzione Range("Foglio5!G1") = "=MAX($D:$D)" sia dal codice Sub Verifica() che da Worksheet_Change del foglio4.

    Potrebbe esserti d'aiuto utilizzando la funzione Formattazione condizionale nel foglio5.

    Se hai problemi posso inviarti il file modificato.

    Saluti
     
    Private Sub Workbook_Open()
        Range("Foglio5!G1") = Now
    End Sub



  • di Jaqen77 data: 03/09/2014 15:10:25

    Ok fatto, e funziona.
    Ora però mi manca solo un'istruzione che verifichi che data e ora di apertura (in G1) siano successivi agli ultimi n record già presenti sul foglio.

    Si riesce?




  • di pisolo (utente non iscritto) data: 03/09/2014 18:06:57

    prova a modificare Sub Verifica()
    in questo modo, se G1 è minore dell'ultima Data / Ora inserita in D, viene evidenziato il mesaggio di incongruenza.
    Volendo è possibile mettere un flag in colonna F in corrispondenza delle righe con date incongruenti.

    Saluti
     
    Option Explicit
    
    Sub Verifica()
    '   Attuale
    Dim URec As Long, x As Long
        URec = Range("Foglio5!A" & Rows.Count).End(xlUp).Row
        If Range("Foglio5!D" & URec) < Range("Foglio5!G1") Then MsgBox "Data inconguente!"
    End Sub
    
    Sub Verifica()
    '   Nuova
    Dim URec As Long, x As Long
        URec = Range("Foglio5!A" & Rows.Count).End(xlUp).Row
        If Range("Foglio5!D" & URec) > Range("Foglio5!G1") Then MsgBox "Data inconguente!"
    End Sub
    



  • di pisolo (utente non iscritto) data: 04/09/2014 07:15:45

    riguardando il tutto credo dovremo ricorrere ad una verifica diversa.
    ho dovuto modificare sia Private Sub Workbook_Open() e Sub Verifica()

    Saluti
     
    Option Explicit
    Private Sub Workbook_Open()
    Dim ultima As Long
        Range("Foglio5!G1") = Now
        Range("Foglio5!H1") = Range("Foglio5!D" & Range("Foglio5!D" & Rows.Count).End(xlUp).Row)
            If Range("Foglio5!D" & Rows.Count).End(xlUp).Row = 1 Then Range("Foglio5!H1") = Now
    End Sub
    
    Option Explicit
    Sub Verifica()
    Dim URec As Long, x As Long
        URec = Range("Foglio5!A" & Rows.Count).End(xlUp).Row
        If Range("Foglio5!H1") > Range("Foglio5!G1") Then MsgBox "Data inconguente!"
    End Sub
    



  • di Jaqen77 (utente non iscritto) data: 04/09/2014 11:57:36

    Ci siamo quasi .... Con queste ultime modifiche se prima cambio data al PC e poi apro il file mi viene segnalata correttamente l'anomalia, ma se invece prima apro il file, e cambio la data dopo non mi segnala nulla....

    Non mi abbandonare... mi sta venendo un dubbio: non è che la cosa che mi serve non è possibile?



  • di pisolo (utente non iscritto) data: 04/09/2014 13:30:34

    Avevo considerato questa criticità e speravo non si verificasse; a questo punto, considerando che l'utente è sicuramente in malafede, metterei un controllo sulla nuova data e, se incongruente, chiuderei il file senza salvare.

    Fammi sapere se è un'opzione accettabile.

    Saluti



  • di Jaqen77 (utente non iscritto) data: 04/09/2014 13:51:03

    La mia preferenza era per un controllo che segnalasse l'avvenuto "hacking", lasciando a me il successivo approfondimento.
    Sul mio file avevo modificato l'istruzione sulla Verifica da:

    MsgBox "Data inconguente!"

    a

    Range("Foglio3!A1").Value = 1

    in modo tale da portare una cella a 1 ad avvenuta frode.

    Se però non è possibile trovare una soluzione in tal senso può anche andar bene la soluzione della chiusura forzata.

    Intanto grazie ancora!



  • di pisolo (utente non iscritto) data: 04/09/2014 19:21:21

    Credo sia indispensabile inserire un nuovo file.
    Controllalo e fammi sapere.

    Saluti



  • di pisolo (utente non iscritto) data: 05/09/2014 09:42:45

    questa mattina ho visto solo due allegati, manca il file di Jaqen77

    Il file da valutare è Report modifiche con data ingresso by pisolo Rev 01.xlsm
    Se all'apertura viene dichiarato un errore, salvare il file nella cartella di lavoro, chiuderlo e riaprirlo.



  • di Jaqen77 (utente non iscritto) data: 09/09/2014 11:49:28

    Perfetto! Ora va benissimo, grazie mille!