Ciclo con lettere alfabeto
Hai un problema con Excel? 
Ciclo con lettere alfabeto
di Mangusta (utente non iscritto) data: 05/04/2013 09:13:44
ciao a tutti! come posso creare un ciclo dove si scorrono le lettere dell'alfabeto tipo il seguente che non funziona?
For i = a To Z
Range(i & "1") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("i6:i1000")
Next i
sicuramente lo si può fare con un array o con un vettore ma conviene?
in pratica volevo migliorare la seguente porzione di codice
Sheets("Suc").Range("I5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("I6:I1000"))
Sheets("Suc").Range("J5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("J6:J1000"))
Sheets("Suc").Range("K5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("K6:K1000"))
Sheets("Suc").Range("L5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("L6:L1000"))
Sheets("Suc").Range("M5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("M6:M1000"))
Sheets("Suc").Range("N5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("N6:N1000"))
Sheets("Suc").Range("O5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("O6:O1000"))
Sheets("Suc").Range("P5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("P6:P1000"))
Sheets("Suc").Range("Q5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("Q6:Q1000"))
di Vecchio Frac data: 05/04/2013 11:34:57
Ma ragiona :)
Le lettere dell'alfabeto corrispondono nel tuo caso alle colonne, in Excel puoi riferirti alle colonne mediante un indice numerico e l'oggetto appropriato.
Sapendo che le colonne vanno da A a Z, cioè da 1 a 26, ti aiuta l'oggetto Cells:
For i = 1 to 26
cells(1, i) = worksheetfunction.sum([suc!i6:i1000])
Next
Naturalmente nel tuo caso dovrai costruire il parametro da dare a .Sum in modo più articolato (con Sheets e Range) visto che vuoi le somme legate alle diverse colonne del ciclo for, piuttosto che con la notazione quadra, ma il concetto è lo stesso.
p.s. "suc" ? :)
di isy (utente non iscritto) data: 05/04/2013 12:35:28
Ciao
Provate il metodo che allego, con poche righe di codice.
Il codice opera con un solo ciclo molto tecnico...
Sub Test_IQ()
With Range("I5:Q5")
.Formula = "=SUM(I6:I1000)"
'.Value = .Value
End With
End Sub
|
di isy (utente non iscritto) data: 05/04/2013 12:40:23
Dimenticavo il riferimento al foglio...
Sub Test_IQ()
With Sheets("Suc").Range("I5:Q5")
.Formula = "=SUM(I6:I1000)"
'.Value = .Value
End With
End Sub |
di Mangusta (utente non iscritto) data: 05/04/2013 12:59:42
cit:"Ma ragiona :)"!!!!
c'è poco da ridere!! dovrei piangere ormai me la cavicchio una cosa del genere non va fatta!
ok grazie provo il metodo di isy
VOGLIO ICONA CHE SBATTE TESTA!! (scusate il maiusc!!)
di Vecchio Frac data: 05/04/2013 14:07:44
La risposta di isy è per forza di cose valida :)
La differenza tra i due metodi è che con Worksheetfunction.Sum tu inserisci il risultato calcolato nella cella di destinazione, fissando quindi il valore definitivo una volta per tutte, mentre inserendo una formula nel range desiderato ottieni una soluzione dinamica.
Ci sono vantaggi e svantaggi: nel primo caso devi lanciare la macro ogni volta che cambia un valore da sommare per riottenere la somma corretta, nel secondo caso no (proprio perchè c'è un formula che effettua il ricalcolo), ma la formula viene ricalcolata ogni volta che si cambia qualcosa, e se le formule sono molte l'attesa può diventare lunga (certo, a meno che non specifichiamo Application.Volatile all'inizio della sub).
di Mangusta (utente non iscritto) data: 05/04/2013 19:54:03
vecchio frac ------ Application.Volatile all'inizio della sub???
di Vecchio Frac data: 05/04/2013 20:08:18
Santa polenta, che figura(ccia) ^_^
Naturalmente no, dovrebbe essere una Function altrimenti non ha effetto.
di Mangusta (utente non iscritto) data: 08/04/2013 10:03:25
Una curiosità ma:
scrivere cosi
Sheets("Suc").Range("I5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("I6:I1000"))
Sheets("Suc").Range("J5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("J6:J1000"))
Sheets("Suc").Range("K5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("K6:K1000"))
Sheets("Suc").Range("L5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("L6:L1000"))
Sheets("Suc").Range("M5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("M6:M1000"))
Sheets("Suc").Range("N5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("N6:N1000"))
Sheets("Suc").Range("O5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("O6:O1000"))
Sheets("Suc").Range("P5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("P6:P1000"))
Sheets("Suc").Range("Q5") = Application.WorksheetFunction.Sum(Sheets("Suc").Range("Q6:Q1000"))
o scrivere cosi
For i = 1 to 26
cells(1, i) = worksheetfunction.sum([suc!i6:i1000])
Next
IN Termini di prestazioni quale è il modo migliore?
di Vecchio Frac data: 08/04/2013 11:47:36
Bisognerebbe fare un piccolo bench, ma presumo sia questione di millisecondi (a favore del ciclo For).
In realtà la differenza è trascurabile, coi processori di oggi, e si tratta solo di compattare il codice anche per renderlo più leggibile.
di isy (utente non iscritto) data: 08/04/2013 12:09:12
Hi,
cit: Bisognerebbe fare un piccolo bench, ma presumo sia questione di millisecondi (a favore del ciclo For).
Non penso proprio VF, il ciclo che ho indicato è il più rapido che conosco e nel caso non servisse la formula è sufficente utilizzare: .Value = .Value come avevo indicato
Se si utilizza un ciclo excel inserisce un solo valore per ogni singola cella per ciclo mentre con il metodo With il foglio si aggiorna con un solo ciclo...
Da un suggerimento di un Guru...
di Vecchio Frac data: 08/04/2013 12:58:01
Grazie isy,
non metto in dubbio quello che dici e anzi sono d'accordo, e ho visto solo dopo che si consolida con .Value il valore al posto della formula; la mia risposta era solo in relazione al confronto di prestazioni tra una cascata di Worksheetfunction e un solo ciclo For.
Mangusta dovrà utilizzare (con profitto) il tuo suggerimento se ha a cuore le prestazioni.
di Mangusta (utente non iscritto) data: 08/04/2013 20:31:08
in effetti isy con il tuo frammento di codice hai ampliato le mie conoscenze! generalmente scrivevo una macro per riaggiornare i valori.
Usata con attenzione penso di usare il tuo frammento di codice
di Mangusta (utente non iscritto) data: 16/04/2013 15:14:43
questo non ha senso:
worksheetfunction.sum([suc!i6:i1000])
dovrebbe implementare la i del ciclo for anche nel range da sommare
For i = 1 to 26
cells(1, i) = worksheetfunction.sum([suc!i6:i1000])
Next
non riesco a scriverlo!!!
voglio che in a1 somma a2 : a10
b1 somma b2:b10
c1 somma c2:c10
capito?
di Vecchio Frac data: 16/04/2013 15:37:37
Isy ti ha già fornito una soluzione velocissima.
Sub Test_IQ()
With Sheets("Suc").Range("A1:E1")
.Formula = "=SUM(A2:A10)"
'.Value = .Value 'se vuoi consolidare i valori invece di scrivere la formula togli il commento iniziale
End With
End Sub |
di Vecchio Frac data: 16/04/2013 15:45:11
La stessa soluzione, ma con un ciclo For.
Sempre limitato al tuo esempio, A1:E1:
cit. " voglio che in a1 somma a2 : a10
b1 somma b2:b10
c1 somma c2:c10 "
Sub Test_IQ2()
Dim colonna As Integer
With Sheets("suc")
For colonna = 1 To 5
.Cells(1, colonna) = WorksheetFunction.Sum(.Range(.Cells(2, colonna), .Cells(10, colonna)))
Next
End With
End Sub |
di Mangusta (utente non iscritto) data: 16/04/2013 17:50:06
Funziona ok! ma non avevo capito ( riferito codice Isy) che sebbene
.Formula = "=SUM(A2:A10)"
riguardi solo a2:a10 faccia la somma anche delle altre colonne
ho visto il range Range("A1:E1")
(mi era sfuggito e per questo non ero riuscito a modificare il codice secondo le mie esigenze)
é un po' come trascinare la formula?
di Vecchio Frac data: 16/04/2013 19:03:03
Diciamo pure che è così ed è qui la potenza di questo metodo :)
Vuoi Approfondire?