[RISOLTO] Problema If - Then utilizzando VBA

di il
15 risposte

[RISOLTO] Problema If - Then utilizzando VBA

Buona sera.

In una maschera di inserimento dati, legata ad una singola tabella, vorrei che in base al "grado" del nuovo dipendente che mi accingo ad inserire, ed alla data della sua "promozione", venga calcolata automaticamente la data della sua prossima promozione in funzione dell'anzianità che deve maturare in quel grado, ed inserirla materialmente nel campo della tabella.
Ogni "grado" ha un periodo diverso di permanenza.
Ho predisposto il seguente codice, che avrei ripetuto a seguire per ogni "grado" previsto.
If Me.Grado Like "App." Then Me.AvanzamentoPrevisto = DateAdd(Year, 5, Me.DataPromozione)
che ovviamente non funziona (restituisce errori, proponendo il debug):
Dai vari tentativi fatti, sembra che il problema risieda nella funzione DateAdd...
[EDIT]
Ho risolto (sembra - ) semplicemente sostituendo "Year" con "yyyy" nella funzione DateAdd...
Che dire:
Sbagliando e sbattendo la testa si impara.
Grazie dell'attenzione

15 Risposte

  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    A parte che se leggi la Guida alla funzione DateAdd, ti dice tutto:
    https://support.microsoft.com/it-it/office/funzione-dateadd-63befdf6-1ffa-4357-9424-61e8c57afc19

    Direi che se tu hai un Elenco di opzioni, converrebbe avere una Tabella nella quale Salvi i dati relativi a GRADO-AVANZAMENTO, quindi riduci il codice da scrivere ad 1 sola riga, ed ottieni la possibilità di rendere un domani FLESSIBILE un eventuale variazione dei dati senza riscrivere codice.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Ringrazio per l'attenzione.
    Effettivamente il tuo.suggerimento è la prima cosa che avevo pensato, ma...
    La mia scarsa competenza mi renderebbe complicata la realizzazione della "riga di codice.
    Per questo ho optato per questo percorso.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Naturalmente si accettano suggerimenti...
    ... che sarebbero ben graditi, visto che anche la ricerca sul web sul metodo da seguire (anche di massima) non ha dato grandi frutti
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Robpagna ha scritto:


    Naturalmente si accettano suggerimenti...
    ... che sarebbero ben graditi, visto che anche la ricerca sul web sul metodo da seguire (anche di massima) non ha dato grandi frutti
    Ciao Robpagna,
    ti propongo un'altro approccio. Invece di calcolare la data della prossima promozione ed inserirla in tabella, potresti predisporre una maschera non associata in cui inserire un'elenco a discesa, contenente tutti i gradi in modo da poter selezionare quello desiderato, due caselle di testo, in cui inserire le date di inizio e di termine richieste per l'inclusione nell'avanzamento, ed un pulsante di comando, per aprire una query di selezione. Poi ti basterà predisporre una query di selezione, prendendo i dati dalla tua tabella, in cui includere nominativo, grado e data di promozione. Filtrando poi, tramite i criteri della query, il grado e data di promozione con i dati inseriti nella maschera, recuperandoli attraverso i relativi riferimenti, avrai un elenco delle persone che hanno i requisiti per andare in avanzamento. In una situazione simile io ho agito così.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Grazie Mikelemm per l'interessamento.
    Nella mia maschera di inserimento, è già presente l'"elenco a discesa" da dove selezionare i "gradi", che popola automaticamente anche degli altri campi relativi ad altre caratteristiche specifiche per ciascuno di essi.
    Ho già impostato delle query che generano gli elenchi delle persone che maturano il diritto, suddivisi per varie categorie, periodi,....
    La mia necessità era solo quella di ricavare "in automatico" le date del previsto avanzamento all'atto dell'inserimento del nuovo dipendente, senza dover farlo manualmente, consultando l'attuale disciplina in materia (che di tanto in tanto può cambiare).
    Non ho mai considerato l'utilizzo del VBA perché non lo conosco se non a livello base, ma dopo aver googlato un pò, devo riconoscere che ha delle potenzialità enormi.
    Infatti, con una serie di if - then, ho risolto un problema che, sebbene poteva essere bypassato anche con delle query di aggiornamento, in questo modo mi è sembrato molto più semplice ed immediato.
    Mi sarebbe piaciuto approfondire il suggerimento di Alex, ovvero di utilizzare una tabella come "archivio" dei dati da poter utilizzare per i conteggi (che consente anche di poter modificare i parametri all'occorrenza senza rivedere i vari codici in giro per le maschere), ma non sono riuscito a trovare una strada che mi indirizzasse correttamente.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Ti suggerisco di seguire il consiglio già proposto da Alex in modo da avere un sistema che non sia legato al codice ma realizzato tramite una tabella che possa essere aggiornata all'occorrenza, dal punto di vista pratico creare una tabella con i campi: Grado e Periodo (ad esempio in mesi o anni) il quale deve essere aggiunto per determinare la data futura di avanzamento.
    Con tale struttura è sufficiente ricercare il grado con la funzione DlookUp ed acquisire il periodo previsto per l'avanzamento che aggiunto alla data di riferimento, con la funzione DateAdd, fornirà la data futura.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Grazie Willy55
    Mi sono documentato un pò (googlando) sulla funzione DLookUp; pensavo di aver capito il funzionamento e la sintassi, ma evidentemente non è così:
    L'approccio che avevo utilizzato per "la riga di codice" che ha suggerito Alex è il seguente:
    Me.AvanzamentoPrevisto = DateAdd("yyyy", (DLookup("[PermGrado]", "1El_Gradi", "[Grado]" Like Me.Grado)), Me.DataPromozione)
    Dove 1El_Gradi è una tabella che contiene diversi campi, tra i quali l'elenco delle mansioni/livelli del personale (Gradi) ed anche il periodo di permanenza in ciascuno di essi espressi in anni-valore intero (PermGrado)
    Per fare delle prove, dopo aver associato questo codice ad un pulsante della maschera, compare l'errore "Utilizzo non valido di Null".
    Anche la semplice esecuzione della funzione DLookUp (senza altre operazioni), non restituisce nessun risultato, lasciando il campo di destinazione vuoto.
    Ho provato ad usare questa funzione anche in una query, ma ugualmente restituisce un campo vuoto.

    In cosa sbaglio?
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Procedi per gradi, prima controlla la funzione DLookUp, in quanto la sintassi da te impiegata è errata; considera inoltre che se nessun record soddisfa i criteri oppure se il dominio non contiene record viene restituito il valore Null (come specificato nella documentazione):

    Ulteriore considerazione è, dal momento che conosci il "Grado", perché, nei criteri, utilizzi la "Like" che risulta più lenta e potrebbe estrarre la prima occorrenza, in caso di valori plurimi; quindi è preferibile utilizzare l'operatore di uguaglianza (=).
    https://support.microsoft.com/it-it/office/introduzione-alle-espressioni-5cad6e24-65a3-4a95-82cc-92b4b1bd4b8b
    https://support.microsoft.com/it-it/office/esempi-di-criteri-di-query-3197228c-8684-4552-ac03-aba746fb29d8
    Solo dopo agisci sulla funzione DateAdd.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    L'errore era nel richiamo a "Me.Grado" mentre invece sarebbe dovuto essere il percorso completo del campo
    l'espressione corretta è diventata:
    ... DLookup("[PermGrado]", "[1El_Gradi]", "[Grado] = [Maschere]![Personale2]![Grado]")...
    Sono soddisfatto di aver conosciuto, approfondito un pò questa funzione (DlookUp) e compreso il suo funzionamento.
    Grazie.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    In realtà la sintassi che hai usato, pur funzionando NON è il massimo, in quanto costringe il sistema ad un doppio passaggio di conversione.
    L'errore che hai commesso è questo:
    
    "[Grado]" Like Me.Grado"
    Il Me si usa se il codice gira nella stessa maschera, altrimenti serve il percorso come hai detto sopra, ma non come hai fatto tu...
    Tu hai scritto
    
    "[Grado] = [Maschere]![Personale2]![Grado]"
    Ma in questo modo la stringa non è ESPLICITA, e serve che qualcuno converta ----> [Maschere]![Personale2]![Grado]
    Quindi la sintassi giusta è così
    
    "[Grado] = " & Forms![Personale2]![Grado])...
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    @Alex ha scritto:


    Ma in questo modo la stringa non è ESPLICITA, e serve che qualcuno converta ----> [Maschere]![Personale2]![Grado]
    Quindi la sintassi giusta è così
    
    "[Grado] = " & Forms![Personale2]![Grado])...
    Sono una zappa. Non ho attenuanti di alcun genere!!!

    Non comprendo la differenza tra le due stringhe:
    [Maschere]![Personale2]![Grado]
    & Forms![Personale2]![Grado]
    ma, tempo permettendo, approfondirò...
    Ringrazio Alex per la precisazione.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Robpagna ha scritto:


    ...
    Non comprendo la differenza tra le due stringhe:
    [Maschere]![Personale2]![Grado]
    & Forms![Personale2]![Grado]
    ma, tempo permettendo, approfondirò...
    Ringrazio Alex per la precisazione.
    La differenza sta solo nel "DOVE" scrivi quella sintassi...!
    Se la scrivi in VBA non passa per l'interprete di LINGUA, quindi serve FORMS... se la scrivi in QBE, o tramite Generatore di Espressioni o in qualsiasi punto dell'interfaccia Grafica, vuole dire in modalità struttura dalla Maschera delle proprietà... serve la prima in quando la sintassi passa per l'interprete.
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    OK.
    Grazie ancora
    [edit]
    Sto per fare un'altra figura:
    Ho utilizzato la sintassi suggerita in una finestra messaggio:
    MsgBox "Periodo AV: " & DLookup("[PermGrado]", "[1El_Gradi]", "[Grado] = " & Forms![Personale2]![Grado])
    ma non sembra piacergli:
    Cattura.JPG
    Cattura.JPG

    Ricava il grado di "apprendista" presente sulla maschera, ma non lo gestisce
  • Re: [RISOLTO] Problema If - Then utilizzando VBA

    Come ti ho detto se i campi sono nella stessa maschera puoi usare [Me]
    
    MsgBox "Periodo AV: " & DLookup("[PermGrado]", "[1El_Gradi]", "[Grado] = " & Me![Grado])
    Ciò detto, questo modo di scrivere è assolutamente ERRATO e SCONVENIENTE perchè la funzione DLOOKUP restituisce un Type VARIANT, che potrebbe anche essere NULL, mentre la funzione MsgBox accetta solo Stringhe, oltretutto NON è Debuggabile in quel modo.
    Quando si scrive codice, la contrazione della sintassi la si fa in modo strutturalmente utile non a prescindere.
    Nel tuo caso avresti dovuto scrivere così per usare una sintassi utile
    
    Dim vPerm As Variant
    vPerm=DLookup("[PermGrado]", "[1El_Gradi]", "[Grado] = " & Me![Grado])
    If Len(vPerm & vbNullstring)>0 Then
        MsgBox "Periodo AV: " & cstr(vPerm)
    Else
        MsgBox "Non ho trovato nulla"
    End if
    In ogni caso nel tuo esempio si evince che il Campo [Grado] sia TESTO e non Numerico, di conseguenza la sintassi esposta è errata in quanto manca un APICE, dal messaggio di errore della stringa.

    Quindi il codice corretto diverrebbe:
    
    [code]
    Dim vPerm As Variant
    vPerm=DLookup("[PermGrado]", "[1El_Gradi]", "[Grado] = '" & Me![Grado] & "'")
    If Len(vPerm & vbNullstring)>0 Then
        MsgBox "Periodo AV: " & cstr(vPerm)
    Else
        MsgBox "Non ho trovato nulla"
    End if
Devi accedere o registrarti per scrivere nel forum
15 risposte