PDA

View Full Version : [vba excel] - estrarre prime righe successive a celle vuote


john_revelator
24-11-2009, 21:26
Ciao a tutti. Mi scuso per il titolo un pò criptico ma non ho trovato di meglio. Spero con un esempio pratico di rendere l'idea.


1 aaa
2 bbb
3
4 ccc
5
6
7 ddd
8 eee
9 ffff
10
11 ggg



In pratica ho una colonna con una serie di stringhe (i numeri da 1 a 11 corrispondono semplicemente ai numeri di riga) e dovrei estrarre aaa,ccc,ddd e ggg, cioè le prime righe successive agli spazi. Non mi aspetto la pappa pronta ma mi accontento di un semplice suggerimento circa la logica da seguire. Grazie per l'attenzione. :)

john_revelator
24-11-2009, 22:20
Ho fatto qualche piccolo progresso.


Option Explicit

Sub primi()
Dim ultimariga As Long, i As Long
ultimariga = Range("a65536").End(xlUp).Row
For i = 1 To ultimariga
Do While IsEmpty(Range("a" & i)) And Range("a" & i).Offset(1, 0) <> ""
MsgBox Range("a" & i).Offset(1, 0)
Exit Do
Loop
Next i
End Sub


Devo solo trovare il modo di includere nell'elenco anche il primo valore nel caso in cui la prima riga della colonna non sia vuota. :fagiano:

edit. Pare che adesso funzioni tutto a dovere


Option Explicit

Sub primi()
Dim ultimariga As Long, i As Long
ultimariga = Range("a65536").End(xlUp).Row
If Range("a1") <> "" Then
MsgBox Range("a1")
End If
For i = 1 To ultimariga
Do While IsEmpty(Range("a" & i)) And Range("a" & i).Offset(1, 0) <> ""
MsgBox Range("a" & i).Offset(1, 0)
Exit Do
Loop
Next i
End Sub


ma mi piacerebbe sapere se è possibile evitare quel rozzo if e usare una soluzione più "elegante".

MarcoGG
25-11-2009, 16:45
Più che altro credo si possa tranquillamente evitare un Do Loop nidificato nel For, e l'uso degli Offset. :)
Se è stabilito che [A1] sia sempre <> "", allora si può anche evitare l'If a cui ti riferisci :

Dim i As Long
Dim ultimariga As Long
ultimariga = Range("A65536").End(xlUp).Row
For i = 1 To ultimariga
On Error Resume Next
If Range("A" & (i - 1)).Text = "" And Range("A" & i).Text <> "" Then MsgBox Range("A" & i).Text
Next i

Se invece [A1] può anche essere = "", allora :

Dim i As Long
Dim ultimariga As Long
ultimariga = Range("A65536").End(xlUp).Row
If Range("A1").Text <> "" Then MsgBox Range("A1").Text
For i = 2 To ultimariga
If Range("A" & (i - 1)).Text = "" And Range("A" & i).Text <> "" Then MsgBox Range("A" & i).Text
Next i

In ogni caso è un po' più compatto. ;)

john_revelator
25-11-2009, 19:06
Ciao Marco. Grazie mille. E' perfetto e molto più semplice rispetto ai casini che la mia mente malata aveva partorito.
Sei sempre il mio eroe. Buona serata e grazie ancora. ;)

MarcoGG
25-11-2009, 19:18
Ciao Marco. Grazie mille. E' perfetto e molto più semplice rispetto ai casini che la mia mente malata aveva partorito.
Sei sempre il mio eroe. Buona serata e grazie ancora. ;)

:)