Condividi:        

[excel] ciclo?

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] ciclo?

Postdi ramset64 » 03/01/09 12:11

Nelle celle B10 e C10 ho delle formule, io voglio scrivere un codice che faccia questo:

Partendo da un prezzo X nella cella A10, il codice deve aumentare il prezzo presente nella casella A10 di una unità finchè la cella B10 sia maggiore di C10.

In pratica, se B10 >= C10 aumenta di una unità il prezzo della cellla A10.


Come si scrive? e, in particolare, come faccio a far scrivere all'aumentare del prezzo X il relativo valore nella cella A10?
Grazie
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Sponsor
 

Re: [excel] ciclo?

Postdi Anthony47 » 03/01/09 19:19

Puoi usare un ciclo While /Wend, es
Codice: Seleziona tutto
While Range("C10").value <= Range("B10").value
Range("A10").value = Range("A10").value + 1
Wend

Un sistema meno elegante ma piu' sicuro puo' essere un ciclo For /Next
Codice: Seleziona tutto
For I=1 to 1000
If Range("C10").value > Range("B10").value then Exit For
Range("A10").value = Range("A10").value + 1
Next I
Questo sistema esce in ogni caso dopo max 1000 iterazioni, evitando il blocco nel caso la situazione cercata non possa realizzarsi.

In excel esiste anche una "ricerca obiettivo" (vedi help on line di excel); se in D10 metti =C10-B10 allora puoi usare il vba (oltre che il comando disponibile sotto Strumenti /Ricerca obiettivo) per ricercare l' obiettivo con l' istruzione
Codice: Seleziona tutto
Range("D10").GoalSeek Goal:=0, ChangingCell:=Range("A10")


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

Re: [excel] ciclo?

Postdi ramset64 » 04/01/09 16:29

Ok Anthony fatto :) , grazie.

Un piccolo problema con la visualizzazione:

While Range("AX" & x + 1).Value <= 1 - Range("AZ" & x + 1).Value
Range("S" & x + 1).Value = Range("S" & x + 1).Value + tick
'copio il primo prezzo utile nel report
Worksheets("Report").Range("A1").Value = Range("S" & x + 1).Value
Wend

Cosi ovviamente vedo nella cella A1 del foglio Report il prezzo cercato.
Vorrei però visualizzare nella stessa cella anche il prezzo man man che aumenta e quindi ho inserito Application.ScreenUpdating = True e Application.ScreenUpdating = False prima e dopo la riga che memorizza il prezzo in A1, ovvero:

While Range("AX" & x + 1).Value <= 1 - Range("AZ" & x + 1).Value
Range("S" & x + 1).Value = Range("S" & x + 1).Value + tick
'copio il primo prezzo utile nel report
Application.ScreenUpdating = True
Worksheets("Report").Range("A1").Value = Range("S" & x + 1).Value
Application.ScreenUpdating = False
Wend

però anzichè vedere quello che vorrei vedo quel che succede nel foglio dove ci sono i calcoli.

Cosa modificare per vedere nella cella A1 il prezzo che aumenta?
Ciao
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [excel] ciclo?

Postdi Anthony47 » 04/01/09 19:18

Per "vedere" l' evoluzione devi avere il foglio e la cella Selezionati; ma:
-la cosa dura pochi millisecondi, difficile che l' occhio riesca a cogliere
-sbaglio o e' la stessa cosa visualizzare la cella "("S" & x + 1)" del foglio corrente?

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

Re: [excel] ciclo?

Postdi ramset64 » 04/01/09 19:41

Anthony47 ha scritto:Per "vedere" l' evoluzione devi avere il foglio e la cella Selezionati; ma:
-la cosa dura pochi millisecondi, difficile che l' occhio riesca a cogliere

Anche con il foglio e la cella selezionati non si vede, anzi mi fa vedere un foglio diverso (quello appunto dove fa i calcoli) e non quello selezionato. Non dura pochi millisecondi ma almeno 8-10 secondi.

Anthony47 ha scritto:-sbaglio o e' la stessa cosa visualizzare la cella "("S" & x + 1)" del foglio corrente?

Si è la stessa cosa, infatti su questo foglio vedo l'aumentare del prezzo, mentre sull'altro prorpio no.
Ciao.
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [excel] ciclo?

Postdi Anthony47 » 04/01/09 20:21

Mi sfugge qualcosa...
Assodato che puoi selezionare un solo foglio e vedere una solo cosa alla volta, perche' vuoi vedere quella cosa su un altro foglio e non basta vederlo sulla cella "("S" & x + 1)" del foglio corrente?

8-10 secondi?? ma quanti cicli di calcolo deve fare? E se dura tanto, non e' il caso di valutare un calcolo matematico piuttosto che per approssimazione successiva?

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

Re: [excel] ciclo?

Postdi ramset64 » 04/01/09 20:29

Anthony47 ha scritto:Mi sfugge qualcosa...
Assodato che puoi selezionare un solo foglio e vedere una solo cosa alla volta, perche' vuoi vedere quella cosa su un altro foglio e non basta vederlo sulla cella "("S" & x + 1)" del foglio corrente?

8-10 secondi?? ma quanti cicli di calcolo deve fare? E se dura tanto, non e' il caso di valutare un calcolo matematico piuttosto che per approssimazione successiva?

Ciao.

A volte è difficile spiegare, scusami.
Dunque, io parto e quindi guardo il foglio1 dove vorrei appunto vedere questo risultato (che alla fine vedo), il fatto è che la macro dopo essere stata lanciata si sposta (e lo vedo) sul foglio2 dove appunto vedo la cella "("S" & x + 1)" (che non è il foglio corrente). Eppure l'istruzione di "farmi vedere" cosa fa, la macro ce l'ha solo per una riga (quella appunto che vorrei vedere).

IL calcolo dura un pò perchè il prezzo da cui partire a volte è lontano rispetto a quello a cui deve arrivare, non mi sembra ci sia approssimazione, la macro restituisce esattamente il primo prezzo che mi serve.
Ciao
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [excel] ciclo?

Postdi Anthony47 » 05/01/09 02:14

Buon ramset64,
Il "foglio corrente" e' quello su cui ti trovi; sulla base di quello mi hai fatto vedere, puo' avere qualsiasi nome, so solo che non si chiama "Report". E Foglio1 non so nemmeno se esiste.
Ma ora mi viene il dubbio che la tua macro NON SIA quella che hai postato, che e' invece solo un pezzo; se mi chiedi di immaginare cosa fa quello che non mi fai vedere, te lo dissi gia' in altre circostanze, non ci arrivo.

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

Re: [excel] ciclo?

Postdi ramset64 » 05/01/09 17:06

Caro Anthony è ovvio che essendo in fase di lavorazione i fogli mi cambiano nome, cosi come la macro pubblicata era solo un pezzettino (ma era evidente).... la macro adesso è terminata e grazie sopratutto ai tuoi consigli funziona perfettamente, eccola:
Sub Calcola()
'cancello il vecchio prezzo
Worksheets("Report").Range("Ingresso").Value = ""
Application.ScreenUpdating = False
'identifico l'ultima riga piena
ValoreRiga = Worksheets("Report").Range("LastRow").Value
'identifico il Valore del Tick
ValoreTick = Worksheets("Report").Range("Tick").Value

'copio per sicurezza le righe interessate dalla macro (per evitare problemi in caso di errore nella precedente esecuzione della macro)
Sheets("Sistema").Select
Rows(ValoreRiga - 5).Select
Selection.Copy
Rows(ValoreRiga - 5 & ":" & ValoreRiga + 5).Select
ActiveSheet.Paste
Application.CutCopyMode = False

'riposiziono il cursore nella prima cella
Range("Data").Cells(1, 1).Select


'identifico nuovamente l'ultima riga piena (perchè modificata in caso di errore nella precedente esecuzione della macro)
ValoreRiga = Worksheets("Report").Range("LastRow").Value

'scrivo la data successiva sulla colonna data
Sheets("Sistema").Select
Range("Data").Cells(ValoreRiga + 1, 1).Value = Range("Data").Cells(ValoreRiga, 1).Value + 1

'copio l'ultimo prezzo del giorno prima
Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value = Range(Worksheets("Report").Range("K19").Value).Cells(ValoreRiga, 1).Value

'cerco il primo prezzo con progressione di 10 ValoreTick per velocizzare
While Range("media1").Cells(ValoreRiga + 1, 1).Value <= 1 - Range("media2").Cells(ValoreRiga + 1, 1).Value
Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value = Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value + 10 * ValoreTick
Wend
'memorizzo l'ultimo step prima del cross
StartPrezzo = Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value - 10 * ValoreTick

'assegno al range l'ultimo step prima del cross
Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value = StartPrezzo

'calcolo il primo prezzo utile aumentando il prezzo di un ValoreTick alla volta
While Range("media1").Cells(ValoreRiga + 1, 1).Value <= 1 - Range("media2").Cells(ValoreRiga + 1, 1).Value
Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value = Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value + ValoreTick
Wend
'copio il primo prezzo utile nel report
Worksheets("Report").Range("Ingresso").Value = Range(Worksheets("Report").Range("K18").Value).Cells(ValoreRiga + 1, 1).Value

'ricopio le formule originali sulle righe interessate
Sheets("Sistema").Select
Rows(ValoreRiga - 5).Select
Selection.Copy
Rows(ValoreRiga - 5 & ":" & ValoreRiga + 5).Select
ActiveSheet.Paste
Application.CutCopyMode = False

'riposiziono il cursore nella prima cella
Range("Data").Cells(1, 1).Select

'torno al foglio Report
Sheets("Report").Select
Range("A1").Select
End Sub

E' evidente che i commenti li ho inseriti a mio uso e consumo (per capire cosa faccio) e non certo per te che non ne hai nessun bisogno.

E' in questa cella Worksheets("Report").Range("Ingresso").Value che vorrei vedere l'aumentare del prezzo ma non riesco. Adesso ho eliminato i codici Application.ScreenUpdating = True e Application.ScreenUpdating = False
prima e dopo il rigo che mi interessava perchè non funzionava.
Non so se sia scritta in maniera corretta o meno ma funziona!

Ciao
ramset64
Utente Senior
 
Post: 396
Iscritto il: 29/10/08 10:41
Località: Torino

Re: [excel] ciclo?

Postdi Anthony47 » 06/01/09 19:29

Se funziona e' perfetta cosi', compreso i commenti.
In questo momento la macro lavora tutto sul foglio Sistema, compreso nell' esecuzione dei cicli While /Wend; pero', a colpo d' occhio, selezionare Sistema in quel frangente dovrebbe essere inutile, e puoi tranquillamente switchare su Report.
Ti direi quindi di provare a inserire questa:
Codice: Seleziona tutto
'copio l'ultimo prezzo del giorno prima           '<<Commento esistente
Sheets("Report").select : Range("Ingresso").select      '<<< Riga aggiunta

Completati i cicli la seleziona cambia rapidamente verso Sistema e poi verso Report-A1; con Application.ScreenUpdating = False potresti schermare il primo cambiamento, ma non il secondo a fine macro; a meno che (volendo vedere il valore finale), non fai uscire un Msgbox, es con
Codice: Seleziona tutto
Msgbox("Valore target: " & Worksheets("Report").Range("Ingresso").Value)

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


Torna a Applicazioni Office Windows


Topic correlati a "[excel] ciclo?":


Chi c’è in linea

Visitano il forum: Nessuno e 67 ospiti