Condividi:        

[excel] Anomalia con vba

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Re: [excel] Anomalia con vba

Postdi scossa » 19/04/15 14:20

riskismoney ha scritto:Non bisogna cambiare nessun valore. Basta lanciare la macro e vedrai che la condizione in B2 è disattiva. Poi sulla cella A2 cliccare su F2/ENTER e la condizione diventa attiva.


Sbagli a utilizzare, in VBA, l'arrotondamento di Excel.
Sostituisci
Codice: Seleziona tutto
g = Application.WorksheetFunction.Floor(f, 0.01)

con
Codice: Seleziona tutto
g = VBA.Round(f, 2)


P.S.: Se esamini (Ultimo-Basso)/(Alto-Basso)*100 noterai che vale 79,999999999999 mentre dopo l'esecuzione del tuo codice vale 80,0000000000039
Con VBA.Round vale 79,999999999999
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Sponsor
 

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 14:52

Grazie scossa!!!!
:)

Ma quell'arrotondamento di vba non è un arrotondamento "per difetto"... io devo arrotondare in una macro per difetto ed in un' altra per eccesso.
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Re: [excel] Anomalia con vba

Postdi scossa » 19/04/15 15:08

riskismoney ha scritto:Ma quell'arrotondamento di vba non è un arrotondamento "per difetto"... io devo arrotondare in una macro per difetto ed in un' altra per eccesso.


Per arrotondare per eccesso al secondo decimale aggiungi 0.005, esempio:
?vba.Round(45.268+0.005, 2)

Per arrotondare per difetto al secondo decimale togli 0.005, esempio:
?vba.Round(45.268-0.005, 2)
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 15:19

scossa ha scritto:
riskismoney ha scritto:Ma quell'arrotondamento di vba non è un arrotondamento "per difetto"... io devo arrotondare in una macro per difetto ed in un' altra per eccesso.


Per arrotondare per eccesso al secondo decimale aggiungi 0.005, esempio:
?vba.Round(45.268+0.005, 2)

Per arrotondare per difetto al secondo decimale togli 0.005, esempio:
?vba.Round(45.268-0.005, 2)

Eh no... cosi non va bene... o meglio funziona correttamente se la mia variabile g non è già arrotondata a 2 decimali. Nel caso specifico 23146,26 diventa 23146,25 arrotondato per difetto come da te suggerito.

Forse si potrebbe fare cosi quando si arrotonda per difetto:
x = Application.WorksheetFunction.Floor(f, 0.01)
g = VBA.Round(x, 2)

o sbaglio?
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Re: [excel] Anomalia con vba

Postdi scossa » 19/04/15 15:49

riskismoney ha scritto:Eh no... cosi non va bene... o meglio funziona correttamente se la mia variabile g non è già arrotondata a 2 decimali ....


Ovvio, di norma l'arrotondamento si deve applicare una sola volta, non vedo dove sia il problema nel farlo.
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 15:58

Credo di non essermi spiegato.
Prima di qualsiasi arrotondamento il valore che viene fuori dal calcolo vba è 23146,26, se applico il tuo suggerimento di arrotondare cosi (visto che io non so se quel valore è già arrotondato o meno): VBA.Round(g -0.005,2) ottengo 23146,25 che è sbagliato.
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Re: [excel] Anomalia con vba

Postdi scossa » 19/04/15 16:59

riskismoney ha scritto:visto che io non so se quel valore è già arrotondato o meno


Cosa significa "non so se" ... il codice lo scrivi tu, saprai se, dove e quando lo arrotondi.

Comunque usa un valore correttivo più basso: +/- 0.0005:
?vba.round(23146.255+0.0005, 2)
23146,26

?vba.round(23146.255-0.0005, 2)
23146,25

?vba.round(23146.245+0.0005, 2)
23146,25

?vba.round(23146.245-0.0005, 2)
23146,24
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 17:19

Proprio non riesco a spiegarmi eh....
Io non posso sapere che tipo di risultato ottengo PRIMA dell'arrotondamento.

Esempio1, risultato Pre-Arrotondamento f = 23146,26
Esempio2, risultato Pre-Arrotondamento f = 23146,26343

Utilizzando g=Application.WorksheetFunction.Floor(f, 0.01) in entrambi i casi io ottengo 23146.26 (che è il valore corretto che cerco, sempre facendo riferimento ai dati presenti sul foglio).

Uitlizzando invece VBA.Round(f- valore correttivo, 2) non ho affatto la certezza di ottenere il risultato giusto anzi nell'esempio 1 ho la certezza di ottenere un RISULTATO ERRATO ovvero 23146,25, a prescindere dal valore correttivo.
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Re: [excel] Anomalia con vba

Postdi scossa » 19/04/15 17:29

riskismoney ha scritto:Uitlizzando invece VBA.Round(f- valore correttivo, 2) nell'esempio 1 ho la certezza di ottenere un RISULTATO ERRATO ovvero 23146,25, a prescindere dal valore correttivo.


Assolutamente no!

?vba.Round(23146.26 - 0.0005 ,2)
23146,26

?vba.Round(23146.26 + 0.0005 ,2)
23146,26
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 17:40

Guarda non ci sono certezze in questo modo:

vba.Round(23146.269999 - 0.0005 ,2) = 23146,27 anzichè 23146,26
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Re: [excel] Anomalia con vba

Postdi scossa » 19/04/15 18:11

riskismoney ha scritto:Guarda non ci sono certezze in questo modo:

vba.Round(23146.269999 - 0.0005 ,2) = 23146,27 anzichè 23146,26


Ora ho capito cosa intendi: tu con l'arrotondamento per difetto intendi troncare le cifre decimali oltre la seconda.

?vba.Int(23146.269999*100)/100
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 18:31

No... non mi serve questo. A me serve arrotondare alla seconda cifra decimale, per difetto in un caso e per eccesso nell'altro, il numero che viene fuori dal calcolo vba.

In pratica quello che si fa con excel in questo modo:
=ARROTONDA.DIFETTO(f;0,01)
=ARROTONDA.ECCESSO(f;0,01)
per questo avevo utilizzato
g = Application.WorksheetFunction.Floor(f, 0.01)
g = Application.WorksheetFunction.Ceiling(f, 0.01) che però abbiamo visto dà qualche problema.

Mi pare di aver capito che con la funzione VBA.Round questi arrotondamenti per difetto e per eccesso non si possono fare quindi, come ho scritto qualche post fa, si potrebbe fare cosi:

ARROTONDAMENTO PER DIFETTO:
g = Application.WorksheetFunction.Floor(f, 0.01)
g = VBA.Round(g,2)

ARROTONDAMENTO PER ECCESSO
g = Application.WorksheetFunction.Ceiling(f, 0.01).
g = VBA.Round(g,2)

Non sono molto esperto di vba e quindi non riesco a "vedere" se in questo modo ci possono comunque essere problemi.
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Re: [excel] Anomalia con vba

Postdi Anthony47 » 19/04/15 18:53

Come ho detto nell' intervento precedente (che pero' e' in fondo alla pagina1 e quindi invisibile; viewtopic.php?f=26&t=104371#p609580), l' errore sul calcolo (Ultimo-Basso)/(Alto-Basso) e' sul 19° decimale (partendo dai 5 interi del 23000); quindi basta arrotondare quel risultato al 10 decimale e il risultato sara' ok. Cioe' con la formula
Codice: Seleziona tutto
=SE(VAL.NUMERO(Ultimo);SE(E((ARROTONDA((Ultimo-Basso)/(Alto-Basso);10)*100)<=Livello;Var<-Soglia);"Attiva";"Disattiva");"")

Mi permetto di pensare che anche con decimali molto piu' bassi il risultato sara' soddisfacente; diciamo che si puo' benissimo arrotondare a 6 decimali per coprire valori di Ultimo /Basso /Alto fino a 7 digit (1-9milioni) senza rischiare di falsare i calcoli con valori nell' ordine delle unita'.

Come vedete io preferisco lavorare sulle formule, non sul vba; ma e' questioni di preferenze personali.

Ribadisco comunque la mia opinione su tutta la discussione:
Anthony ha scritto:Ma io non vedo tutto questo problema...

Dici "ho un livello minimo che attiva una condizione", quindi hai una condizione On/Off; e' critico che la "condizione" invece di scattare a 23146,26-Epsilon (il noto "Epsilon piccolo a piacere") scatti a 23146,26 + Epsilon? Penso di no, e quindi tutto si traduce alla meraviglia sul fatto che due entita' (il foglio Excel e il vba) fanno calcoli che sembrano uguali e producono risultati che differiscono di un Epsilon; ma dimentichiamo che solo qualche anno fa, se facevi 10/3*3 molte calcolatrici davano ancora come risultato 9.999999
Nel caso in discussione l' Epsilon e' pari a 3.9*10(-19); piccolo abbastanza...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 19:16

Ciao Anthony, valuterò anche la tua formula.

Vero che il problema è piccolo in termini di calcolo ma è grande in termini di praticità. Senza una correzione, di formule e/o di vba, è del tutto inutile la macro che utilizzo. Tutto qua. :)

Io penso che la mia ultima soluzione, ovvero quella proposta prima del tuo intervento, può comunque andar bene ma attendo un parere di voi che siete decisamente più esperti.
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Re: [excel] Anomalia con vba

Postdi scossa » 19/04/15 19:20

riskismoney ha scritto:No... non mi serve questo. A me serve arrotondare alla seconda cifra decimale, per difetto in un caso e per eccesso nell'altro, il numero che viene fuori dal calcolo vba.


Premesso che sono d'accordo con Anthony, ma prima hai detto:
io devo arrotondare in una macro per difetto ed in un' altra per eccesso.

quindi in una userai il primo e nell'altra il secondo:
wikipedia ha scritto:Con l'arrotondamento per difetto (o troncamento), ci si limita ad eliminare le cifre successive
Con l'arrotondamento per eccesso, al risultato del troncamento si aggiunge una quantità pari ad una unità dell'ultima cifra conservata.
Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: [excel] Anomalia con vba

Postdi ramset1978 » 19/04/15 19:41

Ok di soluzioni ce ne sono abbastanza. Ringrazio vivamente Anthony e Scossa. Buona serata.
Ramset1978
Win 7 + Office 2010 Ita
ramset1978
Utente Senior
 
Post: 223
Iscritto il: 25/03/12 16:04
Località: Avezzano

Precedente

Torna a Applicazioni Office Windows


Topic correlati a "[excel] Anomalia con vba":


Chi c’è in linea

Visitano il forum: Marius44 e 5 ospiti