Newsgroup: it.comp.appl.access
Titolo: calcolo giorni di un mese

Dovrei calcolare i giorni di differenza tra due date. Ho cercato e trovato alcuni suggerimenti usando la funzione DateDiff. Funziona ed in effetti restituisce il numero di giorni che intercorrono tra le due date.
Ora il problema é che vorrei che fossero calcolati divisi per mese.
Esempio:
data1: 15-7-2014
data2: 15-8-2014
 
il risultato é 31: DateDiff("d", data2, data1)
 
mi servirebbe però che restituisse 17 (luglio) + 14 (agosto)
 
E' possibile?
Grazie

dovrebbe essere cosi
 
[code]
 
Public Function CalcGGMes()
 
' la data di inizio in formato  mm/gg/aaaa
Dim Inix As Date
Inix = #8/15/2014#
 
' la data di fine in formato  mm/gg/aaaa
Dim Finx As Date
Finx = #10/2/2014#
 
' una stringa che rappresenta l'anno e il mese   yyyy/mm
Dim AMe As String
AMe = Year(Inix) & "/" & Format((Month(Inix)), "00")
 
' il conteggio dei giorni mel mese  ( esattamente nel AMe )
Dim X As Integer
Dim Strx As String
 
For Inix = Inix To Finx - 1
 
    If Year(Inix) & "/" & Format((Month(Inix)), "00") = AMe Then
        '
    Else
        Strx = Strx & X & "(" & AMe & ") + "
        X = 0
    End If
 
    AMe = Year(Inix) & "/" & Format((Month(Inix)), "00")
    X = X + 1
 
Next
 
Strx = Strx & X & "(" & AMe & ")"
 
Debug.Print Strx
 
End Function
 
[/code]


Grazie! Ho provato oltre che a copiare il codice a capirlo. Ho messo un msgbox alla fine che mi restituisca il risultato e trovo l'indicazione dei giorni e tra parentesi il mese e anno di riferimento. Volendo intercettare distintamente ogni strx dove dovrei inserire la variabile che memorizzi il valore di ogni mese?
In sostanza dovrei al termine del ciclo indicare: luglio 31 (dove 31 sono i giorni) in una casella, quindi agosto 15 (dove 15 sono i giorni) in un'altra casella. Per il mese credo di poter estrarre il mese da Ame e trasformarlo in mese (lettere) anche se non sono sicuro di conoscere il comando.
Spero di essere riuscito a spiegarmi. In ogni caso grazie perché già con questo risultato riesco a lavorare meglio i dati.
 

Per il mese credo di poter estrarre il mese da Ame e trasformarlo in mese (lettere) anche se non sono sicuro di conoscere il comando.
 
Non c'è bisogno di estrarre il mese da "Ame" .
se l'anno proprio non ti serve possiamo 
addirettura escluderlo dal ciclo,   ma perché ?
 
Se poi ti capita un ciclo con più di 12 mesi 
( dove quindi avresti 1 o più mesi duplicati ) 
potresti jncontrare delle difficolta
 
 
Facci sapere
 
.

Prova a sostituire nel codice
 
 
questo -------->  Year(Inix) & "/" & Format((Month(Inix)), "00")
con questo ----> Format(Inix, "mmmm")
 
( si tratta di 3 sostituzioni )
 
Facci sapere

 Grazie
 
Variazioni sul tema di Mancini (che sauto):
=============================================
Private Sub Command52_Click()
Dim DataIni As Date, DataFin As Date, dies_a_quo As Byte
Dim mm As Long, GGmese(), k As Long, S As Long
 
'---  Definizioni  -------------------------------
DataIni = #10/14/2013#  ' le date sono espresse
DataFin = #4/24/2014#   ' nel formato mm/dd/yyyy
dies_a_quo = 0          ' 1 -> computatur
                        ' 0 -> non computatur
'-------------------------------------------------
 
mm = DateDiff("m", DataIni, DataFin) + 1
ReDim GGmese(1 To mm, 1 To 2)
 
Do
    GGmese(k + 1, 1) = Format(DateAdd("m", k, DataIni), "mmmm yyyy")
    GGmese(k + 1, 2) = DateDiff("d", DataIni, 
WorksheetFunction.EoMonth(DataIni, k)) _
                     - S + dies_a_quo * (IIf(Sgn(k), 0, 1))
    S = DateDiff("d", DataIni, WorksheetFunction.EoMonth(DataIni, k))
    k = k + 1
Loop Until DateAdd("m", k, DataIni) > DataFin
 
For k = 1 To mm
    MsgBox GGmese(k, 1) & "   " & GGmese(k, 2)
Next
 
MsgBox DataIni & "  ...  " & DataFin & vbCrLf & "(dies a quo " & _
       IIf(dies_a_quo, "", "non ") & "computatur" & _
       ")      " & DateDiff("d", DataIni, DataFin) + dies_a_quo
 
End Sub
===================================
 
Bruno


Partiamo dal fondo... esatto io dovrei memorizzare il numero di giorni e in separato campo il mese. Spiego anche il perché: in base ai giorni di un mese devo calcolare un listino che cambia ogni mese, quindi avendo una tabella con caricati i listini con un campo mese e un campo giorno (prezzo al giorno), pensavo una volta memorizzato il mese e i giorni di prendere nella tabella dei listini il mese corrispondente al campo calcolato dal tuo codice e moltiplicarlo per i giorni sempre calcolati dal tuo codice e così per i mesi successivi, quindi sommare i due o più totali per mese ed avere un unico prezzo.
 
Non riesco a intercettare le variabili in quanto:
Strx = Strx & X & "(" & AMe & ") + " 
 '...........
 Strx = Strx & X & "(" & AMe & ")" 
 
dovrei avere tante variabili quanti sono i valori di Strx e questo non riesco a farlo (immagino dovrei fare un ciclo in base al numero di mesi e quindi creare variabili tel tipo V1, V2, V3 e metterlo prima e dopo di Strx... ma non riesco)
 
E' tutto. Grazie


Ho provato. In effetti ora mette il mese, ma non riesco a estrapolare il mese soltanto e memorizzarlo a parte rispetto alla stringa Strx

                      - S + dies_a_quo * (IIf(Sgn(k), 0, 1))
 
sembra non avere ancora un valore per S. Almeno ritengo io. Comunque é in questa riga che si blocca

 questa riga che si blocca
No, si blocca perchï¿œ non ha i riferimenti per WorksheetFunction...
 
Devi caricare nelle References:
      Microsoft Excel 15.0 Object Library
o analoga altra precedente versione.
 
Bruno

 o analoga altra precedente versione.
 
Corretto un bug grande come una casa...
========================================
Private Sub Command52_Click()
Dim DataIni As Date, DataFin As Date, dies_a_quo As Byte
Dim mm As Long, GGmese(), k As Long, S As Long, D As Long
 
'---  Definizioni  -------------------------------
DataIni = #10/22/2013#  ' le date sono espresse
DataFin = #4/24/2014#   ' nel formato mm/dd/yyyy
dies_a_quo = 1          ' 1 -> computatur
                        ' 0 -> non computatur
'-------------------------------------------------
 
mm = DateDiff("m", DataIni, DataFin) + 1
ReDim GGmese(1 To mm, 1 To 2)
 
Do
    D = WorksheetFunction.EoMonth(DataIni, k)
    GGmese(k + 1, 1) = Format(DateAdd("m", k, DataIni), "mmmm yyyy")
    GGmese(k + 1, 2) = DateDiff("d", DataIni, D) _
                     - S + dies_a_quo * (IIf(Sgn(k), 0, 1))
    S = DateDiff("d", DataIni, D)
    k = k + 1
Loop Until DateAdd("m", k + (Day(DataIni) > Day(DataFin)), DataIni) > 
DataFin
 
For k = 1 To mm
    MsgBox GGmese(k, 1) & "   " & GGmese(k, 2)
Next
 
MsgBox DataIni & "  ...  " & DataFin & vbCrLf & "(dies a quo " & _
       IIf(dies_a_quo, "", "non ") & "computatur" & _
       ")      " & DateDiff("d", DataIni, DataFin) + dies_a_quo
 
End Sub
=============================================
 
Bruno

 [...]
Per coloro cui non piace la Reference di Excel:
 
https://www.dropbox.com/s/zxuepav0lub7yzu/BC.accdb
 
 
Bruno


 
in alternativa vedi:
 
Primo/Ultimo giorno del mese
http://www.donkarl.com/it?FAQ2.8
 
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
 
 
 

 
http://www.donkarl.com/it?FAQ2.8
 
 
Avevo giï¿œ provveduto ad eliminare la reference di Excel
sostituendo:
D = WorksheetFunction.EoMonth(DataIni, k)
con:
D = DateAdd("d", -Day(DateAdd("m", k + 1, DataIni)), DateAdd("m", k + 
1, DataIni))
 
ma con la tua formula si accorcia il tutto in:
D = DateSerial(Year(DataIni), Month(DataIni) + 1 + k, 0)
 
=========================================
Private Sub Command52_Click()
'
' Access 2013/64bit    25-04-2014    BC.accdb
' Form1    Control: Giorni Da... A...
'
' Calcola i giorni fra due date dies_a_quo computatur
' o non computatur, definendo i giorni di ogni mese.
'
' Richiede la Reference: Microsoft Excel 15.0 Object Library
'
Dim DataIni As Date, DataFin As Date, dies_a_quo As Byte
Dim mm As Long, GGmese(), k As Long, S As Long, D As Long
 
'---  Definizioni  -------------------------------
DataIni = #10/23/2013#  ' le date sono espresse
DataFin = #4/24/2014#   ' nel formato mm/dd/yyyy
dies_a_quo = 1          ' 1 -> computatur
                        ' 0 -> non computatur
'-------------------------------------------------
 
mm = DateDiff("m", DataIni, DataFin) + 1
ReDim GGmese(1 To mm, 1 To 2)
 
Do
    '-----  Per coloro cui non piace la Reference di Excel  -----
    'D = WorksheetFunction.EoMonth(DataIni, k)
    D = DateSerial(Year(DataIni), Month(DataIni) + 1 + k, 0)
    GGmese(k + 1, 1) = Format(DateAdd("m", k, DataIni), "mmmm yyyy")
    GGmese(k + 1, 2) = DateDiff("d", DataIni, D) _
                     - S + dies_a_quo * (IIf(Sgn(k), 0, 1))
    S = DateDiff("d", DataIni, D)
    k = k + 1
Loop Until DateAdd("m", k + (Day(DataIni) > Day(DataFin)), DataIni) > 
DataFin
 
For k = 1 To mm
    MsgBox GGmese(k, 1) & "   " & GGmese(k, 2)
Next
 
MsgBox DataIni & "  ...  " & DataFin & vbCrLf & "(dies a quo " & _
       IIf(dies_a_quo, "", "non ") & "computatur" & _
       ")      " & DateDiff("d", DataIni, DataFin) + dies_a_quo
 
End Sub
=====================================
 
Grazie Karl
 
Bruno

 Avevo giï¿oe provveduto ad eliminare la reference di Excel

Grazie Bruno. Ora ci sono tutte le informazioni. Ho passato alcuni giorni a fare prove sul tuo codice ma non riesco a trovare la soluzione a quanto riporto:
se devo memorizzare il numero di giorni di un mese, e del secondo, ecc. in variabili da utilizzare successivamente, dove devo inserirle?
Ad esempio: con la tua procedure se metto data inizio 1/6/2014 e data fine 15/7/2014 mi restituisce 30 giorni giugno, 31 giorni luglio, 45 giorni il calcolo. Io dovrei memorizzare i dati 30 (giorni di giugno) e 15 (giorni di luglio).
Grazie a tutti

 luglio). Grazie a tutti
 
Il mese e l'anno sono contenuti in GGmese(k, 1),
i giorni di quel mese in GGmese(k, 2),
ultimo For... Next della procedura.
 
Preleva il codice che ho inserito nella risposta a Karl.
 
Bruno


Non mi torna quello che scrivi: GGmese(k,2) sull'esempio che ti facevo (1/6/2014 data iniziale e 15/7/2014 data finale), mi restituisce 30 giorni a giugno (e questo mi sta bene) e 31 giorni a luglio, mentre a me servirebbe 15 (che sono i giorni di luglio della data che ho inserito).
E quindi io dovrei trovare il modo di memorizzare in due variabili (che poi utilizzerò successivamente) che memorizzino 30 la prima e 15 la seconda.
Altro esempio: data inizio 1/6/2014 e data fine 10/8/2014, dovrei avere tre variabili che memorizzano i seguenti valori:
30 la prima (giorni di giugno)
31 la seconda (giorni di luglio)
10 la terza (giorni di agosto)
Spero di essere riuscito a spiegarmi.
Ciao

 spiegarmi. Ciao
 
====================================
Private Sub Command52_Click()
'
' Access 2013/64bit    25-04-2014    BC.accdb
' Form1    Control: Giorni Da... A...
'
' Calcola i giorni fra due date dies_a_quo computatur
' o non computatur, definendo i giorni di ogni mese.
'
' Richiede la Reference: Microsoft Excel 15.0 Object Library
'
Dim DataIni As Date, DataFin As Date, dies_a_quo As Byte
Dim mm As Long, GGmese(), k As Long, S As Long, D As Long
 
'---  Definizioni  -------------------------------
DataIni = #6/1/2014#     ' le date sono espresse
DataFin = #8/1/2014#     ' nel formato mm/dd/yyyy
dies_a_quo = 1           ' 1 -> computatur
                         ' 0 -> non computatur
'-------------------------------------------------
 
mm = DateDiff("m", DataIni, DataFin) + 1
ReDim GGmese(1 To mm, 1 To 2)
 
Do
    '-----  Per coloro cui non piace la Reference di Excel  -----
    'D = WorksheetFunction.EoMonth(DataIni, k)
    D = DateSerial(Year(DataIni), Month(DataIni) + 1 + k, 0)
    GGmese(k + 1, 1) = Format(DateAdd("m", k, DataIni), "mmmm yyyy")
    GGmese(k + 1, 2) = DateDiff("d", DataIni, D) _
                     - S + dies_a_quo * (IIf(Sgn(k), 0, 1))
    S = DateDiff("d", DataIni, D)
    k = k + 1
'Loop Until DateAdd("m", k + (Day(DataIni) > Day(DataFin)), DataIni) > 
DataFin
Loop Until DateAdd("m", k, DataIni) > DateSerial(Year(DataFin), 
Month(DataFin), 0)
GGmese(mm, 1) = Format(DataFin, "mmmm yyyy")
GGmese(mm, 2) = Day(DataFin)
 
For k = 1 To mm
    MsgBox GGmese(k, 1) & "   " & GGmese(k, 2)
Next
 
MsgBox DataIni & "  ...  " & DataFin & vbCrLf & "(dies a quo " & _
       IIf(dies_a_quo, "", "non ") & "computatur" & _
       ")      " & DateDiff("d", DataIni, DataFin) + dies_a_quo
 
End Sub
==============================================
 
Bruno

 
mi permetto di inviare una mio esempio con l'utilizzo di una matrice a 2 componenti che rilascia 
 
 
Private Sub cmd_nGiorniMese_Click()
  Call CalcGGMes(CDate("1/6/2014"), CDate("15/01/2015"))
End Sub
 
Public Function CalcGGMes(dInix As Date, dFinix As Date) As Variant
 
   Dim gg_mese() As Variant
   ReDim gg_mese(2, 0) As Variant
 
   ' una stringa che rappresenta l'anno e il mese   yyyy/mm
   Dim AnnoMese As String
   Dim nAnno As Integer
   Dim nMese As Integer
 
   AnnoMese = Year(dInix) & "/" & Format((Month(dInix)), "00")
 
   ' il conteggio dei giorni mel mese  ( esattAnnoMesente nel AnnoMese )
   Dim X As Integer
   Dim Strx As String
 
   Dim nQuantiMesi As Integer
   nQuantiMesi = 1
 
   For dInix = dInix To dFinix - 1
       If Year(dInix) & "/" & Format((Month(dInix)), "00") = AnnoMese Then
           '
       Else
           '''''''''''''
              '   ReDim gg_mese(2, 0) As Variant
              '   gg_mese(0, 0) = "giugno"
              '   gg_mese(1, 0) = "30"
              '   gg_mese(2, 0) = "2014"
              '
              '   ReDim Preserve gg_mese(2, 1)
              '   gg_mese(0, 1) = "luglio"
              '   gg_mese(1, 1) = "31"
              '   gg_mese(2, 1) = "2014"
 
           Debug.Print nQuantiMesi
           If nQuantiMesi = 1 Then
             ' gg_mese(0, 0) = X
             ' gg_mese(1, 0) = Year(dInix)
             ' gg_mese(2, 0) = Month(dInix)
              gg_mese(0, nQuantiMesi - 1) = X
              gg_mese(1, nQuantiMesi - 1) = IIf(Month(dInix) <> 1, Year(dInix), Year(dInix) - 1)
              gg_mese(2, nQuantiMesi - 1) = Month(dInix - 1)
           Else
              ' inizio      ReDim gg_mese(2, 0) As Variant
              ' aggiungo    ReDim gg_mese(2, 1) As Variant
              Debug.Print "UBound(gg_mese, 2) --> " & UBound(gg_mese, 2)
              Debug.Print "nQuantiMesi --> " & nQuantiMesi
              ReDim Preserve gg_mese(2, UBound(gg_mese, 2) + 1) As Variant
 
              gg_mese(0, nQuantiMesi - 1) = X
              gg_mese(1, nQuantiMesi - 1) = IIf(Month(dInix) <> 1, Year(dInix), Year(dInix) - 1)
              gg_mese(2, nQuantiMesi - 1) = Month(dInix - 1)
 
           End If
           nQuantiMesi = nQuantiMesi + 1
 
           '''''''''''''
 
 
 
           Strx = Strx & X & "(" & AnnoMese & ") + "
           X = 0
       End If
 
       If dInix = CDate("30/12/2014") Then
          Debug.Print ""
       End If
       AnnoMese = Year(dInix) & "/" & Format((Month(dInix)), "00")
       X = X + 1
 
   Next
 
   ' per l'ultimo mese
           '''''''''''''
           If nQuantiMesi = 1 Then
             ' gg_mese(0, 0) = X
             ' gg_mese(1, 0) = Year(dInix)
             ' gg_mese(2, 0) = Month(dInix)
              gg_mese(0, nQuantiMesi - 1) = X
              gg_mese(1, nQuantiMesi - 1) = Year(dInix)
              gg_mese(2, nQuantiMesi - 1) = Month(dInix - 1)
           Else
              '   ReDim gg_mese(2, 0) As Variant
              '   gg_mese(0, 0) = "giugno"
              '   gg_mese(1, 0) = "30"
              '   gg_mese(2, 0) = "2014"
              '
              '   ReDim Preserve gg_mese(2, 1)
              '   gg_mese(0, 1) = "luglio"
              '   gg_mese(1, 1) = "31"
              '   gg_mese(2, 1) = "2014"
 
              ' inizio      ReDim gg_mese(2, 0) As Variant
              ' aggiungo    ReDim gg_mese(2, 1) As Variant
              Debug.Print "UBound(gg_mese, 2) --> " & UBound(gg_mese, 2) & " quidi diventerà " & UBound(gg_mese, 2) + 1
              Debug.Print "nQuantiMesi --> " & nQuantiMesi
              ReDim Preserve gg_mese(2, UBound(gg_mese, 2) + 1) As Variant
 
              gg_mese(0, nQuantiMesi - 1) = X
              gg_mese(1, nQuantiMesi - 1) = Year(dInix)
              gg_mese(2, nQuantiMesi - 1) = Month(dInix - 1)
 
           End If
           nQuantiMesi = nQuantiMesi + 1
 
           '''''''''''''
 
 
   Strx = Strx & X & "(" & AnnoMese & ")"
 
 
 
 
   CalcGGMes = gg_mese
 
   Dim i As Integer, j As Integer
 
 
  For j = LBound(gg_mese, 2) To UBound(gg_mese, 2)
      For i = LBound(gg_mese, 1) To UBound(gg_mese, 1)
          Debug.Print "gg_mese(" & i & "," & j & ") " & gg_mese(i, j)
      Next
      Debug.Print ""
  Next
 
   Debug.Print
 
End Function
 

 componenti che rilascia 
Permesso accordato...!
 
Il primo giorno lo conta sempre e quello finale non lo conta mai.
Se la data finale ï¿œ 1/1/2015 il risultato ï¿œ:
anno   2015
mese     12
giorni   31
 
Bruno
 
PS
Io sono bravissimo a rilevare i bug altrui,
i miei invece li lascio tutti!

 > trovare il modo di memorizzare in due variabili (che poi utilizzerï¿oe 

Ciao Bruno,
ti ringrazio e sono riuscito a fare praticamente tutto quello che mi serviva grazie al tuo codice.
Ora facendo un pò di test mi sono accorto che se voglio calcolare i giorni nello stesso mese il calcolo non viene corretto.
In pratica se come date metto datainizio 12-06-2014 e datafine 14-06-2014 GGmese(k, 2) mi restituisce 14 invece di 2 che dovrebbero essere i giorni del mese calcolati.
E' risolvibile?
Grazie
 

 mese calcolati. E' risolvibile? Grazie
 
==============================
Private Sub Command52_Click()
Dim DataIni As Date, DataFin As Date, dies_a_quo As Byte
Dim mm As Long, GGmese(), k As Long, S As Long, D As Long
 
'---  Definizioni  -------------------------------
DataIni = #10/2/2014#  ' le date sono espresse
DataFin = #10/24/2014#   ' nel formato mm/dd/yyyy
dies_a_quo = 1          ' 1 -> computatur
                        ' 0 -> non computatur
'-------------------------------------------------
 
If (Year(DataIni) = Year(DataFin)) * (Month(DataIni) = Month(DataFin)) 
Then
    GoTo Risposta
End If
 
mm = DateDiff("m", DataIni, DataFin) + 1
ReDim GGmese(1 To mm, 1 To 2)
 
Do
    D = WorksheetFunction.EoMonth(DataIni, k)
    GGmese(k + 1, 1) = Format(DateAdd("m", k, DataIni), "mmmm yyyy")
    GGmese(k + 1, 2) = DateDiff("d", DataIni, D) _
                     - S + dies_a_quo * (IIf(Sgn(k), 0, 1))
    S = DateDiff("d", DataIni, D)
    k = k + 1
Loop Until DateAdd("m", k + (Day(DataIni) > Day(DataFin)), DataIni) > 
DataFin
 
For k = 1 To mm
    MsgBox GGmese(k, 1) & "   " & GGmese(k, 2)
Next
 
Risposta:
MsgBox DataIni & "  ...  " & DataFin & vbCrLf & "(dies a quo " & _
       IIf(dies_a_quo, "", "non ") & "computatur" & _
       ")      " & DateDiff("d", DataIni, DataFin) + dies_a_quo
 
End Sub
===================================
 
Bruno

 > grazie al tuo codice. Ora facendo un pï¿oe di test mi sono accorto che se voglio 

Grazie Bruno