Macro per verificare date progressive
Hai un problema con Excel? 
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!
Vuoi Approfondire?