› Sviluppare funzionalita su Microsoft Office con VBA › La data "spedita" in stile europeo, "ritorna" in stile americano.
-
AutoreArticoli
-
ciao a tutti!
Sto preparando un form, e dato il mio livello, mi faccio aiutare dal forum e dal youtube. Adesso mi è nato un problema con le date.
Ho una casella di testo, per la data assegnato ad un evento, accanto ci sono dei spin button con le frecce su e giù, per diminuire ed incrementare la data nella casella. Ancora, accanto alle frecce c'è un'altra casella di testo, indipendente, che riporta dal foglio excel la differenza delle date, cioè quanti giorni mancano, o sono passati dall'evento. Il problema è che, anche se il meccanismo funziona bene, e riporta tutto esatto sul foglio excel con il pulsante "aggiorna", chiudendo tutto e poi aprendo, il valore della data compare convertito in americano, cioè mm/dd/yyyy. Ciò fa sì che il calcolatore della data.diff mi dia valori sballati. Per esempio, l'evento del 11/08/2019, anche se inviato giusto col "aggiorna", controllando il foglio di calcolo, quando ritorno, lo ritrovo in stile americano, 08/11/2019, pure sul foglio di calcolo, ed il calcolo della data.diff va oltre 150 giorni di differenza. Lo stesso quando mi sposto su altro record e ritorno indietro. Come posso fare per rimediare?
Quì le routine:
Private sub sbp1_spindown()
On error resume next
If me.txtdp1 = "" then
Me.txtdp1 = date
Else
Me.txtdp1 = cdate(me.txtdp1) - 1
Txtgproc = datediff("d", txtdp1, date)
End if
End sub
Private sub sbp1_spinup()
On error resume next
If me.txtdp1 = "" then
Me.txtdp1 = date
Else
Me.txtdp1 = cdate(me.txtdp1) + 1
Txtgproc = datediff("d", txtdp1, date)
End if
End sub
Txtdp1 è la casella di testo contenente la data da assegnare
Txtgproc è la casella di testo contenente il calcolo della differenza delle date, che cambia in funzione della data in txtdp1.
Spero di essermi spiegato bene!
Grazie, e buone vacanze!
Genci
è nato un problema con le date.
Anche per mia esperienza le date sono una spina nel fianco da sempre (ed è per questo che nei miei database le memorizzo in formato testo, nonostante qui mi abbiano già rimproverato, ma pazienza, preferisco una cosa che funziona certamente a una cosa che magari, riaprendo il giorno dopo, non funziona più).
Quello che non dici è come riempi la textbox txtdp1 (cioè la data) inizialmente, non attraverso gli spin button, ma appena aperto l'userform. hai un evento Initialize da mostrare?
Di passaggio, quando posti codice, utilizza per cortesia il pulsante "(codice VBA)" nell'editor per la miglior formattazione e leggibilità del codice stesso, grazie.
Txtdp1.text = cells(currentrow, 11).text
Questo è come appare nel "initialize", riprende dunque il valore che trova nella cella, formattata a data europea(dd/mm/yyyy). Comunque, mi andrebbe bene anche formato testo con una lista a discesa, ad intervallo prescelto, ma si può fare? Ovviamente, dopo devo usare funzioni di testo per spezzettare e concatenare e poi convertire in data, giusto?
P.s. Chiedo scusa, non sapevo dell'esistenza del pulsante per codici.
Ricordo di aver provato con lista a discesa, ma qualcosa non riuscivo ad aver sotto controllo, o perlomeno capito, forse il calcolo della differenza in giorni fra le date.
Grazie vecchio frac! Apprezzabile il suo aiuto!
Per curiosità prova questo (siamo in Initialize):
Txtdp1.text = format(cells(currentrow, 11).text, "dd/mm/yyyy")
e poi dimmi. Poi pensiamo alla lista a discesa, che non ho capito cosa vuoi fare. Dopodichè non serve spezzare o concatenare, perchè la data verrà mostrata correttamente. Se potessi allegare un file di esempio, senza dati riservati, su cui lavorare, sarebbe anche meglio 🙂
Apprezzabile il suo aiuto!
Nei forum è usuale darsi del tu 😉
Non funziona. L'ho inserito nel "initialize", con il format dd/mmm/yyyy, a scanso di equivoci miei. Ma, oltre a visualizzare come testo il mese, non ha reso stabile la data, si inverte lo stesso. Presumo che è inutile impostare la formattazione dappertutto, su "aggiorna", "next", "previous" ecc. Sembra non cambi nulla.
Invece, combobox rende sempre in formato testo, e questo è un punto fisso, da dove vorrei ripartire, perché mi ha preso molto tempo questo inghippo ed un'altra questione di "if" con molti criteri.
Posso chiederti come hai gestito il combobox di data in testo per calcolare la data.diff? Sul foglio excel va sempre tenuto in formato testo o come?Magari mi conviene tornare in quel modo. Grazie
Più tardi allego il file, premettendo che è un "lavori in corso", con tanti eccessi e mancanze. Buona serata!
Aspetterò il file. Magari se puoi inserisci un risultato atteso così capiamo meglio l'obiettivo.
Nella zona "procedura", dove sono tre procedure, la data della procedura deve essere determinata, in modo che renda il calcolo di giorni di differenza dalla data stessa dell'avvenuta procedura. Ciò, permetterebbe scatenare dei follow-up molteplici, derivanti dal calcolo sumenzionato.
Allegati:
You must be logged in to view attached files.L'ho chiamata formVisible, perché è una versione dove, tra l'altro, provo dei compari-scompari con gli oggetti non essenziali, che si può provare, cliccando sul segno "sbiffato", nella prima procedura, ma ancora da ottimizzare.
Un file complesso, devo spendere un pochino per ambientarmi, abbi pazienza 🙂
Aiutami a capire cosa fare per riprodurre l'inconveniente che lamenti (cosa inserire e dove)
mi basterebbe tu non ridessi del pastrocchio.
Ma dai immagino che tu ci abbia messo tanto ed è quindi un ottimo lavoro, il problema per me è che le scritte sono molto piccole e faccio fatica 🙂
Guarda, questo dovrebbe risolvere:
Cells(currentrow, 11) = CDate(dataprocedura)
è la riga 6245 (argh!) del codice di ufrmTabellone, la procedura di cmdUpdate_Click (il pulsante Aggiorna).
Presumo che vada fatto lo stesso (precisare CDate, intendo) ogni volta che tratti con le date. Alla fine le righe del codice sono oltre diecimila, un po' spaventoso in effetti 🙂
se fai la prova sulla tab delle "consulenze ed esami", il meccanismo funziona. non capisco dove sta la differenza.
comunque, questo è il mio livello, tutto si svolge "dietro le quinte". importante che funzioni. e grazie anche al tuo aiuto, e di Patel, fino a questo punto, funziona.
grazie, di nuovo, e alla prossima!
dici che farei bene ad applicare la stessa stringa a tutte le date del simile meccanismo? adesso mi metto a studiare la CDate.
CDate (come tutte le funzioni che cominciano per C: CInt, CSng, CStr ecc) è una funzione di forzatura di conversione di un dato a un tipo predefinito. Automaticamente il nuovo dato assume le caratteristiche predefinite per quel tipo di dato.
importante che funzioni
Questa è la regola base, di cui non accontentarsi, e alla quale dovrebbe essere applicata in successione la regola che prevede di apportare migliorie per garantire l'efficienza 😉
-
AutoreArticoli