Condividi:        

[Excel] Goalseek

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

[Excel] Goalseek

Postdi gik » 22/10/07 16:28

Salve a tutti, il solito problemone:

Sto usando la funzione goalseek,

Codice: Seleziona tutto
 Range("F33").GoalSeek Goal:=0, ChangingCell:=.Range("E14")


in questo modo varia la cella E14 finché la F33 non va a zero.

Purtroppo vorrei che la ricerca si arrestasse qualora il valore di E14 arrivi a 0.2, avendo la necessità di farlo rimanere positivo.

Raggiunto il valore E14=0.2 attiverò un altra funzione
Codice: Seleziona tutto
 Range("F33").GoalSeek Goal:=0, ChangingCell:=.Range("E15")

finché E15 non raggiunge il valore di 0.2, e così via fino ad E17.
Qualora anche quest'ultimo vada a 0.2 la ricerca si arresta.

E' possibile aggiungere quest'ulteriore limite al goalseek?
ho provato con il do until - loop, ma non riesco.

:oops: aiut...
" ... e come il sol che fulvo scema attergo il cupo mare, negli occhi miei, tu, riverberi radiosa"
GIK
gik
Utente Junior
 
Post: 86
Iscritto il: 18/07/06 16:41
Località: Gaeta

Sponsor
 

Postdi Anthony47 » 22/10/07 23:21

GoalSeek cambia il valore di E14 (primo caso) fintanto che non ottiene il valore cercato in F33; il valore finale ovviamente dipende dalla formula di F33 e suoi precedenti

Per quello che chiedi, potrebbe forse bastare inserire dopo ogni GoalSeeek qualcosa come
Codice: Seleziona tutto
If .Range("E14")<=0 then .Range("E14").value = 0.2
(la sintassi e' da affinare sul tuo contesto).

Fai sapere se ti torna, ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19220
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi gik » 23/10/07 07:49

Grazie Ant.
Anch'io avevo pensato qualcosa del genere per aggirare il problema.

Per in meno esperti chiarisco che la funzione Goalseek:
Codice: Seleziona tutto
Range("F33").GoalSeek Goal:=0, ChangingCell:=.Range("E14")

modifica E14 finché F33 diventa uguale al Goal impostato (in questo caso 0).

Chiaramente in F33 c'è una funzione che fa riferimento a E14.
Nel mio caso Goalseek deve ridurre E14 per ridurre il valore di F33, ma non vorrei far scendere E14 sotto un certo valore (ad esempio 0.2 oppure al di sotto del 30% del suo valore iniziale).

Codice: Seleziona tutto
save = .Range("E14").Value


Codice: Seleziona tutto
.Range("F33").GoalSeek Goal:=0, ChangingCell:=.Range("E14")
If .Range("E14")<=0.7*save then .Range("E14").value = 0.7*save


grazie ancora
" ... e come il sol che fulvo scema attergo il cupo mare, negli occhi miei, tu, riverberi radiosa"
GIK
gik
Utente Junior
 
Post: 86
Iscritto il: 18/07/06 16:41
Località: Gaeta

Postdi gik » 23/10/07 08:51

Purtroppo ho ancora problemi, non riesco a far scendere il goalseek:

Come faccio,Raggiunto il valore E14=0.2, ad attivare un'altra funzione
Codice:
Range("F33").GoalSeek Goal:=0, ChangingCell:=.Range("E15")

finché E15 non raggiunge il valore di 0.2, e così via fino ad E17?

Ho provato ad usare un do while Range("F33") >0
ma non riesco. Qualche suggerimento?
" ... e come il sol che fulvo scema attergo il cupo mare, negli occhi miei, tu, riverberi radiosa"
GIK
gik
Utente Junior
 
Post: 86
Iscritto il: 18/07/06 16:41
Località: Gaeta

Postdi gik » 23/10/07 11:19

:lol:

ho risolto i problemi eliminando goalseek e creando un surrogato:

Codice: Seleziona tutto
Do While .Range("F33").Value > 0
        .Range("E17").Value = Range("E17").Value - INC
        Loop


In questo modo la stima non va alla deriva, non so perché.

Goalseek mi creava molti problemi, incrementando in alcuni casi E17 fino a valori altissimi.

Poi ho creato una serie di if in sequenza per scendere alle righe successive.

Purtroppo è una soluzione molto sporca. Potete aiutarmi a compattare?

Come faccio a far leggere la stessa variabile i a diverse macro?mi serve per mantenere l'indice i del worksheets(i).range("E17") tra + macro che si aprono con i cicli if.
" ... e come il sol che fulvo scema attergo il cupo mare, negli occhi miei, tu, riverberi radiosa"
GIK
gik
Utente Junior
 
Post: 86
Iscritto il: 18/07/06 16:41
Località: Gaeta

Postdi Anthony47 » 23/10/07 21:51

Per avere una variabile condivisa da piu' macro dello stesso modulo devi dichiararla (dim) in testa al modulo, prima di tutte le Macro. Se la vuoi condividere nel progetto devi dichiararla Public.

Per quanto riguarda l' ottimizzazione, senza sapere bene quale e' il problema e' difficile...
Un paio di domande a caso:
Dici che usi le If per chiamare macro diverse: quale e' la differenza tra ognuna di queste macro? E perche' le attivi con gli If (nel senso che avevo capito che andavano eseguite in sequenza)?

E poi: quando dici "soluzione sporca" alludi a un fatto legato all' estetica del codice, o all' efficacia?
E le funzioni in esame sono proprio cosi' complesse da non poter essere risolte matematicamente?

Infine, per complicarti la vita, ti segnalo il componente aggiuntivo "Risolutore", che mette a disposizione una serie di istruzioni vba della classe "SolverXxxx" che hanno potenzialita' piu' spinte, in termini di vincoli e modalita' di risoluzione. Ma su questo le mie conoscenze sono "pari o inferiori" alle tue!

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


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Goalseek":


Chi c’è in linea

Visitano il forum: Nessuno e 57 ospiti