Condividi:        

Data ultima modifica di un foglio??

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Data ultima modifica di un foglio??

Postdi aleqwert » 31/10/14 11:06

Ciao,

sono l'ultimo degli iscritti a questo forum ed anche per niente esperto sulle macro.

Ho sfruttato però questa macro per crearmi su un mio file excel in un foglio l'elenco dei nomi degli altri fogli presenti sul file, eccola qua:

Sub EstraiNomiFogli()
Dim i As Integer
Dim fg As String
For i = 2 To ThisWorkbook.Sheets.Count
fg = ThisWorkbook.Sheets(i).Name
Cells(i - 1, 1).Value = fg
Next i
End Sub

ora vorrei fare qualcosa di più.
Nelle colonne a fianco del nome foglio vorrei inserire la data di creazione del foglio stesso e nella colonna succissiva la sua ultima data di modifica.
La tabella che dovrebbe comparire sarà quindi:

nome foglio1; data creazione foglio1; data ultima modifica foglio 1;
nome foglio2; data creazione foglio2; data ultima modifica foglio 2;
nome foglio3; data creazione foglio3; data ultima modifica foglio 3;
.............................

sinceramente non ho nemmeno trovato se le informazioni di cui necessito siano scritte da qualche parte, riuscite ad aiutarmi.

Vi ringrazio

Ciao
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Sponsor
 

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 31/10/14 11:37

Ciao.
Le informazioni di cui necessiti non vengono memorizzate da Excel in nessun modo.
Quello che si può fare, invece, è che le suddette informazioni vengano memorizzate quando:
-si crea un nuovo foglio
-si modifica una qualunque cella di un foglio.
Provo a buttar giù qualche riga e ti faccio sapere...
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 31/10/14 12:44

Allego un file di esempio:
ElencoFogli.xlsb
Ho usato tre eventi del workbook:
Workbook_NewSheet, che si verifica quando si crea il nuovo foglio, usato per aggiungere una nuova voce e la data di creazione all'elenco quando si crea un nuovo foglio
Codice: Seleziona tutto
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim Dest As Range
    With ThisWorkbook.Worksheets(1)
        If .Range("A1") = "" Then
            Set Dest = .Range("A1")
        Else
            Set Dest = .Range("A" & .Rows.Count).End(xlUp).Offset(1, 0)
        End If
        Dest = Sh.Name
        Dest.Offset(0, 1) = Date
    End With
End Sub

Workbook_SheetChange, che si verifica quando viene modificato un foglio qualunque, usato per aggiornare la data di ultima modifica
Codice: Seleziona tutto
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Nome As Range
    Application.EnableEvents = False 'disabilita gli eventi dei Excel
    With ThisWorkbook.Worksheets(1) 'le espressioni precedute da un punto si riferiscono a questo foglio
        If Sh.Name <> .Name Then 'se la modifica non riguarda il foglio Elenco
            For Each Nome In Range(.Range("A1"), .Range("A1").End(xlDown)) 'scorre l'elenco dei nomi
                If Nome = Sh.Name Then 'se il nome corrisponde
                    Nome.Offset(0, 2) = Date 'scrive la data di ultima modifica
                    Exit For
                End If
            Next Nome
        End If
    End With
    Application.EnableEvents = True 'riabilita gli eventi dei Excel
End Sub


Workbook_Open, che si verifica all'apertura del file, usato per controllare l'elenco e crearlo se non esiste
Codice: Seleziona tutto
Private Sub Workbook_Open()
    If ThisWorkbook.Worksheets(1).Range("A1") = "" Then CreaElenco ' se l'elenco dei fogli non esiste lo crea
End Sub


Questa è la routine che crea l'elenco, situata in un modulo standard
Codice: Seleziona tutto
Public Sub CreaElenco()
Dim I As Long
    With ThisWorkbook
        For I = 2 To .Worksheets.Count
            .Worksheets(1).Cells(I - 1, 1).Value = ThisWorkbook.Worksheets(I).Name
        Next I
    End With
End Sub

Se rinomini un foglio, devi eseguire manualmente questa routine per aggiornare i nomi dell'elenco.
Se hai necessità di aggiornare l'elenco quando un foglio viene eliminato, saranno necessarie delle modifiche.
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 31/10/14 12:57

Ciao,

Ti ringrazio.

come dicevo non sono molto pratico di tutto quanto sopra. Dopo lavoro inizio a guardare tutto quanto e ti faccio sapere. Proverò ad utilizzare quanto mi hai inviato al mio caso....Gentilissimo
Ciao
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 08/11/14 10:25

Ciao Z0°K,

prima di tutto mi scuso per la mia lunga latitanza ma sono rientrato solo ieri da un viaggio all'estero.
Ho testato il tuo file di prova che funziona molto bene. Ti ringrazio ancora!

Ti segnalo ulteriori necessità di cui avrei bisogno, alcune delle quali avevi tu già anticipato, nell'ordine di priorità:
- "Se hai necessità di aggiornare l'elenco quando un foglio viene eliminato, saranno necessarie delle modifiche"... ho proprio la necessità.... :-)
- è possibile aggiornare l'elenco in toto anche quando rinomino un file senza rilanciare la macro? L'elenco in pratica dovrebbe rimanere sempre aggiornato, questo punto si lega in qualche modo a quello precedente
- Una volta creato l'elenco ho visto che se vado ad intervenire sui dati (per esempio ordinadoli in modo da rendere i fogli velocemente più rintracciabili) si perdono i riferimenti delle date di modifica e creazione. O meglio, modificando successivamente un foglio la data di modifica non si scrive più nella riga giusta....

In particolare le prime due mi sarebbero molto utili in quanto a queste tipologie di file avranno accesso molti utenti (una decina) e vorrei creare qualcosa di più immediato utilizzo anche da utenti meno evoluti....
La terza modifica sarebbe solo un di +....

Per qualsiasi chiarimento chiedimi pure.

Ti saluto
Ciao
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 08/11/14 14:48

Ciao.
Per ottenere questi risultati occorreranno diverse modifiche.
Innanzitutto il riferimento al Name del foglio andrà sostituito col riferimento al Codename (che non cambia se si rinomina il foglio) e bisognerà aggiungere la gestione delle cancellazioni.

...Work in progress.
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 09/11/14 03:03

...purtropo la strada dei CodeName non è percorribile, in quanto i CodeName dei fogli aggiunti vengono "visti" solo se la finestra del VBA è aperta (anche in secondo piano) e non penso proprio che sia una condizione accettabile.
Dovrò adottare una strategia diversa; ti farò sapere.
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 09/11/14 21:09

Ti allego il nuovo file.
http://www.filedropper.com/elencofogli_2
E' possibile che abbia complicato la cosa più del necessario, comunque, dalle prove che ho eseguito, il metodo sembra funzionare.
Fai qualche prova e fammi sapere il risultato.
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 10/11/14 05:51

Scarico il file e ti faccio sapere! Grazie mille gentilissimo
Ciao
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 10/11/14 07:28

Il file funziona perfettamente! Grazie!
Riesci ad re-inserirmi anche la data di creazione tra la colonna nome foglio ed ultima data di modifica?
Ciao
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 10/11/14 09:49

Scusa, mi era sfuggito.
Ecco il file con la modifica; ho aggiunto anche l'ora di creazione/modifica
http://www.filedropper.com/elencofogli_3
Per chi fosse interessato allego il codice utilizzato nel file.
Questo va inserito nel modulo del workbook:
Codice: Seleziona tutto
Option Explicit

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim R As Long
    AddSheetName Sh
    With ThisWorkbook.Worksheets(NomeElenco)
        R = LastRow
        .Cells(R, 1) = Sh.Name
        .Cells(R, 2) = Now
    End With
End Sub

Private Sub Workbook_Open()
    InitSheetsList
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim CName As Range
    With ThisWorkbook.Worksheets(NomeElenco)
        If Sh.Name <> NomeElenco Then
            UpdateSheetsList
            Application.EnableEvents = False
            For Each CName In Range(.Range("A1"), .Range("A1").End(xlDown))
                If CName = Sh.Name Then
                    CName.Offset(0, 2) = Now
                    Exit For
                End If
            Next CName
            Application.EnableEvents = True
        End If
    End With
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    UpdateSheetsList
End Sub
questo va in un modulo standard:
Codice: Seleziona tutto
Option Explicit
Option Compare Text

Public Const NomeElenco = "Elenco"

Public Sub AddSheetName(Sh As Worksheet)
    ThisWorkbook.Names.Add Name:="WS_" & Sh.Name, _
        RefersTo:=Sh.Range("A1"), Visible:=False
End Sub

Public Sub UpdateName(Name As Name)
    If Not Name Is Nothing Then
        Name.Name = "WS_" & Name.RefersToRange.Worksheet.Name
    End If
End Sub

Public Function SheetExistsByName(shName As String) As Boolean
Dim Sh As Worksheet
    SheetExistsByName = False
    On Error Resume Next
    Set Sh = ThisWorkbook.Worksheets(shName)
    SheetExistsByName = Err.Number = 0
    On Error GoTo 0
    Set Sh = Nothing
End Function

Public Function GetNameBySheetName(shName As String) As Name
    Set GetNameBySheetName = Nothing
    On Error Resume Next
    Set GetNameBySheetName = ThisWorkbook.Names("WS_" & shName)
    On Error GoTo 0
End Function

Public Function GetNameByRange(shName As String) As Name
Dim Name As Name
    Set GetNameByRange = Nothing
    If SheetExistsByName(shName) Then
        For Each Name In ThisWorkbook.Names
            If Not Name.Visible Then
                If NameHasValidRange(Name) Then
                    If Name.RefersToRange.Worksheet.Name = shName Then
                        Set GetNameByRange = Name
                        Exit Function
                    End If
                End If
            End If
        Next Name
    End If
End Function

Public Function NameHasValidRange(Name As Name) As Boolean
Dim rTest As Range
    On Error Resume Next
    Set rTest = Name.RefersToRange
    On Error GoTo 0
    NameHasValidRange = Not rTest Is Nothing
    Set rTest = Nothing
End Function

Public Sub ClearWsNames()
Dim Name As Name
    For Each Name In ThisWorkbook.Names
        If Left(Name.Name, 3) = "WS_" And Not Name.Visible Then Name.Delete
    Next Name
End Sub

Public Function GetSheetName(Name As Name) As String
    If NameHasValidRange(Name) Then
        GetSheetName = Name.RefersToRange.Worksheet.Name
    Else
        GetSheetName = ""
    End If
End Function

Public Function EmptyList() As Boolean
    With ThisWorkbook.Worksheets(NomeElenco)
        EmptyList = .Range("A1").End(xlDown).Row = .Rows.Count
    End With
End Function

Public Function LastRow() As Long
    If EmptyList Then
        LastRow = 2
    Else
        LastRow = ThisWorkbook.Worksheets(NomeElenco).Range("A1").End(xlDown).Row + 1
    End If
End Function

Public Sub UpdateSheetsList()
Dim I As Long, LR As Long
Dim Name As Name, SheetName As String
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    With ThisWorkbook.Worksheets(NomeElenco)
        LR = .Range("A1").End(xlDown).Row
        If LR < Rows.Count Then
            For I = LR To 2 Step -1
                SheetName = .Cells(I, 1)
                If Not SheetExistsByName(SheetName) Then
                    Set Name = GetNameBySheetName(SheetName)
                    If Not Name Is Nothing Then
                        If NameHasValidRange(Name) Then
                            UpdateName Name
                            .Cells(I, 1) = GetSheetName(Name)
                        Else
                            Range(.Cells(I, 1), .Cells(I, 3)).Delete (xlShiftUp)
                            Name.Delete
                        End If
                    End If
                End If
            Next I
        End If
    End With
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Public Sub InitSheetsList()
Dim Sh As Worksheet
Dim R As Long
    If EmptyList Then
        ClearWsNames
        R = 2
        For Each Sh In ThisWorkbook.Worksheets
            If Sh.Name <> NomeElenco Then
                AddSheetName Sh
                ThisWorkbook.Worksheets(NomeElenco).Cells(R, 1) = Sh.Name
                R = R + 1
            End If
        Next Sh
    End If
End Sub

Ho preso lo spunto da questo articolo di Chip Pearson:
http://www.cpearson.com/excel/RenameProblems.aspx
I nomi dei fogli vengono memorizzati per mezzo di Names (nomi definiti) nascosti (WS_NomeDelFoglio).
Nel name viene memorizzato un riferimento alla cella A1 del foglio, che rimarrà valido anche se il foglio viene rinominato.
Per mezzo di questo riferimento è possibile ottenere il nome reale del foglio che contiene la cella.
Se il riferimento non è valido, significa che il foglio è stato cancellato.
Workbook_SheetChange viene usato per aggiornare la data di ultima modifica, mentre con Workbook_NewSheet viene aggiunto un nuovo nominativo (e relativo Name) alla lista.
La lista viene aggiornata, tramite Workbook_SheetActivate, ogni volta che si seleziona un foglio.
La costante
Codice: Seleziona tutto
Public Const NomeElenco = "Elenco"
viene usata per definire il nome del foglio che contiene l'elenco.
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 10/11/14 10:38

Il file è perfetto!!

Utilizzandolo ho notato che l'elenco non si aggiorna qualora duplico il foglio invece che crearlo dal nulla. Siccome è una funzione che verrà spesso utilizzata riesci a ricomprendere anche questa variabile?

Dopo dovrebbe essere tutto assolutamente perfetto!
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 10/11/14 12:04

Ciao.
Con questo è venuto alla luce un altro problema: i nomi dei fogli e quelli dei Names seguono delle convenzioni diverse; quindi forse bisognerà imporre delle restrizioni ai caratteri che è possibile utilizzare nei nomi dei fogli (niente parentesi , spazi, ecc.).
Bisognerà rivedere il programma; nei prossimi due giorni potrei non avere il tempo.
Appena pronto mi faccio risentire.
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 10/11/14 12:23

tranquillo, fai pure quando riesci...ciao
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 10/11/14 14:22

Ciao, l'aggiunta anche dell'ora nella data di creazione/modifica e veramente molto utile!
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 14/11/14 16:53

Salve.
Scrivo solo per pregarti di avere ancora un pò di pazienza.
Purtroppo il nuovo codice presenta un bug che si verifica solo in condizioni particolari e che non sono ancora riuscito ad eliminare...
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 14/11/14 19:04

Tranquillo, figurati dopo tutto quello che già mi hai fatto! Ti ringrazio invece del tuo avviso.
Buon lavoro!
Ciao
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi Zer0Kelvin » 15/11/14 19:19

Rieccomi.
Questo dovrebbe essere funzionante:
http://www.filedropper.com/elencofogli
Fammi sapere se ci sono problemi (spero di no :D )...

PS: i fogli possono essere rinominati tranquillamente, con qualunque nome accettato da Excel.
[Win7,Office2010]
Condividere la conoscenza aumenta la ricchezza di tutti(Z0°K)
Dai ad un uomo un pesce e lo avrai sfamato per un giorno;insegnagli a pescare e lo avrai sfamato per sempre(Confucio)
Il sonno della ragione genera mostri(Francisco Goya)
Avatar utente
Zer0Kelvin
Utente Senior
 
Post: 388
Iscritto il: 08/04/12 11:23

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 16/11/14 09:22

Scarico il file immediatamente! Ti ringrazio! Potrò però provarlo solo da martedì, sono all'estero.... Ti faccio sapere.
Buona giornata, ciao, grazie ancora
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47

Re: Data ultima modifica di un foglio??

Postdi aleqwert » 18/11/14 13:57

Complimenti!!!

il file funziona perfettamente con tutte le casistiche che ho provato fino ad ora.... esattamente quello che mi serviva!

Adesso lo adatterò al mio utilizzo e poi magari ti invio una copia del file finale così dai un occhio a quello che mi serviva e magari mi dai ulteriori suggerimenti.

Grazie ancora, veremente fantastico!

Ciaooooo
aleqwert
Utente Junior
 
Post: 13
Iscritto il: 31/10/14 06:47


Torna a Applicazioni Office Windows


Topic correlati a "Data ultima modifica di un foglio??":


Chi c’è in linea

Visitano il forum: Nessuno e 65 ospiti