View Full Version : [vba word] saltare il primo paragrafo "pieno"
john_revelator
03-07-2009, 22:52
Ciao a tutti. Non essendo per niente pratico del vba relativo a word mi trovo in difficoltà. Spiego rapidamente la mia necessità. Ho un documento che contiene una serie di paragrafi, comprese ovviamente delle righe vuote che potrebbero anche trovarsi all'inizio del documento. Io devo ciclare tutti i paragrafi "pieni" ad esclusione del primo.
Se non ci fossero paragrafi vuoti farei così
Sub pieni()
With ActiveDocument
For i = 2 To .Paragraphs.Count
testo = .Paragraphs(i)
MsgBox testo
Next i
End With
End Sub
e potrei agevolmente saltare il primo.
Purtroppo nel mio caso sono arrivato a scrivere queste poche righe (correggetemi se esiste un modo diverso per escludere i paragrafi vuoti), ma in questo contesto non so come saltare il primo paragrafo che in pratica è il titolo del documento e non mi occorre. Grazie per l'attenzione. :)
Sub cicla()
For Each p In ActiveDocument.Paragraphs
If p.Range.Characters.Count > 1 Then
MsgBox p
End If
Next p
End Sub
john_revelator
03-07-2009, 23:43
Ho risolto in questo modo. :)
Sub cicla()
Dim p As Paragraph
Dim i As Integer
For Each p In ActiveDocument.Paragraphs
If p.Range.Characters.Count > 1 Then
If i = 0 Then
ActiveDocument.Range.Move wdParagraph, 1
i = i + 1
Else
MsgBox p
End If
End If
Next p
End Sub
Visto che ci sono ne approfitto per fare comunque una domanda. :fagiano:
Come faccio a sapere l'indice di un paragrafo, cioè che un determinato paragrafo tanto per dire è il nono piuttosto che il decimo ?
Sub cicla()
Dim p As Paragraph
Dim i As Integer
Dim a As Integer
a = 1
For Each p In ActiveDocument.Paragraphs
If p.Range.Characters.Count > 1 Then
If i = 0 Then
' ActiveDocument.Range.Move wdParagraph, 1
i = i + 1
Else
testo = p
a = a + 1
MsgBox a & "-" & testo
End If
End If
Next p
End Sub
ho commentato la riga in mezzo perchè non so a cosa serve...ma mi pare nn serva a nulla :D
Ho risolto in questo modo. :)
Sub cicla()
Dim p As Paragraph
Dim i As Integer
For Each p In ActiveDocument.Paragraphs
If p.Range.Characters.Count > 1 Then
If i = 0 Then
ActiveDocument.Range.Move wdParagraph, 1
i = i + 1
Else
MsgBox p
End If
End If
Next p
End Sub
Visto che ci sono ne approfitto per fare comunque una domanda. :fagiano:
Come faccio a sapere l'indice di un paragrafo, cioè che un determinato paragrafo tanto per dire è il nono piuttosto che il decimo ?
Dim testoParag As String
Dim i As Integer
For i = 2 To ActiveDocument.Paragraphs.Count 'in base 1
testoParag = ActiveDocument.Paragraphs(i).Range.Text
If Len(Trim(testoParag)) > 1 Then
MsgBox testoParag
End If
Next i
Forse meglio e più compatto. ;)
Comunque dovresti fare qualcosa di più per controllare i paragrafi ( l'unico controllo che fai è sul conto caratteri, ma possono esserci molti casi di serie di 1 o più caratteri "invisibili", come spazi, vbcrlf, vbcr, ecc... ).
Per quanto riguarda la tua domanda, direi che i paragrafi sono in base 1, perciò ciclando con un For-i, i è il numero di paragrafo nello stesso ordine in cui si trova nel doc.
john_revelator
04-07-2009, 09:30
Buongiorno a tutti. :)
Per prima cosa grazie a entrambi per la solita disponibiltà.
@Marco: stavo provando il tuo codice però sorge un problema. Come accennavo ieri notte devo saltare il titolo del documento che non necessariamente è il primo paragrafo. Stavo facendo delle prove e ho notato che se il titolo si trova nella prima riga del documento il tutto fila liscio mentre se per esempio dò alcuni caratteri di invio a inizio file, il titolo mi viene visualizzato e non escluso. Immagino quindi che il ciclo for che parte da 2 non sia ciò che fa al mio caso. :fagiano:
@Marco: stavo provando il tuo codice però sorge un problema. Come accennavo ieri notte devo saltare il titolo del documento che non necessariamente è il primo paragrafo. Stavo facendo delle prove e ho notato che se il titolo si trova nella prima riga del documento il tutto fila liscio mentre se per esempio dò alcuni caratteri di invio a inizio file, il titolo mi viene visualizzato e non escluso. Immagino quindi che il ciclo for che parte da 2 non sia ciò che fa al mio caso. :fagiano:
Beh, in effetti più generico è il caso di utilizzo, più robusto dovrà essere il codice di controllo. Un bel passo avanti si può ottenere condizionando l'inserimento dei paragrafi ritenuti validi, in un array di appoggio.
Alla fine basterà scartare il primo elemento dell'array, che, con ogni probabilità sarà il paragrafo-titolo del doc. :
Dim testoParag As String
Dim arrayParagrafiOk() As String
Dim cntArray As Integer
cntArray = 0
Dim i As Integer
For i = 1 To ActiveDocument.Paragraphs.Count
testoParag = ActiveDocument.Paragraphs(i).Range.Text
If Len(Trim(testoParag)) > 1 Then
If cntArray = 0 Then
ReDim arrayParagrafiOk(0)
Else
ReDim Preserve arrayParagrafiOk(cntArray)
End If
arrayParagrafiOk(cntArray) = testoParag
cntArray = cntArray + 1
End If
Next i
'ciclo di test : i=0 è il paragrafo del titolo
For i = 1 To UBound(arrayParagrafiOk)
MsgBox arrayParagrafiOk(i)
Next i
;)
john_revelator
05-07-2009, 17:30
Grazie mille Marco. Sei sempre il mio forumista preferito. ;)
Solo una cosa non mi è chiara. Perchè hai definito arrayParagrafiOk() come stringa e non come variant?
Grazie mille Marco. Sei sempre il mio forumista preferito. ;)
Solo una cosa non mi è chiara. Perchè hai definito arrayParagrafiOk() come stringa e non come variant?
Perchè in questo caso non ci sono dubbi sul fatto che ogni elemento dell'array vada considerato come stringa.
Variant è il tipo più "comodo" in VB6 / VBA, ciò non vuol dire che si debba usare sempre, anzi, è anche il tipo più oneroso in quanto si forza VB ad una conversione implicita dietro le quinte, anche quando non serve. Meglio sempre usare il tipo dati più adeguato e ricorrere a Variant solo se strettamente necessario.
Ad esempio, in questo caso ( assegnazione diretta degli elementi di un array mediante la funzione "Array()" ) il tipo Variant è praticamente d'obbligo in VBA :
Dim a() As Variant
a = Array("stringa1", "stringa2", "stringa3")
Dim b() As Variant
b = Array(1, 2, 3)
mentre se cerco di fare :
Dim a() As String
a = Array("stringa1", "stringa2", "stringa3")
Dim b() As Integer
b = Array(1, 2, 3)
otterrei errore in entrambi i casi... ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.