Articolo wiki
  • Questo articolo wiki è bloccato
Applicabile a 1158 visualizzazioni

Excel - Date senza il controllo ActiveX Calendar - VBA

Riepilogo

Livello tecnico: Conoscenza di base di Visual Basic for Applications Si applica a: Excel (97/2000/2002/2003/2007/2010/2013)

Dettagli

Per permettere all'utente di selezionare una data senza ricorrere al controllo AciveX Calendar (non sempre presente e fornito in diverse versioni) ed utilizzare  nel codice/trasferire sul foglio la data, possiamo utilizzare una semplice soluzione *fatta in casa*. Creiamo una UserForm con tre ComboBox, una per i giorni, una per i mesi e una per gli anni. Gestiamo poi il contenuto delle tre ComboBox per formare una data valida.

 

NOTA. L’esempio ed il codice sono forniti *così come sono* e l’autore declina ogni responsabilità per un loro uso scorretto. Utilizzate l’esempio fornito o un file di prova per i vostri test. La correzione delle eccezioni (errori) e il controllo del tipo di dati inserito è solo parziale. Il file vuole essere un semplice esempio che illustra come sia possibile automatizzare Excel ed è fornito solo a scopo dimostrativo.

Questa il risultato finale quando lanciamo la UserForm:

 

Figura 1: Come si presenta la UserForm a runtime.

 

Tutto il codice relativo alle operazioni possibili, si trova nel modulo di codice della UserForm ed è ampiamente commentato.

Come funziona? All’avvio della UserForm (che nell’esempio può essere lanciata con i tasti di scelta rapida CTRL+a), nelle ComboBox verranno caricati giorno, mese, anno correnti (meglio, quelli settati per il sistema operativo). A questo punto l’utente può selezionare la data desiderata. 

Nella parte sx della UserForm, nel Frame Seleziona un formato per la cella, possiamo selezionare il formato (nell’esempio i formati selezionabili sono 2) con il quale formatteremo la cella del foglio, indipendentemente dal formato già settato nella cella e quindi inseriremo la data selezionata nelle ComboBox. Questo il particolare del codice che in base alla selezione fatta formatterà la cella e inserirà la data:

 

        For Each ctrl In Me.Frame3.Controls

            If ctrl.Value = True Then

                s = ctrl.Name

            End If

        Next

        Select Case s

            Case "optUno"

                ActiveCell.NumberFormat = "dd/mm/yyyy"

            Case "optDue"

                ActiveCell.NumberFormat = "dddd dd mmmm yyyy"

        End Select

 

Nella parte dx della UserForm, nel Frame Data nelle TextBox in vari formati, semplicemente inseriamo nelle due TextBox la data in due formati differenti premendo il pulsante Date nelle TextBox. Con il pulsante Da TextBox a foglio, trasferiamo le due date in due celle a partire dalla cella attiva sul foglio. Notare come *prima* di trasferire le date dalle TextBox allle celle, *DEVO* convertire il *TESTO* delle TextBox in un tipo Date.

 

Le TextBox contengoni dati di tipo String (testo) e se non lo convertiamo in modo esplicito in tipo Date, vb farà una conversione implicita. Questa conversione implicita causa uno degli errori più comuni quando si ha a che fare con le date. Ad esempio, il testo 01/05/2013 (uno/maggio/duemilatredici) viene convertito implicitamente dal vb in 05/01/2013, questo perchè vb *ragiona all’americana*, cioè trasforma la data nel formato USA (maggio/cinque/duemilatredici). La cosa avviene solo con testo che può essere convertito scambiando giorno e anno in una data valida, altrimenti vb restituisce la data come noi la vediamo (esempio, 24/12/2013 viene sempre visto da vb come ventiquattro/dicembre/duemilatredici). 

 

Per evitare questa *incomprensione* fra l’americano vb e la localizzazione (leggi in questo caso il modo di rappresentare le date), è buona norma (leggi è fatto obbligo) convertire il testo restituito dalla TextBox in un dato di tipo Date. Ad esempio, copia/incollate questa macro in un modulo standard del vb di Excel e lanciatela:

 

Public Sub m()

    Dim s As String

    s = "01/05/2013"

    Foglio1.Range("A1").Value = s

    Foglio1.Range("A2").Value = CDate(s)

End Sub

 

In A1 avremo 05/01/2013, in A2 avremo 01/05/2013. Una bella differenza, eh?! Quindi utilizzate sempre le conversioni esplicite e/o definite sempre il tipo di variabile corretto per quello specifico tipo di dato.

 

Nell’evento Initialize della UserForm, oltre a caricare le ComboBox con i valori relativi a giorni/mesi/anni, setto a True la proprietà MatchRequired delle tre ComboBox. Questo impedisce all’utente di inserire valori non validi (viene sollevata un’eccezione).

Per non complicare troppo l’esempio, permetto che tramite le ComboBox siano selezionate date non valide (esempio 30/02/2012 o 31/11/2013) ma intercetto l’errore e avverto l’utente.

 

Il file d’esempio è scaricabile dal sito maurogsc.eu a questo link: ComboBoxDate.zip

 

NOTA. Excel non dispone nativamente di procedure assolutamente sicure per impedire la visualizzazione e la modifica del codice vb e/o per la protezione dei fogli. E’ una cosa da tenere sempre presente quando si distribuiscono file con contenuti ritenuti delicati. Ricordate anche che è possibile lanciare il file di Excel senza che vengano eseguite le macro.


Risorse.

 


 Avvio Pulito di Windows
(courtesy of Microsoft MVP Franco Leuzzi)


Computer infettato da malware (courtesy of Microsoft MVP Vincenzo Di Russo)



Commenti (0)

avanzamento