Condividi tramite

differenza date in documento word

Anonimo
2015-02-17T09:12:29+00:00

Salve a tutti,

sto cercando di trovare una funzione per poter ottenere come risultato la differenza tra una data prestablita e la data attuale , cioè:

nel foglio scrivo:

dal giorno (data) ad oggi (data di oggi in automatico) sono passati giorni (numero di giorni), cioè n° anni (anni), mesi (mesi) e giorni (giorni)

Grazie a Voi tutti.

Microsoft 365 e Office | Word | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2015-02-18T04:40:55+00:00

Ciao peppeZH,

ho caricato un file Word di esempio qui.

Il testo si presenta così:

dove le parentesi quadre indicano la presenza di segnalibri. Per nasconderle:

File > Opzioni

Impostazioni avanzate

Sezione: Visualizzazione del contenuto del documento

[_] Mostra segnalibri

Per immettere la data iniziale c'è un pulsante nascosto e per farlo comparire occorre passare alla visualizzazione Mostra tutto. Così:

Quindi doppioclic sul pulsante macro Aggiorna.

Il documento contiene i seguenti segnalibri e codici di campo:

Prestare attenzione al fatto che il testo nei segnalibri si conclude con uno spazio nascosto, necessario al fine della corretta esecuzione della macro AggiornaValori.

Nel codice Visual Basic ho usato una routine di Matthews Patrick che in base ai test che ho fatto fornisce risultati più attendibili della funzione non documentata di Excel DATA.DIFF, come per esempio nel caso delle date 31/1/2006 1/3/2006. Ma l'argomento è rognoso e non si sa mai...

Questo il codice della macro AggiornaValori richiamata dal pulsante macro Aggiorna:

' Modulo: modMacros

'

Option Explicit

Public Sub AggiornaValori()

On Error GoTo ErrH

Const cstrBmkDataInizio = "DataInizio"

Const cstrBmkAnni = "Anni"

Const cstrBmkMesi = "Mesi"

Const cstrBmkGiorni = "Giorni"

Const cstrBmkTotaleGiorni = "TotaleGiorni"

Dim Doc       As Word.Document

Dim Bmks      As Word.Bookmarks

Dim strInizio As String

Dim dtmInizio As Date

Dim dtmFine   As Date

Dim lngAA     As Long

Dim lngMM     As Long

Dim lngGG     As Long

Dim lngTGG    As Long

    dtmFine = Date

    strInizio = InputBox("Immetti la data iniziale.", "Aggiorna valori")

    If Len(strInizio) = 0 Then GoTo ExtP

    If Not IsDate(strInizio) Then

      MsgBox "'" & strInizio & "' non è una data valida." _

           , vbOKOnly Or vbExclamation _

           , "Ops!..."

      GoTo ExtP

    End If

    dtmInizio = DateValue(strInizio)

    If dtmInizio > dtmFine Then

      MsgBox Format$(dtmInizio, "d mmmm yyyy") & " > Data oggi." _

           , vbOKOnly Or vbExclamation _

           , "Ops!..."

      GoTo ExtP

    End If

' ************************************************************

' http://www.vbaexpress.com/kb/getarticle.php?kb\_id=866

' ************************************************************

Dim Date1       As Date

Dim Date2       As Date

Dim TestYear    As Long

Dim TestMonth   As Long

Dim TestDay     As Long

Dim TargetDate  As Date

Dim Last1       As Date

Dim Last2       As Date

    Date1 = dtmInizio

    Date2 = dtmFine

    If Year(Date2) > Year(Date1) Then

      If Month(Date2) = Month(Date1) Then

        If Day(Date2) >= Day(Date1) Then

          TestYear = DateDiff("yyyy", Date1, Date2)

        Else

          TestYear = DateDiff("yyyy", Date1, Date2) - 1

        End If

      ElseIf Month(Date2) > Month(Date1) Then

        TestYear = DateDiff("yyyy", Date1, Date2)

      Else

        TestYear = DateDiff("yyyy", Date1, Date2) - 1

      End If

    Else

      TestYear = 0

    End If

    TestMonth = (DateDiff("m" _

                        , DateSerial(Year(Date1), Month(Date1), 1) _

                        , DateSerial(Year(Date2), Month(Date2), 1) _

                        ) + IIf(Day(Date2) >= Day(Date1), 0, -1)) Mod 12

    If Day(Date2) >= Day(Date1) Then

      TestDay = Day(Date2) - Day(Date1)

    Else

      Last1 = DateSerial(Year(Date2), Month(Date2), 0)

      Last2 = DateSerial(Year(Date2), Month(Date2) + 1, 0)

      TargetDate = DateSerial(Year(Date2), Month(Date2) - 1, Day(Date1))

      If Last2 = Date2 Then

        If TestMonth = 11 Then

          TestMonth = 0

          TestYear = TestYear + 1

        Else

          TestMonth = TestMonth + 1

        End If

      Else

        TestDay = DateDiff("d" _

                         , IIf(TargetDate > Last1, Last1, TargetDate) _

                         , Date2)

      End If

    End If

' ************************************************************

    lngTGG = dtmFine - dtmInizio

    lngAA = TestYear

    lngMM = TestMonth

    lngGG = TestDay

    Set Doc = ThisDocument

    Set Bmks = Doc.Bookmarks

    With Bmks

      With .Item(cstrBmkDataInizio)

        Doc.Range(.Start, .End - 1).Text = Format$(dtmInizio, "dddd d mmmm yyyy")

      End With

      With .Item(cstrBmkTotaleGiorni)

        Doc.Range(.Start, .End - 1).Text = Format$(lngTGG, "#,##0")

      End With

      With .Item(cstrBmkAnni)

        Doc.Range(.Start, .End - 1).Text = Format$(lngAA, "#,##0")

      End With

      With .Item(cstrBmkMesi)

        Doc.Range(.Start, .End - 1).Text = Format$(lngMM, "#,##0")

      End With

      With .Item(cstrBmkGiorni)

        Doc.Range(.Start, .End - 1).Text = Format$(lngGG, "#,##0")

      End With

    End With

ExtP:

    Set Bmks = Nothing

    Set Doc = Nothing

    Exit Sub

ErrH:

    With Err

      MsgBox .Description, vbCritical Or vbOKOnly, "Errore #" & .Number

    End With

    Resume ExtP

End Sub

La risposta è stata utile?

0 commenti Nessun commento

6 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-02-18T08:41:09+00:00

    Ben gentile, Mauro. :-)

    Grazie!

    (Ma ricordiamoci che IsDate è subdola. L'ho usata per pigrizia.)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-02-18T08:22:39+00:00

    Ciao peppeZH,

    ho caricato un file Word di esempio qui.

    <cut>

    Eh beh, chapeau! Da segnare come Risposta a prescindere e lo faccio subito.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-02-17T16:39:42+00:00

    Salve a tutti,

    sto cercando di trovare una funzione per poter ottenere come risultato la differenza tra una data prestablita e la data attuale , cioè:

    nel foglio scrivo:

    dal giorno (data) ad oggi (data di oggi in automatico) sono passati giorni (numero di giorni), cioè n° anni (anni), mesi (mesi) e giorni (giorni)

    Grazie a Voi tutti.

    Puoi utilizzare Detediff, il vba e una TextBox.

    Esempio:

    TextBox1.Text = DateDiff("d", Now, "01/02/2015")

    Resta da vedere *quando* vuoi che i valori cambino e quando no, quale evento scatena la modifica, dove scrivi la data che nell'esempio è 01/02/2015, ecc.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-02-17T16:07:19+00:00

    Così posto il problema non ha facile soluzione, almeno per me.

    Un'alternativa potrebbe essere quella di creare una tabella in Excel su cui eseguire i calcoli in automatico, quindi, dopo averla salvata, selezionare la tabella, Copiarla, spostarsi su Word e eseguire Incolla Speciale/Incolla Collegamento/Foglio di lavoro di Microsoft Excel.

    Ogni variazione su Excel si ripercuote in automatico su Word.

    Excel:

    Le formule:

    in A3: la data di partenza

    in B3: =OGGI()

    in C3: =DATA.DIFF(A3;B3;"Y")

    in D3: =DATA.DIFF(A3;B3;"Ym")

    in E3: =DATA.DIFF(A3;B3;"md")

    Word:

    La risposta è stata utile?

    0 commenti Nessun commento