Funzione ARROTONDA non definita nell'espressione

Salve,

in STRUMENTI DATABASE/VISUAL BASIC ho creato nuovo modulo per definire la seguente funzione:

Function Arrotonda(numero As Variant) As Variant

If numero = "" Then
    Exit Function
End If

Dim valore As Currency

valore = Fix(numero * 1000)

    If Right$(valore, 1) >= 5 Then
    valore = valore + 10
    End If

valore = Fix(valore / 10) / 100
Arrotonda = valore
End Function

ma quando la richiamo in una query mi esce Access mi segnala in pop up: Funzione 'arrotonda' non definita nell'espressione.

Come posso risolvere?

P.S.: non consigliatemi di utilizzare la funzione ROUND in quanto sbaglia gli arrotondamenti sull'euro.

Ciao,

se nella chiamata utilizzi una stringa funziona.

Ciao Mimmo

Se la risposta ti ha aiutato "Vota Utile".
Se ha risolto il problema "Segna Risposta.
Rome, Italy

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

ciao Gianphy,

ti serve una funzione per l'arrotontondamento commerciale?

Certamente Round non fa al caso tuo e nonsbaglia l'arrotondamento sull'euro, semplicemente non e' la soluzione adatta al tuo scenario.

Incredibile certamente che nelle varie versioni di Access che si sono susseguite nel corso degli anni MSFT non abbia previsto qualcosa di nativo per questo scopo.

Lasciando perdere la funzione che hai proposto, vedi se questa di aiuta maggiormente :

Public Function myRound(dblnumber As Double, intdec As Integer) As Double
Dim dblf  As Double
Dim dblt As Double

dblf = 10 ^ intdec
dblt = dblnumber * dblf + 0.5
myRound= Int(dblt) / dblf

End Function

ciao, Sandro.

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

Ciao,

se nella chiamata utilizzi una stringa funziona.

Ciao Mimmo

Non mi è chiaro cosa intendi, puoi cortesemente farmi capire meglio, anche con un esempio?

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

ciao Gianphy,

ti serve una funzione per l'arrotontondamento commerciale?

Certamente Round non fa al caso tuo e nonsbaglia l'arrotondamento sull'euro, semplicemente non e' la soluzione adatta al tuo scenario.

Incredibile certamente che nelle varie versioni di Access che si sono susseguite nel corso degli anni MSFT non abbia previsto qualcosa di nativo per questo scopo.

Lasciando perdere la funzione che hai proposto, vedi se questa di aiuta maggiormente :

Public Function myRound(dblnumber As Double, intdec As Integer) As Double
Dim dblf  As Double
Dim dblt As Double

dblf = 10 ^ intdec
dblt = dblnumber * dblf + 0.5
myRound= Int(dblt) / dblf

End Function

ciao, Sandro.

Ciao Sandro,

innanzi tutto grazie per l'intervento.

Ho provato la funzione da te suggerita, ma ho lo stesso messaggio di errore: Funzione 'myRound' non definita nell'espressione.

Comincio a pensare che io commetta qualche errone nella definizione della funzione o nel richiamo nella query, pertanto facciamo un passo indietro.

Quelle righe di codice dove le scriviamo?

Nella query come richiamo la funzione?

Se potessi aiutarmi ulteriormente te ne sarei grato.

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

ciao Gianphy,

credo sia da sottolineare il tentativo che hai effettuato di risolvere il problema in autonomia con la funzione che hai proposto, che però è concepita ….male....effettui un tentativo di validazione dell'input, ma non è corretto procedere in tal modo, poi dividi e moltiplichi per lo stesso numero...

la funzione che ti ho proposto da me restituice quanto segue :

? myround(18.7883,3)
 18,788

? myround(18.785,2)
 18,79

? myround(18.78,1)
 18,8

Apri VBE editor inserisci un modulo nuovo, copia/incolla il codice proposto, salva e attiva la finestra immediata e testala come vedi qui sopra.

Ovvio che puoi utilizzarla anche in una query, passando il valore da arrotondare alla funzione stessa ed il relativo numero di decimali, al posto del valore numerico avrai un campo oppure un'operazione matematica.

Se ottieni errori di qualche tipo il problema è altrove….lancia un debug sempre dalla finestra del VBE ( debug e compila database ) correggi gli errori e riprova.

Controlla anche in strumenti ---> riferimenti se qualche libreria mostra il warning MANCA, e di conseguenza metti la spunta a tutte che mostrano questa caratteristica.

Facci sapere.

Ciao, Sandro.

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

ciao Gianphy,

credo sia da sottolineare il tentativo che hai effettuato di risolvere il problema in autonomia con la funzione che hai proposto, che però è concepita ….male....effettui un tentativo di validazione dell'input, ma non è corretto procedere in tal modo, poi dividi e moltiplichi per lo stesso numero...

la funzione che ti ho proposto da me restituice quanto segue :

? myround(18.7883,3)
 18,788

? myround(18.785,2)
 18,79

? myround(18.78,1)
 18,8

Apri VBE editor inserisci un modulo nuovo, copia/incolla il codice proposto, salva e attiva la finestra immediata e testala come vedi qui sopra.

Ovvio che puoi utilizzarla anche in una query, passando il valore da arrotondare alla funzione stessa ed il relativo numero di decimali, al posto del valore numerico avrai un campo oppure un'operazione matematica.

Se ottieni errori di qualche tipo il problema è altrove….lancia un debug sempre dalla finestra del VBE ( debug e compila database ) correggi gli errori e riprova.

Controlla anche in strumenti ---> riferimenti se qualche libreria mostra il warning MANCA, e di conseguenza metti la spunta a tutte che mostrano questa caratteristica.

Facci sapere.

Ciao, Sandro.

Innanzitutto grazie sempre.

Ho inserito un modulo nuovo, copiato/incollato il codice da te proposto, salvato e attivata la finestra immediata; al test compare pop-up: Errore di compilazione: Prevista variabile o routine e non modulo.

Al  tentativo di Debug, dopo aver selezionato tutte le righe di codice, compare invece altro pop-up: L'espressione di controllo selezionata non è valida

Infine, nei Riferimenti, trovo la spunta solamente alle prime 4 voci e cioè:

- Visual Basic For Applications

- Microsoft Access 16.0 Object Library

- OLE Automation

- Microsoft Office 16.0 Access database engine Object Library

Tutto il resto non è spuntato nè rinvengo alcun Warning tipo MANCA.

Mi spiace, sono molto carente in VBA ed altro non saprei proprio fare, a stento riesco a seguire le tue indicazioni. Credo proprio che dovrò rinunciare e tentare di scrivere una qualche espressione direttamente nella query (se ne sono capace).

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

hai salvato il modulo che contine la funzione con lo stesso nome della funzione….? si perché ottieni quell'errore, grazie al quale ora sai che devi nominarli in maniera diversa.

Rinomina il modulo come mod_Round o in qualsiasi altro modo a tuo piacere che non sia il nome della funzione.

Poi riprova effettuando i test nella finestra immediata come detto in precedenza e poi nella query.

Mai mollare.

Facci sapere.

ciao, Sandro.

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

..... Credo proprio che dovrò rinunciare e tentare di scrivere una qualche espressione direttamente nella query (se ne sono capace).

Infatti, prendendo ispirazione dal codice della tua funzione ho scritto direttamente nella query:

ValoreArrotondato: Int([CampoDaArrotondare]*100+0,5)/100

Laddove, nel mio caso specifico, dove ci possono essere dei ValoriDaArrotondare negativi (in annullamento a ValoriDaArrotondare positivi), mi sta meglio la funzione INT che non la FIX, perchè con quest'ultima gli arrotondamenti negativi differirebbero di un centesimo rispetto ai positivi, e la partita non si chiuderebbe. Ovviamente, trattandosi di valori in euro, mi sta bene moltiplicare prima, e dividere poi, per 100 (ottenendo l'arrotondamento alla seconda cifra in modo corretto a seconda del valore del terzo decimale).

Grazie tantissimo per il tempo che mi hai dedicato, che alla fine non è andato perso perchè mi hai dato l'input giusto per risolvere a modo mio.

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

hai salvato il modulo che contine la funzione con lo stesso nome della funzione….? si perché ottieni quell'errore, grazie al quale ora sai che devi nominarli in maniera diversa.

.....

Sì, cavolo.... Era proprio quello il problema, mi ostinavo a chiamare il modulo con lo stesso nome della funzione.... Ora va alla grande, l'ho testata nella finestra immediata (che prima nemmeno conoscevo l'esistenza) e va benissimo, anche con i numeri negativi (per come serve a me).

Non mi resta che implementarla nel mio database in ufficio ed inserirla nella query che mi fa tutti i calcoli (di una fattura, per intenderci). Ma non credo che qui nascano problemi.

Grazie, grazie e ancora grazie.

La risposta è risultata utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questa risposta?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questa risposta?

Grazie per il tuo feedback.

 
 

Informazioni domanda


Ultimo aggiornamento 6 ottobre 2021 Visualizzazioni 330 Si applica a: