Eseguire calcoli su valori esistenti in celle del
foglio di lavoro.
(21/05/03)
Uno dei vantaggi
del vba è quello di poter usare delle istruzioni per modificare,
ricalcolandolo, un valore presente in una cella ottenendo nella cella stessa
il nuovo valore. Classico esempio quello di volere applicare un aumento ai
prezzi di un listino, ma potrebbe trattarsi di altre necessità, come voler
dividere per un certo valore, i valori contenuti in una tabella, e presenti
in una o più colonne. L'importante è NON applicare le modifiche a celle
contenenti formule, pena la perdita delle stesse, e comunque non avrebbe
senso in quanto il valore ottenuto in una cella per effetto di una formula
ivi residente, è sempre influenzato dai valori delle celle richiamate nella
formula stessa: basta cambiare quei valori.
Vediamo come procedere, seguendo l'esempio dell'aumento di un listino:
L'area possiamo
definirla in vari modi:
-
Usare i
riferimenti precisi dell'area : Set zona =
ActiveSheet.Range("A1:A500")
-
Usare il
riferimento a tutta una colonna: Set zona =
ActiveSheet.Range("A:A")
-
Usare il
riferimento alla cella iniziale della Colonna (A nell'esempio) e alla cella
finale (con End) dell'area : Set zona = Range(Cells(1,
1), Cells.End(xlDown))
-
Usare il
riferimento a tutta l'area che contiene dati sfruttando la proprietà
UsedRange del foglio di lavoro :
Set zona = ActiveSheet.UsedRange
Ognuno sceglierà
la forma più appropriata, tenendo presente che scegliere il
riferimento a tutta la colonna comporta il fatto che verranno calcolate
tutte le celle della colonna, compreso le celle vuote, ottenendo in questo
caso un rallentamento (sono 65536 righe) e lo zero come risultato in quelle
vuote. In questo caso basterà usare un istruzione ("Se la cella è vuota
passa alla successiva.."). Vediamo gli esempi secondo l'ordine su esposto:
Sub multi1()
Dim cella As Range
Set zona = ActiveSheet.Range("A1:A500")
For Each cella In zona
cella = cella + ((cella * 10) / 100)
Next
End Sub |
Sub multi2()
Dim cella As Range
Set zona = ActiveSheet.Range("A:A")
For Each cella In zona
cella = cella + ((cella * 10) / 100)
Next
End Sub |
ora l'esempio
sopra ma con l'esclusione delle celle vuote:
Sub multi2i()
Dim cella As Range
Set zona = ActiveSheet.Range("A:A")
For Each cella In zona
If cella.Value = "" Then GoTo 10
cella = cella + ((cella * 10) / 100)
10:
Next
End Sub |
Sub multi3()
Dim cella As Range
Set zona = Range(Cells(1, 1), Cells.End(xlDown))
For Each cella In zona
cella = cella + ((cella * 10) / 100)
Next
End Sub |
Sub multi4()
Dim cella As Range
Set zona = ActiveSheet.UsedRange
For Each cella In zona
cella = cella + ((cella * 10) / 100)
Next
End Sub |
Come vedete, le
istruzioni cambiano solo nel metodo di identificazione dell'area. Se invece
si volesse modificare il tipo di calcolo da eseguire, basterà modificare
l'istruzione della riga dove si esegue il calcolo sul valore della "cella".
Alcuni esempi:
cella = cella - ((cella * 10) / 100) -
per sottrarre una percentuale (10 nell'esempio)
cella = cella / 100 - per
dividere per 100 (o un'altro valore) il valore della cella
cella = cella + ((cella * Range("H1").Value) / 100)
- per calcolare un incremento in percentuale con il valore
rappresentato da ciò che inseriremo in una cella esterna (H1). Potremo
quindi rendere variabile la percentuale.
cella = cella / Range("H1").Value -
per dividere il valore di una cella per un valore rappresentato da ciò che
inseriremo in una cella esterna (H1). Potremo quindi rendere variabile il
divisore.
I tipi di calcoli
applicabili sono lasciati al libero arbitrio, è inutile esemplificarli
tutti.
Buon lavoro.
prelevato sul sito http://ennius.interfree.it |