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:

  • Identificare l'area su cui vogliamo effettuare il ricalcolo.

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