Il dato non è valorizzato correttamente mi pare evidente.
Si me ne sono accorto.
Non capisco perchè non lo valorizza correttamente solo quando al codice aggiungo la parte riguardante la sottomaschera
Sottomaschere? sono due? nel codice che avevi postato era una, con quella chiamata strana...Form.CalcParam FirstDayInWeek...Che caos! non capisco più niente.
Proviamo a ripartire?
Se le due funzioni, CalcParam e FirstDayInWeek sono inalterate rispetto a quelle pubblicate in precedenza, non postarle nuovamente, però specifica dove sono scritte: modulo generale? le hai lasciate nella maschera principale? sono scritte anche nelle sottomaschere?
Metti però il codice completo dell'evento, della sub o quello che è mai, in cui compare l'errore, specificando dove si trova (maschera principale, sottomaschera eccetera) e usa il nome reale delle maschere, così da riferirsi a quello che hai lì davvero.
Immediatamente prima di ogni chiamata alle funzioni metti un
Debug.Print variabiledelparametrodiFirstDayInWeekche può essere Me!txtGoToData o altro.
Si perdona la confusione, faccio chiarezza:
La maschera principale si chiama Appuntamenti, mentre la sottomaschera si chiama Appuntamenti2.
La funzione FirstDayinWeek è presente nel codice della maschera princiapele "Appuntamenti" e anche nella sottomaschera "Appuntamenti 2", la stessa cosa vale per la funzione CalcParam.
Sono entrambe "Public Function"
L'errore si presenta a livello della FirstDayinWeek presente nella maschera principale "Appuntamenti".
Ho aggiunto il debug.print come segue:
Function FirstDayInWeek(Optional dtmDate As Variant, Optional vFirstDayInWeek As VBA.VbDayOfWeek = VBA.VbDayOfWeek.vbMonday) As Date ' ------------------------------------------------------ ' Restituisce il primo gg della settimana passando la Data ' ------------------------------------------------------ Debug.Print Me!txtGoToData If IsMissing(dtmDate) Then dtmDate = Date FirstDayInWeek = Fix(dtmDate - Weekday(dtmDate, vFirstDayInWeek) + 1) End FunctionMe!txtgotodata viene valorizzato nel modo corretto, passandoci sopra il cursore ottengo il valore da me impostato nella maschera, tuttavia il debug evidenzia l'ultima riga della funzione dandomi come errore appunto "tipo non corrispondente"
Grazie per l'aiuto e per la pazienza
Ohhh... finalmente un po' di luce.
Due funzioni identiche, Public, in due maschere aperte contemporaneamente. Non ti sembra che tutto questo sia "contrario al buon senso", che nella maggiorparte dei casi corrisponde anche alle regole di scrittura di buon codice? Correre subito, ma subito subito, a dichiararle in un modulo standard, passando il riferimento alla maschera come avevo indicato, eliminadole dalle maschere.
Quando hai sistemato in quel modo guardiamo per quale controllo e per quale maschera si verifica l'errore, mettendo un punto di interruzione nelle maschere ad ogni chiamata della funzione CalcParm (che prevede l'uso di FirstDayinWeek)
(togli dalla funzione Debug.Print Me!txt... perché quando è in un modulo standard non si può usare Me!)
Hai ragione, prima scrivendo mi sono accorto di quanto fosse ridodontante.
Tuttavia, ho spostato in un nuovo modulo la funzione FirstDayinWeek cancellandola dalle maschere.
Se provo a fare lo stesso con CalcParam si genera un errore all'apertura della maschera dovuto al fatto che nella funzione ci sono alcuni riferimenti per la maschera "Me!..." posso rendela privata e lasciarla all'interno della maschera?
p.s. se può essere utile, commentando il calcparam della maschera princiapale, in questo modo:
Private Sub txtGoToData_AfterUpdate() 'CalcParam FirstDayInWeek(Me.txtGoToData) Me!Appuntamenti2.Form.CalcParam FirstDayInWeek(Me.txtGoToData) End Subfunziona correttamente nella sottomaschera, quindi è come se non funzionasse solo quando li attivo entrambi, a prescindere da quale sia.
Ultima modifica di Rinaldino23; 04-04-2021 12:00
Prova, se ti senti "più sicuro" così, male che vada non funziona (già non funzionava prima). Sta di fatto che quand'anche si risolvesse con questo sistema della funzione Private nella maschera non c'è motivo perché non debba funzionare con una funzione unica scritta in un modulo standard e Public, dicendo su quale maschera deve agire.
Come ti ho scritto in un post precedente, prima di ogni chiamata della funzione CalcParam metti il Debug.Print di Me.txtGoToData
Private Sub txtGoToData_AfterUpdate() Debug.Print "Prima chiamata = " & Me.txtGoToData CalcParam FirstDayInWeek(Me.txtGoToData) Debug.Print "Seconda chiamata = " & Me.txtGoToData Me!Appuntamenti2.Form.CalcParam FirstDayInWeek(Me.txtGoToData) End SubGuarda cosa compare nella finestra immediata.
Comunque1: a meno che CalcParam non vada a modicare anche txtGoToData, non ha senso invocare due volte FirstDayInWeek due volte, per calcolare la data da passare a CalcParam. Si dichiara una variabile di tipo data, si assegna a questa il risultato di FirstDayinWeek(Me.txtGoToData) chiamata da sola e si passa la variabile alle due chiamate di CalcParam. Ripeto: se CalcParam non va a modificare txtGoToData.
Comunque2: solo quando hai detto che CalcParam è scritta in entrambe le maschere questa sintassi ha avuto senso
Me!Appuntamenti2.Form.CalcParam FirstDayInWeek(Me.txtGoToData)(penso di aver trovato tutti i modi di scrivere sbagliato CalcParam, spero di aver corretto dappertutto)
ho inserito il debug.print, e inserendo come data, ad esempio in txtgotodata 29/05/2021, ottengo:
Prima chiamata = 29/05/21
Seconda chiamata = 24/05/2021
Per quanto riguarda il Comunque 1, confermo che CalcParam non va a modificare il txtgotodata, di conseguenza vorrei come dici tu assegnare una variabile di tipo data e assegnarla poi, ma ho difficoltà nella sintassi, avevo pensato a questo :
Private Sub txtGoToData_AfterUpdate() Dim GiornataScelta As Date GiornataScelta = FirstDayInWeek(Me.txtGoToData) Me.CalcParam (GiornataScelta) Me!Appuntamenti2.Form.CalcParam (GiornataScelta) End Subcosì sembrerebbe funzionare, pensi possa andar bene?
Ultima modifica di Rinaldino23; 04-04-2021 17:02
e questo già è preoccupante, o no? A maggior ragione nel momento in cui prosegui dicendo il debug.print ha appena dimostrato che tra una chiamata e l'altra Me.TxtGoToData cambia. di conseguenza vorresti giustamente capire perché tra una chiamata e l'altra succede questo, che in teoria non dovrebbe succedere. Per questa cosa invece
fin qui ci siamo. Aggiungi immediatamente dopo un Debug.Print GiornataScelta fino a quando non ne usciamo.
E' qui che cade tutto.
Anche se uno non si rendesse conto che la funzione CalcParam vuole una data quando viene chiamata e che quindi scrivereMe.CalcParam = GiornataScelta Me!Appuntamenti2.Form.CalcParam = GiornataScelta
CalcParam = quellochetiparenon potrà mai funzionare, andando di pura logica, terra terra:
1) prima chiamavi due volte la funzione in questo modoCalcParam FirstDayInWeek(Me.txtGoToData)2) hai una variabile, adesso, che è già il risultato diFirstDayInWeek(Me.txtGoToData)3) basta sostituire FirstDayInWeek(Me.txtGoToData) con la variabile che ne contiene il risultato, ci si riusciva anche con un "Trova/Sostituisci" da menù, tanto per dire quanto fosse banale. Tradotto: perché hai sentito il bisogno di mettere un [=] dopo CalcParam?
Rinaldino23... se non ne esci seguendo le indicazioni di questo post, l'unica è che pubblichi un file dimostrativo del tuo db perché ci stiamo perdendo in cose che sembrano non aver senso e tu ci metti del tuo a complicare la soluzione.
Se si arriva a questo punto, mi raccomando: un file ridotto all'osso, non tutto il db (inutile aggiungere che non devono esserci dati sensibili/personali/identificativi), e con la situazione di partenza, quella di cui al post di apertura, verificando che il problema si presenti anche in quel file.
Perdonami ho modificato poi il codice nella mia ultima risposta ma mi sa che avevi già cominciato a scrivere, mi ero accordo dell'errore madornale.
Ora riguardo con attenzione le tue indicazioni e cerco di uscirne per capire il senso di tutto.
Grazie ancora