|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1092
|
[vba word] saltare il primo paragrafo "pieno"
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ì Codice:
Sub pieni() With ActiveDocument For i = 2 To .Paragraphs.Count testo = .Paragraphs(i) MsgBox testo Next i End With End Sub 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. ![]() Codice:
Sub cicla() For Each p In ActiveDocument.Paragraphs If p.Range.Characters.Count > 1 Then MsgBox p End If Next p End Sub |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1092
|
Ho risolto in questo modo.
![]() Codice:
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 ![]() Come faccio a sapere l'indice di un paragrafo, cioè che un determinato paragrafo tanto per dire è il nono piuttosto che il decimo ? |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2001
Città: PV Milano Nord
Messaggi: 3851
|
Codice:
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 ![]()
__________________
"W la foca, che dio la benedoca"
poteva risolvere tutto la sinistra negli anni in cui ha governato e non l'ha fatto. O sono incapaci o sta bene anche a "loro" cosi. L'una o l'altra inutile scandalizzarsi.[plutus] |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Codice:
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 ![]() 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. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1092
|
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. ![]() |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Alla fine basterà scartare il primo elemento dell'array, che, con ogni probabilità sarà il paragrafo-titolo del doc. : Codice:
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 ![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1092
|
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? |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
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 : Codice:
Dim a() As Variant a = Array("stringa1", "stringa2", "stringa3") Dim b() As Variant b = Array(1, 2, 3) Codice:
Dim a() As String a = Array("stringa1", "stringa2", "stringa3") Dim b() As Integer b = Array(1, 2, 3) ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:48.