Funzione FINEMESE  (Funzione Utente). - pagina vista: volte

Excel già possiede la funzione FINE.MESE (trattata sul sito interfree, sezione "Formule", art. "Funzione FINE.MESE"), quindi questa mia funzione potrebbe sembrare una ripetizione.

Entrambe queste funzioni sono utili in applicazioni dove sia necessario calcolare date a scadere relative a emissioni di RiBa, tradizionalmente usate nella forma : numerogiorni/finemese, es "30 gg FM" o "60 gg FM" ecc. ecc.

La funzione FINE.MESE (col punto tra fine e mese) però utilizza come secondo argomento, un numero che esprime i mesi da aggiungere alla data iniziale, quindi 1 al posto di 30 gg, 2 al posto di 60 gg, ecc., diventa quindi necessario usare una tabellina di conversione per ottenere mesi disponendo di giorni (vedi articolo citato a inizio), mentre in un recente lavoro, avevo bisogno di fornire come secondo argomento, non mesi, ma giorni.

Ne è nata quindi l'esigenza di crearmi una funzione personalizzata (funzione utente) che ho chiamato come la funzione di Excel, ma senza il punto: FINEMESE. La funzione l'ho usata in istruzioni vba, ma si può tranquillamente usare come funzione sul foglio di lavoro; la sua sintassi è semplice:

  • FINEMESE(data_iniziale, giorni) per usarla in vba  (con la virgola come separatore di argomenti)

  • FINEMESE(data_iniziale; giorni) per usarla sul foglio di lavoro (con il punto e virgola)

Esempio sul foglio di lavoro: in C1 una data (es. di fatturazione, 25/08/04), in E1 60 (i giorni a scadere), ed in H1 la funzione: =FINEMESE(C1;E1)  ed avremo 31/10/04

In vba per la stessa operazione avremmo potuto scrivere: [H1].Formula = "=FINEMESE(C1,E1)" , oppure usata su UserForm per restituire in una TextBox (la 3)  il finemese, leggendo la data iniziale nella Textbox1, e i giorni nella TextBox2:

  • TextBox3 = FINEMESE(TextBox1, TextBox2)

La funzione restituisce già il valore come tipo di dati "data", e come tale la considera per passaggi successivi in vba, ove si faccia uso di quanto contenuto nella TextBox3 (una data, appunto), ma non scordiamoci che quando passiamo invece il dato (la data) ad una cella del foglio, bisogna "avvisare" Excel del "tipo di dati" che si sta passando, usando una "Funzione di conversione del tipo di dati", quindi scriveremo ad esempio: [A1] = CDate(TextBox3).  (CDate è la funzione di convers.)

Questa la funzione: ho inserito (è necessario) il riconoscimento (Select Case) di quanti giorni ha ogni mese, e il riconoscimento dell'anno bisestile per febbraio a 29 giorni. La funzione lavora con date iniziali comprese tra l'anno 2000 e l'anno 2099:

  • Function FINEMESE(ByVal Data As Date, scad As Variant) As Date
    Dim Giorni
    If Day(Data) = 31 Then Data = Data - 1
    x = Data + scad
    fisso = Month(x)
    anno = Year(x)
    Select Case fisso
    Case 1, 3, 5, 7, 8, 10, 12
    Giorni = 31 - (Day(x))
    Case 4, 6, 9, 11
    Giorni = 30 - (Day(x))
    Case 2
    If anno Mod 4 = 0 Then
    Giorni = 29 - (Day(x))
    Else
    Giorni = 28 - (Day(x))
    End If
    End Select
    FINEMESE = x + Giorni
    End Function

La funzione andrà inserita in un modulo standard per essere visibile in tutto il progetto.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org