VBA Null

di AP314 il
21 risposte
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

  • 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
  • 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.
  • @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
  • Nn ho capito quasi nulla delle tue spiegazioni ma prova a sostituire così
    ris=iif( nz(Me.MioCbo.Value,vbnullstring)<>vbnullstring,"OK","KO")
  • 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"))
    
  • Rubik non ti piaceva l'nz che ho proposto io?
  • 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.
  • 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.
  • 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")
  • @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.
  • 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.
  • 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
  • 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