Doppi cicli For .. Next  per eseguire ricerche, somme, numero di "presenti", ecc..

Un interessante esercizio, almeno lo spero, indirizzato all'intercettazione di dati,  presenti su righe di un elenco, e contemporaneamente, su colonne dello stesso elenco, per restituzione di somme dei dati trovati, oppure di numero di dati simili presenti. L'esercizio si presta ad una molteplicità di utilizzi, variando i termini della ricerca, e del tipo di restituzione del risultato, oppure lo schema di come effettuare la ricerca. Presento quindi due varianti:

  • una per la restituzione del numero di presenze di una variabile (una cella vuota, ma poteva essere su celle contenente il valore "pippo", oppure un numero specifico, o ancora su numeri superiori o inferiori ad un determinato valore, ecc.ecc.)

  • l'altra, per ottenere il totale dei valori presenti in ogni colonna.

In entrambi i casi, eseguiremo il controllo su un'intere colonne, iniziando dalla prima colonna richiamata dal ciclo,ottenendo il risultato in una cella della colonna adiacente, poi ci sposteremo sulla colonna successiva a quella su cui abbiamo ottenuto il totale, e così via per quante colonne vorremo. Se controlliamo la colonna A, otterremo il risultato nella colonna B, poi ci sposteremo a controllare la colonna C, otterremo il risultato nella colonna D, si sposteremo a controllare la colonna E, ecc. ecc.

Visto che useremo una colonna intera, di volta in volta, e non sapendo quanto potrà essere lungo, in termini di righe il nostro elenco, dovremo ricorrere ad un accorgimento. Poichè nell'esempio simulo la presenza di celle vuote, e non possiamo usare la funzione End, per determinare la lunghezza elenco, useremo un "interruttore" che "stoppi" il ciclo di ricerca sulla colonna, dandoci il risultato e passando al controllo della colonna a lato. Questo "interruttore" potremo inserirlo manualmente in qualsiasi cella si preveda come limite massimo di un elenco, o al limite nell'ultima cella della colona, che è la 65536. L'importante è inserirlo, e come "interruttore" potremo usare qualsiasi valore, numero, testo o data, possibilmente diverso dal tipo di dati che la nostra colonna conterrà. Ma vediamo il primo esempio:

  • Controllare e Contare il numero di celle vuote. Useremo il valore 2 come "interruttore". La routine prevede due cicli di ricerca (il primo per le colonne, con salto di una colonna (Step 2), con all'interno "annidato" un secondo ciclo che cercherà all'interno della colonna i dati voluti. Controlleremo le colonne dalla 1 alla 11 (cioè dalla A alla K) con il ciclo For X = 1 To 11.

Sub ContaVuote()

'dichiarazione di una variabile (CL = Cella) come Object
Dim CL As Object

'inizializzazione di un contatore cv (celle vuote)
cv = 0

'inizio ciclo per spostarsi tra le colonne, saltandone una
For X = 1 To 11 Step 2

'assegnazione alla variabile y dell'indirizzo di colonna X (la prima sarà quindi A:A)
y = ActiveSheet.Columns(X).Address

'inizio del ciclo di ricerca del valore o cella, cercati per ogni cella della colonna y
For Each CL In Range(y)

'in questo caso cerchiamo le celle vuote, se la cella sarà vuota, allora
If CL.Value = "" Then

'incrementiamo di una unità il contatore
cv = cv + 1

'se invece troviamo una cella col valore uguale a 2 ("interruttore"), allora
ElseIf CL.Value = 2 Then

'nella cella a destra (offset) e quindi colonna B, scriviamo il valore del contatore, che a 'questo punto corrisponde al numero di celle vuote trovate.
CL.Offset(0, 1).Value = cv

'riazzeriamo il contatore
cv = 0

'usciamo da questo ciclo
Exit For
End If
Next

'finito il ciclo sulla colonna appena controllata, continuiamo con Next il primo ciclo sulle 'colonne, che ci porterà alla colonna C, e poi a seguire per quante volte previsto (1 to 11 'Step 2)
Next
End Sub

Se anzichè celle vuote, avessimo voluto controllare quante volte una parola, ad esempio "Rossi", come in un elenco di Clienti, fosse presente, sarebbe bastato cambiare l'istruzione di ricerca, così:

If CL.Value = "Rossi" Then

e sarebbe stato riportato il numero di quante volte "Rossi" era presente, dall'inizio colonna fino all'interruttore.

Secondo esempio:

  • Controllare e Sommare i valori presenti nelle celle per ottenere un totale. Diversificando il criterio di ricerca del secondo ciclo interno, potremo ottenere  un totale personalizzato. In questo caso, operando su numeri, come "interruttore" sarà opportuno usare del testo. Nell'esempio mi limito a sommare tutti i valori presenti, colonna per colonna:

Sub SommaValori()

'vedi sopra
Dim CL As Object

'dichiarazione del tipo di variabile (totale) come Long. Se i numeri fossero con decimali, 'sarebbe necessario usare Double
Dim totale As Long

'inizzializzazione di totale con valore = zero
totale = 0

''inizio ciclo per spostarsi tra le colonne, saltandone una
For x = 1 To 11 Step 2

'assegnazione alla variabile y dell'indirizzo di colonna X (la prima sarà quindi A:A)
y = ActiveSheet.Columns(x).Address

'inizio del ciclo di ricerca del valore, cercati per ogni cella della colonna y
For Each CL In Range(y)

'qui iniziamo prima con la ricerca dell'interruttore, e useremo un nome (pippo), nel caso 'venga trovata la cella con questo testo, allora
If CL.Value = "pippo" Then

'inseriamo il totale che si sarà formato dagli incrementi di totale, nella cella a lato
CL.Offset(0, 1).Value = totale

'azzeriamo totale
totale = 0

'usciamo dal ciclo interno
Exit For
'se invece il valore di una cella sarà diverso da vuoto (quindi contiene un numero), allora
ElseIf CL.Value <> "" Then

'sommiamo questo valore a totale
totale = totale + CL.Value
End If

'passiamo alla cella successiva, stessa colonna
Next

'terminato il controllo fino alla cella interruttore, passiamo alla colonna successiva
Next
End Sub

 

Sarà possibile eseguire controlli su ogni colonna, eliminando il comando Step 2 all'inizio del primo ciclo, ed ottenere il risultato, sia nel primo esempio, sia nel secondo, facendo scrivere il risultato NON nella  colonna a lato, ma nella stessa colonna dove si effettua la ricerca, spostando con Offset la cella di destinazione: stessa colonna della ricerca, una riga sotto la cella dove stà l'interruttore, esempi:

CL.Offset(1, 0).Value = cv    (primo esempio)

CL.Offset(1, 0).Value = totale    (secondo esempio)

 

Buon lavoro.

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