Condividi:        

Ciclo for con copia

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

Ciclo for con copia

Postdi Gianca532011 » 07/02/20 22:13

Ciao a tutti.
Devo fare un calcolo utilizzando un foglio già predisposto, in pratica nelle celle K1 e L1 inserisco con Input Box due valori, anche negativi , poi in cella K4 ne calcolo la diferenza suddivisa su n. anni . Ottengo un valore medio annuale .
Poi In F1 inserisco la serie per il calcolo successivo . Facciamo un esempio pratico S Minimo = -01, SFine = 4.0 , Sdelta = 4-(-0.1) = 4,1 / 10 anni = 0.41
Ora in F8 , dove avviene il calcolo ottengo : 1008.15 primo step .
Poi in F8 avrò -0.1+0.41 = 0.31 quindi ottengo 975.24
poi in F8 avro 0.31+0.41 = 72 che al calcolo mi dà 943,64
etc fino a 4 dove ottengo 731.60
Il problema e che non riesco a sistemare il ciclo for con copia .
A questo sono arrivato
Codice: Seleziona tutto
Sub ciclo1()
 Dim SInizio As Double, SFine As Double, SDelta As Double, N As Long, I As Long, X As Double, Riporto As Double
   Dim Dura As Worksheet, Dati As Worksheet
       
    Application.ScreenUpdating = False
    Application.CutCopyMode = False
       
           Set Dura = ThisWorkbook.Sheets("Duration")
            Set Dati = Sheets("Dati")
            N = Dati.Range("$B$4")
           
            SInizio = Dura.Range("$K$1").Value ' valore di inizio della serie
            SFine = Dura.Range("$L$1")  ' valore di fine serie
            SDelta = Dura.Range("$K$4").Value ' questo è l'incremento (cella K4) da usare nel ricalcolo in cella F1
             Riporto = Dura.Range("$f$8").Value ' in questa cella trovo il risultato corrispondente
                               
                                Dati.Range("F1:f100").ClearContents
               ' Dura.Range("F1").ClearContents
                 'I = 0
                For X = SInizio To SFine Step SDelta
                   I = I + 1
       Dati.Range("F" & I + 1).Value = X * 100
                                     
                    Next X
                                               
                 Application.ScreenUpdating = True
                 Application.CutCopyMode = True
                       
                 Set Dura = Nothing
                 Set Dati = Nothing
               
                 End Sub
             



Però 1 : la macro non completa la sequenza nel senso che si ferma al penultimo valore , ma non mi da il 4,.0 finale ? mentre se la faccio fuzionare al contrario ( Sfine to Sinizio step -sdelta è perfetta !
2) il problema successivo è di fare lo spostamento contemporaneo dei dati calcolati in F8 . assieme al valore che lo promuove in F1


Allego file per chiarezza.
http://www.filedropper.com/stest

Sono un paio di gironi che ci sbatto la testa senza cavarne nulla, un grazie anticipato a chi ci metterà del suo .
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: Ciclo for con copia

Postdi Gianca532011 » 08/02/20 16:35

Allora, la prima parte della macro sono riuscito a sistemarla con un controllo sul contatore , resta il problema della copia contemporanea del valore immesso e risultato ottenuto.

Codice: Seleziona tutto
Sub ciclo1()
 Dim SInizio As Double, SFine As Double, SDelta As Double, N As Long, I As Long, X As Double, Z As Long
   Dim Dura As Worksheet, Dati As Worksheet
         
    Application.ScreenUpdating = False
    Application.CutCopyMode = False
       
            Set Dura = ThisWorkbook.Sheets("Duration")
            Set Dati = Sheets("Dati")
                   
            SInizio = Dura.range("$K$1").Value ' valore di inizio della serie
            SFine = Dura.range("$L$1").Value  ' valore di fine serie
            SDelta = Dura.range("$K$4").Value ' questo è l'incremento (cella K4) da usare nel ricalcolo in cella F1
                               
                Dati.range("B1:B50").ClearContents
                Dura.range("F1").ClearContents
                           
               N = Dura.range("$B$4") ' + 1
                     
               I = 0
               For X = SInizio To N Step SDelta
                  If I <= N Then  ' questo pone un limite al contatore.
                       I = I + 1 ' riporta una riga sotto
                                         
                 Dati.range("B" & I + 1).Value = X
                             Else: Exit Sub
               End If
              Next X
                           
                 Application.ScreenUpdating = True
                 Application.CutCopyMode = True
                       
                 Set Dura = Nothing
                 Set Dati = Nothing
               
                 End Sub
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Anthony47 » 08/02/20 19:39

Sinteticamente: io non ho capito il quiz.
Mi son fatto un'idea di a che cosa serve il foglio Duration, ma poi non ho capito come vorresti usarlo.

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

Re: Ciclo for con copia

Postdi Gianca532011 » 08/02/20 22:12

Provo a rispiegare con immagini :
http://www.filedropper.com/duration_1

http://www.filedropper.com/2fogliodati

Nel foglio dati ti presento il risultato finale che vorrei ottenere , tieni conto che per la prima e la seconda colonna avevo già le rispettive macvro, quella che mi manca è l'aggiustamento dell'ultima che ho postato con la copia abbinata del risultato per ogni valore immesso in F1.
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Anthony47 » 09/02/20 16:27

"In F1, a partire dal val. minimo ottengo in F8 il risultato, lo copio su fo. Dati, poi aggiungo un delta [...]"
quella che mi manca è l'aggiustamento dell'ultima [macro] che ho postato con la copia abbinata del risultato per ogni valore immesso in F1

Nella tua Sub ciclo1 io vedo che Dura!F1 subisce subito un ClearContents e rimane vuoto.

Comunque, nell'ipotesi che la domanda sia "come faccio a riportare il valore di F8 sul foglio Dati" allora ti basterebbe aggiungere nel tuo ciclo For X /Next X l'istruzione marcata "AGGIUNGI 1" (il resto e' il tuo codice attuale)
Codice: Seleziona tutto
For X = SInizio To N Step SDelta
    If I <= N Then  ' questo pone un limite al contatore.
        I = I + 1 ' riporta una riga sotto
        Dati.Range("B" & I + 1).Value = X
        Dati.Range("C" & I + 1).Value = Dura.Range("F8")    'AGGIUNGI 1
    Else: Exit Sub
    End If
Next X

Ma questo copierebbe in Dati!colonna C sempre lo stesso valore

Nell'ipotesi che per avere valori nuovi in Dura!F8 sia richiesta la scrittura di un valore in Dura!F1, ad esempio il valore incrementale di "X", allora ti basterebbe aggiungere sempre nel ciclo For X /Next X l'istruzione marcata "AGGIUNGI 2":
Codice: Seleziona tutto
For X = SInizio To N Step SDelta
    If I <= N Then  ' questo pone un limite al contatore.
        I = I + 1 ' riporta una riga sotto
        Dati.Range("B" & I + 1).Value = X
        Dura.Range("F1").Value = X                          'AGGIUNGI 2
        Dati.Range("C" & I + 1).Value = Dura.Range("F8")    'AGGIUNGI 1
    Else: Exit Sub
    End If
Next X

Vedi se tra queste ipotesi trovi qualcosa che si addice alla tua domanda

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

Re: Ciclo for con copia

Postdi Gianca532011 » 09/02/20 17:29

Innanzitutto un grazie veramente sentito.
ora provo a capire quanto hai fatto :
Codice: Seleziona tutto
For X = SInizio To N Step SDelta
    If I <= N Then  ' questo pone un limite al contatore.
        I = I + 1 ' riporta una riga sotto
        Dati.Range("B" & I + 1).Value = X    ' e fino a qui mi è abbastanza  chiaro.
 
'  ora tu hai detto alla macro :[b] ocio che adesso la  variabile X è la cella F1 [/b]
        Dura.Range("F1").Value = X                          'AGGIUNGI 2

'[b] andrai a scrivere in C di fo dati , partendo da rigo 1 aggiungi una riga alla volta di un valore =  alla cella F8 del foglio Dura[/b]
       
 Dati.Range("C" & I + 1).Value = Dura.Range("F8")    'AGGIUNGI 1
    Else: Exit Sub
    End If
Next X


E corretta la mia comprensione del testo ??

Altro problemino., con il ciclo K1 < di L1 , è l'esempio fatto _0.1 a 4 , la macro lavora bene ma ... al contrario se avessi valori tipo K1 4 > L1 -0.1 cosa succede ??
succede che la macro , giustamente parte da 4 e gli somma il delta , io invece vorrei che 4 andasse al mio valore finale di -0.1 quindi con decrementi negativi.
4.00%
4.41%
4.82%
5.23%
5.64%
6.05%
6.46%
6.87%
7.28%
7.69%
8.10%
Cosa ne dici, posso gestire il tutto con una istruzione If e due for il primo è quello attuale per K1 <L1 e il secondo per K1>L1 ma anzichè sommare il delta dovrei sottrarlo . Oppure hai di meglio nel cappello, anzi sotto al cappello ?
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Anthony47 » 10/02/20 13:26

E corretta la mia comprensione del testo ??
Purtroppo la mia comprensione del tuo testo e' inferiore a quella tua per il mio... Comunque a occhio direi che e' corretta (insomma dovresti copiare la mia seconda proposta, quella che contiene anche AGGIUNGI_2

Quanto alla seconda preoccupazione, non so se deriva da prove o è "a occhio"; perche' secondo me, "a occhio", il problema non si pone perche' se K1 > L1 allora SDelta (lo Step del ciclo) risultera' negativo e la il ciclo si svolgera' all'indietro.

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

Re: Ciclo for con copia

Postdi Gianca532011 » 10/02/20 18:52

Purtroppo c'è qualcosa che non "gira correttamente " sicuramente a causa del valore negativo che dovrei ottenere . Come da esempio allegato la macro si ferma all'ultimo valore appunto all'ultimo calcolo :

I calcoli di col. C li riporta correttamente - meno l'ultimo valore e non completa la serie in decremento ( col. B) con l'utimo numero negativo = 0.04 -( -0.44) = +0.48 <<< forse è questa la causa ??


Mentre dovrei ottenere = 0.04 +(-0.44) = -0.40



Megarompicapo !!!!

http://www.filedropper.com/stest_1
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Gianca532011 » 11/02/20 08:55

Anthony non perderci tempo, stamattina tutto OK. probabilmente era un mio problemino hardware : un connettore tra due PC che non funzionava bene per probabilmente un falso contatto. Boh , oggi continuo le prove. Comunque se vuoi provare il file test che ti ho linkato sopra ... solo per conferma. Grazie.
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Anthony47 » 11/02/20 12:44

Per rispondere appropriatamente avrei bisogni di sapere se i valori presenti in K1 ed L1 sono rispettivamente il primo e l'ultimo che devono comparire nella tabella del foglio Dati; perche' in questo caso bisogna prevedere 11 risultati e non solo 10

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

Re: Ciclo for con copia

Postdi Gianca532011 » 11/02/20 15:55

1) Si, limitatamente alle colonne Be C : K1 è sempre il valore di inzio serie e L1 quello finale, analogamente per i corrispettivi calcolati in colonna C .
2) si, effettivamente la serie è di 11 valori ovvero 0-->10 per al colonna A Anni .
3) quello che però mi succede è che talvolta l'elenco si ferma a 10 valori , in Be C e talvolta prosegue fino all'undicesimo . ??
E' questo che non riesco a capire
Cosi è corretta , per una serie che ha: K1 = 4.0 e L1 = -0.8
Codice: Seleziona tutto
anni      
0   4.00%   731.60
1   3.52%   758.60
2   3.04%   786.88
3   2.56%   816.48
4   2.08%   847.49
5   1.60%   879.97
6   1.12%   914.02
7   0.64%   949.71
8   0.16%   987.13
9   -0.32%   1026.37
10   -0.80%   1067.55

Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Anthony47 » 12/02/20 00:43

Il problema che riscontri e' legato agli "arrotondamenti" che il vba fa durante i calcoli.
Visto che il vba usa per il tipo dati Double una precisione a 15 cifre, non e' impossibile che 0.06 (6%) venga invece calcolato come 0,0600000000000001 (>6%) che fa terminare il ciclo For /Next un calcolo prima di quanto atteso.
Ovviamente questo non si pone quando si lavora con numeri interi e "tipi" quali Integer o Long

Visto che bisogna lavorare necessariamente coi decimali, allora e' necessario procedere con degli arrotondamenti per troncare molto prima che intervenga l'imprecisione di calcolo

Avendo inoltre confermato che i cicli, negli esempi posti, devono essere 11, e avendo finalmente capito quale era la tua richiesta, mi permetto di riscrivere la Sub Ciclo come segue:
Codice: Seleziona tutto
Sub Ciclo2()
Dim Dura As Worksheet, Dati As Worksheet, SInizio As Double, SFine As Double, sDelta As Double
Dim I As Long, nextX As Double

Set Dura = ThisWorkbook.Sheets("Duration")
Set Dati = Sheets("Dati")
 
SInizio = Dura.Range("$K$1").Value      ' valore di inizio della serie
SFine = Dura.Range("$L$1").Value        ' valore di fine serie
sDelta = Dura.Range("$K$4").Value       ' questo è l'incremento (cella K4) da usare nel ricalcolo in cella F1
Dati.Range("A2:C50").ClearContents      'Azzera l'area dei dati
                               
''Application.ScreenUpdating = False    'INUTILI
''Application.CutCopyMode = False
                               
For I = 1 To 50                         'Fino a 50 periodi
    If Abs(Round(SFine - nextX, 6)) < Abs(Round(sDelta, 6)) Then
        Exit For
    End If
    nextX = Round(SInizio + (I - 1) * sDelta, 8)
    Dura.Range("F1") = nextX
    Dati.Cells(I + 1, 1) = I
    Dati.Cells(I + 1, 2) = nextX
    Dati.Cells(I + 1, 3) = Dura.Range("F8")
Next I
''Application.ScreenUpdating = True     'Inutili
''Application.CutCopyMode = True
Set Dura = Nothing                      'Precauzionali
Set Dati = Nothing
End Sub


Vedi se ti torna...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Ciclo for con copia

Postdi Gianca532011 » 12/02/20 13:53

Ciao, semplicemente perfetta !
Ora un attimo, per me , di comprensione su quello che hai fatto :
con Abs trovi il valore assoluto positivo, con Round arrontondi il risultato all n. esima cifra decimale , quello che non ho capito è perchè nel primo caso alla 6 decimale , e nel next alla 8 a. cifra ?
forse perchè nel primo caso era una semplice sottrazione , quindi tra due val. eguali, e nel secondo un prodotto ?

Codice: Seleziona tutto
If Abs(Round(SFine - nextX, 6)) < Abs(Round(sDelta, 6)) Then
        Exit For
    End If
    nextX = Round(SInizio + (I - 1) * sDelta, 8)


Comunque ancora grazie .
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Anthony47 » 13/02/20 00:02

Ah ha, ho usato due approssimazioni diverse per creare confusione...
Piu' seriamente ho voluto usare per i calcoli veri una precisione piu' alta (8 decimali) di quella usata per il confronto di "obiettivo raggiunto" (6 decimali), tenendo presente che con "obiettivo raggiunto" la differenza SFine - nextX e' pari a Zero+gli errori di approssimazione (quindi praticamente Zero)

Ma usando le stesse approssimazioni (almeno 5 decimali, max 14), a parte il discorso teorico fatto sopra, il risultato sarebbe stato praticamente lo stesso

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

Re: Ciclo for con copia

Postdi Gianca532011 » 16/02/20 21:27

Ciao, purtroppo sono stato un poco precipitoso nel senso che entrambe le macro hanno dei "buchi" , ho parzialmente risolto dopo indagine test " abbinando" entrambe le macro .
Allego cartella con i test e il mix delle due macro. Se hai voglia di ridere... prego accomodati. :lol: :) :D

http://www.filedropper.com/test_20362
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 324
Iscritto il: 27/05/11 10:18

Re: Ciclo for con copia

Postdi Anthony47 » 17/02/20 23:49

Come da tradizione, "se funziona e' ben fatto"

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


Torna a Applicazioni Office Windows


Topic correlati a "Ciclo for con copia":


Chi c’è in linea

Visitano il forum: Nessuno e 59 ospiti