Operazioni su numeri con risultato nella colonna a lato.   (23/04/03)

E' proprio vero che le esigenze di ognuno di noi sono talmente varie che non è possibile definire degli esempi da standardizzare. Rimane tuttavia la possibilità di citare tutte le possibili applicazioni che si presentano di volta in volta, cercando di spiegare le necessità occorrenti ai vari casi, e relative soluzioni proposte, sperando così di poter fornire esempi assimilabili per altre esigenze.

Questa volta riporto ancora un esercizio risolto con il solito ciclo For Each ...Next, ma in cui ovviamente sono diversi, dagli altri esempi visti, le problematiche riscontrate.

Vediamo il problema : in una colonna in cui il numero di righe può variare, sono inseriti dei numeri. si richiede una macro che prenda il valore contenuto nella cella A1 e lo sottragga al valore contenuto nella cella A2,
il risultato deve essere collocato nella cella B1 e così di seguito con la cella A2 sottratta ad A3 ed il risultato in B2. Il tutto deve essere ripetuto fino a che la macro trova le celle della colonna A contenenti un valore.

Forse un immagine spiega meglio cosa si vorrebbe ottenere:

In B1 abbiamo la differenza di A1-A2 (10-20=-10), in B2 la differenza di A2-A3 (20-30=-10), in B3 la differenza di A3-A4 (30-50=-20), in B4 la differenza di A4-A5 (50-30=20), ecc. ecc.

La routine è semplice: visto che non sapremo quanto sarà lungo l'elenco nella colonna A, useremo la funzione End per trovare l'ultima cella che contiene dati, quindi eseguiremo un ciclo che per ogni cella della colonna A, otterrà il valore della cella stessa in quel momento identificata, lo sottrarrà al valore della cella successiva (identificata con Offset(1, 0)) e questo risultato lo inserirà nella cella a sinistra rispetto alla cella in quel momento attiva, identificandola con Offset(0, 1). Questa la routine:

Dim CL As Object
'sotto: reperisco tutta l'area che contiene dati nella
'colonna A: dalla prima cella: Cells(1, 1) all'ultima trovata
'occupata: Cells(1, 1).End(xlDown)

Set zona = Range(Cells(1, 1), Cells(1, 1).End(xlDown))
'poi inizio il ciclo di ricerca con: per ogni CL (cella)
'contenuta in "zona"

For Each CL In zona
'nella cella accanto a quella selezionata (CL) è la cella selezionata
'ma con CL.Offset(0, 1) identifico la cella, stessa riga (0) ed
'una colonna a destra) e in questa faccio fare la differenza tra la cella attiva e la cella sottostante identificata con CL.Offset(1, 0)

CL.Offset(0, 1) = CL.Value - CL.Offset(1, 0)
'con Next si passa alla cella successiva alla prima selezionata, fino alla fine delle celle 'presenti in "zona"
Next

End Sub

Un esercizio molto semplice ma che ci abitua al concetto di ciclo, suggerendoci anche come reperire gli estremi di un'elenco e a identificare le altre celle che ci interessano con Offset.

 

Buon lavoro.

prelevato sul sito http://ennius.interfree.it