Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA: contare quante celle piene ci sono in un intervallo delimitato da 2 celle vuote

1,308 views
Skip to first unread message

draleo

unread,
Sep 17, 2016, 6:31:16 AM9/17/16
to
Da una settimana che mi sono incartato su questa che sembrava una banalità, ma che non riesco a risolvere da solo.
da A1 ad A20 vi sono celle piene intramezzate da alcune vuote (senza un ordine preciso ,ma le celle vuote non sono mai consecutive)
Diciamo che A3, A10 e A14 sono vuote. Tutte le altre celle sono piene (contengono dei valori)
In A3 dovrei mettere il num di celle piene comprese tra A3 e A10 (cioè 6)
In A10 dovrei mettere il num di celle piene comprese tra A10 e A14 (cioè 3)
In A14 dovrei mettere il num di celle piene comprese tra A14 e l'ultima cella A20 (cioè 6)
draleo

Norman Jones

unread,
Sep 17, 2016, 8:24:50 AM9/17/16
to
Ciao Draleo,
• Crea un nome definito BigNum che si riferisca alla formula:
=9.99999999999999E+307
• Nella cella C 1 immetti la formula: =CONFRONTA(BigNum;A:A)
• Nella cella B1, immetti la formula matriciale (confermata con
Shift + Ctrl + Invio):

{=SE(NUM(A1);"";CONTA.NUMERI(A2:INDICE(A2:INDICE(A:A;$C$1);CERCA(BigNum;SCEGLI({1\2};$C$1-RIF.RIGA(B1);CONFRONTA(VERO;A2:INDICE(A:A;$C$1)="";0)-1)))))}

• Tracina la formula in basso quanto necessario

Potresti scaricare il mio file di prova Draleo20160917.xlsx a:
https://www.dropbox.com/s/78mxzx82d11x6mu/Draleo20160917.xlsx?dl=0




===
Regards,
Norman

Norman Jones

unread,
Sep 17, 2016, 8:48:35 AM9/17/16
to
Ciao Draleo,

> {=SE(NUM(A1);"";CONTA.NUMERI(A2:INDICE(A2:INDICE(A:A;$C$1);CERCA(BigNum;SCEGLI({1\2};$C$1-RIF.RIGA(B1);CONFRONTA(VERO;A2:INDICE(A:A;$C$1)="";0)-1)))))}

A scanso di equivoci, la formula dovrebbe essere:

=SE(NUM(A1);"";CONTA.NUMERI(A2:INDICE(A2:INDICE(A:A;$C$1);CERCA(BigNum;SCEGLI({1\2};$C$1-RIF.RIGA(B1);CONFRONTA(VERO;A2:INDICE(A:A;$C$1)="";0)-1)))))

Le parentesi graffe vengono inseriti automaticamente con l'inserimento
matriciale (Shift + Ctrl + Invio) della formula.



===
Regards,
Norman

draleo

unread,
Sep 18, 2016, 3:50:58 AM9/18/16
to
Per Funzionare ,funziona molto bene. Peccato che non io capisca niente di formule. L'ho applicata, ma per esempio: faccio fatica a capire cosa significhi
BigNum=9.99999999999999E+307
comunque ,provando e riprovando, ho risolto anche così
ti ringrazio ancora
draleo
-----------------------------------------------------
Sub Prova()
Dim ur As Long, l As Long, nr As Long
With ActiveSheet
nr = .Range("A65536").End(xlUp).Row
For l = nr To 1 Step -1
If IsEmpty(.Cells(l, 1)) Then
.Cells(l, 1) = nr - l
nr = l - 1
End If
Next
End With

End Sub

Norman Jones

unread,
Sep 18, 2016, 7:20:30 AM9/18/16
to
On 18/09/2016 8.50, draleo wrote:

> Per Funzionare ,funziona molto bene. Peccato che non io capisca niente di
> formule. L'ho applicata, ma per esempio: faccio fatica a capire cosa significhi
> BigNum=9.99999999999999E+307

Il valore 9.99999999999999E+307 rappresenta il valore è il più grande
valore positivo che può essere riconosciuto da Excel. Un nome definito è
usato semplicemente per convenienza e perché il numero è ingombrante da
scrivere e da ricordare.

Per una spiegazione dettagliata dell'utilizzo di questo numero per
trovare il valore numerico più grande in un intervallo, vedi la risposta
di Aladin Akyurek (post # 6) nel seguente thread:
http://www.pcreview.co.uk/threads/re-last-value-in-column.1741609/

> comunque ,provando e riprovando, ho risolto anche così
> ti ringrazio ancora
> draleo
> -----------------------------------------------------
> Sub Prova()
> Dim ur As Long, l As Long, nr As Long
> With ActiveSheet
> nr = .Range("A65536").End(xlUp).Row
> For l = nr To 1 Step -1
> If IsEmpty(.Cells(l, 1)) Then
> .Cells(l, 1) = nr - l
> nr = l - 1
> End If
> Next
> End With
>
> End Sub

Bravo!
Se avessi proposto una soluzione di VBA, sarebbe stato del
genere:'=========>>
Option Explicit

'--------->>
Public Sub Tester()
Dim WB As Workbook
Dim SH As Worksheet
Dim srcRng As Range, destRng As Range
Dim arrIn As Variant
Dim LRow As Long
Dim i As Long, iCtr As Long

Const sFoglio As String = "Foglio1" '<<=== Modifica
Const sColonna As String = "A" '<<=== Modifica
Const iPrimaRiga As Long = "1" '<<=== Modifica

Set WB = ThisWorkbook
Set SH = WB.Sheets(sFoglio)

With SH
LRow = .Range(sColonna & .Rows.Count).End(xlUp).Row
Set srcRng = .Cells(iPrimaRiga, sColonna) _
.Resize(LRow - iPrimaRiga + 1)
Set destRng = srcRng
'\\ oppure (diciamo): Set destrng=srcrng.offset(0,1)
End With

arrIn = srcRng.Formula
For i = UBound(arrIn, 1) To LBound(arrIn, 1) Step -1
If Not arrIn(i, 1) = vbNullString Then
iCtr = iCtr + 1
Else
arrIn(i, 1) = iCtr
If Not arrIn(i - 1, 1) = vbNullString Then
iCtr = 0
End If
End If
Next i
With Application
.ScreenUpdating = False
destRng.Value = arrIn
.ScreenUpdating = True
End With
End Sub
'<<=========

Questa routine è più lunga e più verbosa della tua, ma credo che sia più
flessibile e più efficiente. Detto questo, a meno che l'intervallo di
interesse fosse grande, dubito che molta differenza sarebbe percepibile
per l'utente.




===
Regards,
Norman
0 new messages