VBA Null

di il
21 risposte

VBA Null

Ho uno script VBA che cerca di accedere ad alcuni controlli, tipo
Ris=iif( Me.MioCbo.Text<>"","OK","KO")

PROBLEMA!!!
Talvolta MioCbo appare "Nullo" sebbene esista nella maschera e il codice è richiamato nell'AfterUpdate di un controllo, quindi tutta la maschera è caricata. Come fa ad essere Nullo?

Ho aggirato il problema con un doppio IF annidato che però è difficile da leggere e decuplica il numero di righe. Considerate che di questi IIf ne ho parecchi.
Come faccio a fare tutto in una riga?
Ho già appurato che non esiste nè AndAlso nè "?."

Ho provato anche a scrivere una funzione che restituisce una stringa che prima verifica l'esistenza del campo e poi accede a Text ma ottengo errore quando si tratta di passargli il parametro. Non gli piace che sia nullo.
Anche provare ad assegnare all'oggetto una ComboBox virtuale si è rivelato fallimentare.

Esiste soluzione ai mei problemi o devo usare la lunghissima struttura annidata?

21 Risposte

  • Re: VBA Null

    IsNull ti può far comodo?
    https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/isnull-function
  • Re: VBA Null

    AP314 ha scritto:


    Ris=iif( Me.MioCbo.Text<>"","OK","KO")
    Talvolta MioCbo appare "Nullo" sebbene esista nella maschera e il codice è richiamato nell'AfterUpdate di un controllo, quindi tutta la maschera è caricata. Come fa ad essere Nullo?...
    La proprietà a cui fare riferimento è Value, non Text.
    Considerando che il Value di una combobox è Variant potrebbe anche essere Null, quindi il controllo fatto con la funzione IsNull non è da escludere. In caso di presenza di colonne nascoste (larghezza zero) potresti dover accedere al valore che ti interessa usando la proprietà Column.
    La pagina Microsoft che tratta la ComboBox contiene l'elenco di eventi, proprietà e metodi con esempi.
    https://docs.microsoft.com/en-us/office/vba/api/access.combobox
  • Re: VBA Null

    Non ho capito molto ma non usare la proprietà TEXT, usa la proprietà VALUE in quanto in Access la proprietà TEXT richiede obbligatoriamente che il controllo abbia il FOCUS.

    Se quel controllo non ha associazione a campo in query o tabella devi scrivere il codice nella proprietà OrigineControllo.
  • Re: VBA Null

    @Rubik
    Sì, ho provato con IsNull, e grazie a quella uso 10 righe al posto che una sola, perchè devo annidare gli IF.

    @Philcattivocarattere e @Alex
    Grazie ma il problema arriva prima di accedere a Text o Value: è proprio MioCbo che risulta nullo, non i suoi campi.

    Se Text o Value fossero Null sarebbero comunque diversi da stringa vuota e mi aspetterei di ottenere "OK", sarebbe un errore ma correggibile.

    Effettivamente si tratta di un campo non associato ma comunque popolato tramite query. Con "scrivere il codice nella proprietà OrigineControllo" intendi popolarla?
    Ho creato altre maschere simili con ComboBox prive di Origine controllo ma solo con Origine riga e funzionano.

    ---

    Quella che mostro in allegato è il tentativo di chiamata di una funzione che ho provato a dichiarare con parametro Control, Variant, Object, ma il risultato è sempre questo errore.
    Allegati:
    31802_4b902682ef7864d441aff836842a7f14.png
    31802_4b902682ef7864d441aff836842a7f14.png
  • Re: VBA Null

    Nn ho capito quasi nulla delle tue spiegazioni ma prova a sostituire così
    ris=iif( nz(Me.MioCbo.Value,vbnullstring)<>vbnullstring,"OK","KO")
  • Re: VBA Null

    AP314 ha scritto:


    @Rubik
    Sì, ho provato con IsNull, e grazie a quella uso 10 righe al posto che una sola, perchè devo annidare gli IF.
    Non conosco bene la sintassi di VBA, una cosa simile per creare un'unica istruzione, non credo che devi scrivere 10 righe di codice.
    
    If IsNull(Me.MioCbo.Text) Then Ris = "KO" Else Ris = IIf(Me.MioCbo.Text <> "", "OK", "KO")
    
    se ti piace IIF:
    
    Ris = IIf(IsNull(Me.MioCbo.Text), "KO", IIf(Me.MioCbo.Text <> "", "OK", "KO"))
    
  • Re: VBA Null

    Rubik non ti piaceva l'nz che ho proposto io?
  • Re: VBA Null

    AP314 ha scritto:


    Quella che mostro in allegato è il tentativo di chiamata di una funzione che ho provato a dichiarare con parametro Control, Variant, Object, ma il risultato è sempre questo errore.
    Potresti mostrare la riga completa in cui si verifica l'errore? il codice è nascosto dalla finestra dell'errore stesso.
  • Re: VBA Null

    muttley005 ha scritto:


    Rubik non ti piaceva l'nz che ho proposto io?
    Non ho la possibilità di provare e vado a memoria, mi sembra che nz restituisca zero o una stringa nulla, se un variant è nullo.
    Perseguivo solo il mio consiglio con IsNull e visto che AP314, aveva detto che funzionava ma doveva scrivere 10 righe per implementarlo...

    Per il resto tutti gli esempi funzionanti arricchiscono la discussione, non è una gara

    Poi quando scrivo senza editor, non mi sento mai sicuro, non ho una buona memoria sintattica.
  • Re: VBA Null

    Magari leggi la guida e non sparare a memoria, dicendo oltretutto di non averne... è brutto e non funziona.

    Questo che forza il casting del type in stringa prende sia Variant che può assumere Null che String che invece NON può assumere null ma NullString.
    
    Iif(Len(tuoriferimennto + "")=0;"Zero";">Zero")
  • Re: VBA Null

    @Alex, fornisci il tuo contributo anche se scritto parzialmente.
    Se sei sicuro che ho postato un codice errato, mostra l'errore o evita commenti inutili.
    Se risponderai con altre affermazioni inutili alla soluzione del problema, non ririsponderò contribuendo ad aumentare le righe fuori tema.

    Spero che AP314 ci farà sapere quale soluzione sceglierà e quali funzionano, il fatto che abbia avvertito che ho scritto le mie soluzioni a memoria e senza editor, era per informare di porre attenzione al codice, in modo che una parentesi in più o in meno o una virgola fuori posto siano subito individuate.
  • Re: VBA Null

    Rubik ha scritto:


    @Alex, fornisci il tuo contributo anche se scritto parzialmente.
    Se sei sicuro che ho postato un codice errato, mostra l'errore o evita commenti inutili.
    Se risponderai con altre affermazioni inutili alla soluzione del problema, non ririsponderò contribuendo ad aumentare le righe fuori tema.
    Ho già scritto fin troppo il codice suggerito è completo di spiegazione tecnica approfondita, a te leggere per documentarti e sviscerare gli argomenti non chiari.
    Se poi la tua conoscenza è tale da ritenerlo inutile... sorrido... ma passo... penso che siano già stati scritti troppi post.
  • Re: VBA Null

    Rubik non la devi prendere sul personale, nessuno voleva offenderti, semplicemente il forum serve per aiutare persone a migliorare nella programmazione e non solo a superare un ostacolo.
    Detto questo, giusto per chiudere la discussione e chiarire 2 argomenti tirati in ballo:
    1) hai scritto
    mi sembra che nz restituisca zero o una stringa nulla, se un variant è nullo
    e non è esatto, NZ serve per restituire un valore di default scelto dal programmatore in caso di valore null del primo parametro ma non per forza deve restituire 0 o nullstring, as esempio
    nz(miaVar,"ciccio")
    2) un codice funzionante non per forza significa che vada bene o che sia performante/ottimale, ad esempio il tuo è più esteso e e meno performante del mio, come il mio temo lo sia rispetto a quello di Alex
  • Re: VBA Null

    Grazie muttley005

    Non ho testato il codice di @Alex in VBA, in VB .Net non funziona, perchè un oggetto Null restituisce errore se viene usato all'interno di Len, un oggetto Nothing invece restituisce zero, anche far fare una conversione implicita al compilatore non è una buona regola di programmazione.
    Non credo che lo abbia testato nemmeno @Alex, visto che il codice postato contiene errori, ci sono i punti e virgola invece delle virgole....

    codice postato errato:
    Iif(Len(tuoriferimennto + "")=0;"Zero";">Zero")
Devi accedere o registrarti per scrivere nel forum
21 risposte