PDA

View Full Version : Word: creazione indice analitico automatico


sonicomorto
26-04-2009, 14:30
Qua si chiede l'impossibile, secondo me. Ho un testo di oltre 100 pagine dove le parole chiave sono tutte in grassetto, sottolineate e di colore blu.
Word (o qualche altro programma) è in grado di rilevare queste parole e riportarle in un indice analitico (cioè con il numero della pagina in cui è presente quella parola)?
Il fatto che queste parole siano formattate diversamente dovrebbe aiutare...
Fatemi sapere geni! Ciao ;)

sonicomorto
27-04-2009, 13:38
Ragazzi, non mi sono spiegato bene?
Fatemi sapere. Ciao

sonicomorto
28-05-2009, 09:12
Up raga. Nessun aiuto?

john_revelator
31-05-2009, 23:38
Ciao. Non conosco praticamente nulla di vba relativo a word.
Posso darti giusto uno spunto di partenza.


Sub parole()
For Each vword In ActiveDocument.Words
If vword.Underline = 1 And vword.Font.Bold = True And vword.Font.Color = wdColorBlue Then
MsgBox vword
End If
Next
End Sub


Registra la macro nel tuo file ed eseguila. Dovrebbe mostrarti a schermo ogni singola parola che corrisponde ai tre criteri. Domani se trovo il tempo provo a documentarmi un attimo e a integrare il resto. :)

sonicomorto
01-06-2009, 10:23
Ciao, cercando come inserire una macro ho trovato nella sezione "Riferimenti" la voce "Inserisci indice"! C'è un Segna voce ma non capisco come si usa. Se fosse possibile dirgli di segnare solo le parole con quei 3 attributi (bold, sottolineato, colore blue) sarei a posto!


ho provato la macro, però noto che mostra le parole non in fila come sono nel file, non vorrei ne perdesse qualcuna. piuttosto ora sovviene questa cosa: molte parole da mettere nell'indice sono nomi di persona quindi nel testo ho in grassetto cose tipo "Paolo Rossi" e la macro legge separatamente Paolo e poi Rossi. E' possibile dirgli di prendere il nome completo, senza spezzarlo?

Dai che ci siamo! Ti ringrazio tantissimo, spero riuscirai a darmi una mano per completare i llavoro!

john_revelator
01-06-2009, 11:12
Come ti ho scritto non sono molto ferrato col vba di word. Ti consiglio di contattare un moderatore e farti spostare in programmazione dove è più facile che possa ricevere aiuto. Appena posso provo a vedere se riesco ad aiutarti.

SaricBlake
02-06-2009, 08:35
Ciao, cercando come inserire una macro ho trovato nella sezione "Riferimenti" la voce "Inserisci indice"! C'è un Segna voce ma non capisco come si usa. Se fosse possibile dirgli di segnare solo le parole con quei 3 attributi (bold, sottolineato, colore blue) sarei a posto!


ho provato la macro, però noto che mostra le parole non in fila come sono nel file, non vorrei ne perdesse qualcuna. piuttosto ora sovviene questa cosa: molte parole da mettere nell'indice sono nomi di persona quindi nel testo ho in grassetto cose tipo "Paolo Rossi" e la macro legge separatamente Paolo e poi Rossi. E' possibile dirgli di prendere il nome completo, senza spezzarlo?

Dai che ci siamo! Ti ringrazio tantissimo, spero riuscirai a darmi una mano per completare i llavoro!


Se lo spazio ha comunque la "SOTTOLINEATURA", puoi indicare solo quella nella ricerca.
Il problema che io non ho risolto è definire quella voce come indice, perche inserivo manualmete le parentesi ed i codici, ma se la macro accetta il comando "segna come indice", allora dovresti aver risolto.

Kewell
02-06-2009, 09:19
Dietro richiesta di sonicmorto, spostato in programmazione :)

MarcoGG
02-06-2009, 11:20
Io l'ho risolto così :

ListBox1.Clear

Dim parola As Range
Dim strParola As String
Dim voceIndice As String
Dim voceIndiceTrovata As Boolean
Dim numeroPagina As String

For Each parola In ThisDocument.Words

If parola.Underline = wdUnderlineSingle And parola.Font.Bold = True And parola.Font.Color = wdColorBlue Then

strParola = CStr(parola)

'pulizia da marcatori di paragrafo
strParola = Replace(strParola, Chr(13), "")

If Trim(strParola) <> "" Then
If voceIndiceTrovata = False Then
parola.Select
numeroPagina = Selection.Information(wdActiveEndPageNumber)
End If
voceIndice = voceIndice & strParola
End If
voceIndiceTrovata = True

Else

If voceIndiceTrovata = True And Trim(voceIndice) <> "" Then
ListBox1.AddItem (voceIndice & " >> Pag." & numeroPagina)
End If
voceIndice = ""
voceIndiceTrovata = False

End If

Next parola

Nel mio caso la parola, o gruppo di parole, per essere interpretato come voce da inserire nell'indice, deve essere Blu ( il blu normale, corrispondente alla costante VBA wdColorBlue ), Bold, e a sottolineatura singola.

Uso una listbox ListBox1, dove alla fine mi trovo l'indice analitico completo.

L'unica cosa che manca ( il più è già stato fatto ), è sostituire la listbox con un array di stringhe, che servirà poi, alla fine della ricerca a scrivere su una nuova pagina in coda, l'indice analitico stesso... ;)

john_revelator
02-06-2009, 11:53
Ma sei un fenomeno anche di vba di word. Non ho più parole. ;)
Volevo chiederti se conosci qualche buon libro oppure qualche utile link relativo all'uso del vba in word. A differenza di excel e access non mi sembra che ci sia molta documentazione in merito e mi piacerebbe approfondire. Grazie. :)

MarcoGG
02-06-2009, 12:14
Ma sei un fenomeno anche di vba di word. Non ho più parole. ;)
Volevo chiederti se conosci qualche buon libro oppure qualche utile link relativo all'uso del vba in word. A differenza di excel e access non mi sembra che ci sia molta documentazione in merito e mi piacerebbe approfondire. Grazie. :)

Gli unici manuali cartacei che posso dire di aver letto ( un paio di manuali + dispense varie ) riguardano tutti Excel.
Per gli altri applicativi che fanno uso di VBA ( Access, Word, ma anche Corel ed altri ) diciamo che mi arrangio... ;)

In effetti, come dici tu, c'è molto materiale ( e giustamente ) per Excel, che è lo strumento più duttile, un po' meno per Access, ancora meno per Word, PowerPoint, ed altri.
Forse nella collana Mondadori, per la serie "Oltre Ogni Limite", ma non so quanto VBA, e a che livello di profondità venga trattato... E poi il prezzo... :(

Il web senz'altro ( link specifici su Word non ne conosco ), più un uso approfondito del visualizzatore oggetti del VBA Editor, possono fare la differenza. ;)

sonicomorto
05-06-2009, 08:53
Io l'ho risolto così :

ListBox1.Clear

Dim parola As Range
Dim strParola As String
Dim voceIndice As String
Dim voceIndiceTrovata As Boolean
Dim numeroPagina As String

For Each parola In ThisDocument.Words

If parola.Underline = wdUnderlineSingle And parola.Font.Bold = True And parola.Font.Color = wdColorBlue Then

strParola = CStr(parola)

'pulizia da marcatori di paragrafo
strParola = Replace(strParola, Chr(13), "")

If Trim(strParola) <> "" Then
If voceIndiceTrovata = False Then
parola.Select
numeroPagina = Selection.Information(wdActiveEndPageNumber)
End If
voceIndice = voceIndice & strParola
End If
voceIndiceTrovata = True

Else

If voceIndiceTrovata = True And Trim(voceIndice) <> "" Then
ListBox1.AddItem (voceIndice & " >> Pag." & numeroPagina)
End If
voceIndice = ""
voceIndiceTrovata = False

End If

Next parola

Nel mio caso la parola, o gruppo di parole, per essere interpretato come voce da inserire nell'indice, deve essere Blu ( il blu normale, corrispondente alla costante VBA wdColorBlue ), Bold, e a sottolineatura singola.

Uso una listbox ListBox1, dove alla fine mi trovo l'indice analitico completo.

L'unica cosa che manca ( il più è già stato fatto ), è sostituire la listbox con un array di stringhe, che servirà poi, alla fine della ricerca a scrivere su una nuova pagina in coda, l'indice analitico stesso... ;)

Wow!!!!! Incredibile, però stai sorvolando che io sono completamente ignorante di queste cose. Potresti dirmi la procedura per arrivare all'indice? Non so proprio nemmeno dove vada quel codice... Ci conto, grazie mille!!!!!!!

MarcoGG
05-06-2009, 09:26
Wow!!!!! Incredibile, però stai sorvolando che io sono completamente ignorante di queste cose. Potresti dirmi la procedura per arrivare all'indice? Non so proprio nemmeno dove vada quel codice... Ci conto, grazie mille!!!!!!!

Vabbeh, lo posto che faccio prima :D .
Nell'esempio ho tre pagine con testo e alcuni titoli. Apri il file Word, abilita le macro, visualizza la barra degli strumenti VB, entra nell'editor e vedi come sta messo il codice...

Intanto provalo e vedi se nella ListBox gialla sulla prima pagina l'indice creato è ok :

70952

;)

sonicomorto
05-06-2009, 15:46
Vabbeh, lo posto che faccio prima :D .
Nell'esempio ho tre pagine con testo e alcuni titoli. Apri il file Word, abilita le macro, visualizza la barra degli strumenti VB, entra nell'editor e vedi come sta messo il codice...

Intanto provalo e vedi se nella ListBox gialla sulla prima pagina l'indice creato è ok :

70952

;)

Ciao! Sei un genio! Sì lo script funziona. Però non riesco a "visualizzare la barra degli strumenti VB, entra nell'editor e vedi come sta messo il codice... "

Ma dopo come faccio a copiare il testo (ovvero l'indice proprio) visualizzato nella cella gialla? Perchè serve in formato testo per stamparlo i fondo al libretto.
Grazie!

MarcoGG
05-06-2009, 16:43
Ciao! Sei un genio! Sì lo script funziona. Però non riesco a "visualizzare la barra degli strumenti VB, entra nell'editor e vedi come sta messo il codice... "


;)
Menu > Visualizza / Barre degli strumenti / strumenti di controllo

Sulla barra degli strumenti di controllo VBA, Click sul
pulsante "Modalità Progettazione", poi sul pulsante "Visualizza Codice".


a dopo come faccio a copiare il testo (ovvero l'indice proprio) visualizzato nella cella gialla? Perchè serve in formato testo per stamparlo i fondo al libretto.
Grazie!


Bisogna, come avevo detto, modificare il codice, sostituendo la compilazione della ListBox con un array, e infine con l'array popolato, scrivere l'indice accodando una nuova pag. al doc... Vedo di completarlo io, appena ho un po' di tempo... ;)

sonicomorto
05-06-2009, 18:47
Ciao, eh, se riesci a completarlo se non è troppo lungo mi fai un favore, perchè io davvero non so dove metter mano!
Perdipiù io uso Word 2007 e non sono riuscito a Visualizzare il codice seguend la tua procedura (che probabilmente non hai il 2007) :(

MarcoGG
06-06-2009, 11:53
In Word 2007 la procedura è :

Pulsante Office ( pulsante rotondo in alto a sn ) :
> Opzioni di Word / Impostazioni generali / Mostra scheda sviluppo sulla barra multifunzione.

Scheda Sviluppo :
> Pulsante Visual Basic oppure ALT+F11.

A questo punto siamo nell'editor. Visualizza il nodo "ThisDocument" di Project(nomeProgetto) ed entraci, vedrai il mio codice contenuto.

Ora sostituisci tutto il vecchio codice con questo :

Private Function ArrayVuoto(A() As String) As Boolean

Dim i As Integer
On Error GoTo E
i = UBound(A)
ArrayVuoto = False
Exit Function
E:
ArrayVuoto = True

End Function

Private Sub cmd_creaindice_Click()

Dim arrayVociIndice() As String
Dim parola As Range
Dim strParola As String
Dim voceIndice As String
Dim voceIndiceTrovata As Boolean
Dim numeroPagina As String

Application.ScreenUpdating = False
For Each parola In ThisDocument.Words

If parola.Underline = wdUnderlineSingle And parola.Font.Bold = True And parola.Font.Color = wdColorBlue Then

strParola = CStr(parola)

'pulizia da marcatori di paragrafo
strParola = Replace(strParola, Chr(13), "")

If Trim(strParola) <> "" Then
If voceIndiceTrovata = False Then
parola.Select
numeroPagina = Selection.Information(wdActiveEndPageNumber)
End If
voceIndice = voceIndice & strParola
End If
voceIndiceTrovata = True

Else

If voceIndiceTrovata = True And Trim(voceIndice) <> "" Then
If ArrayVuoto(arrayVociIndice) = True Then
ReDim Preserve arrayVociIndice(0)
Else
ReDim Preserve arrayVociIndice(UBound(arrayVociIndice) + 1)
End If
arrayVociIndice(UBound(arrayVociIndice)) = voceIndice & " >> Pag." & numeroPagina
End If
voceIndice = ""
voceIndiceTrovata = False

End If

Next parola

'Cursore alla fine del documento
Selection.EndKey Unit:=wdStory
'Nuova pagina
Selection.InsertBreak wdPageBreak

'Scrittura indice
Selection.TypeText ("INDICE ANALITICO" & vbCrLf & vbCrLf)
Dim i As Integer
For i = 0 To UBound(arrayVociIndice)
Selection.TypeText (arrayVociIndice(i) & vbCrLf)
Next i
Application.ScreenUpdating = True

End Sub

E il gioco è fatto ! ;)
Adesso la ListBox non serve più, la puoi eliminare. Al suo posto c'è un Array, come già detto, e alla fine del processo l'Indice Analitico viene accodato alla fine del documento, su una nuova pagina. :cool:

MarcoGG
07-06-2009, 09:28
@sonicomorto : posto qui la soluzione finale, dato che si tratta di una piccola modifica al codice precedente.
Quando hai aperto il thread hai parlato di "testo-bold-blu-sottlineato", non hai però menzionato un dettaglio fondamentale : che quelli sono link !
Quindi Word modifica l'apparenza del testo, ma di fatto non ne cambia le proprietà. In un Link blu il colore testo è ancora su Automatico.
Perciò per gestire un testo-bold-blu-sottlineato, che sia link oppure no, modificare questa linea :

If parola.Underline = wdUnderlineSingle And parola.Font.Bold = True And parola.Font.Color = wdColorBlue Then

con QUESTA :

If (parola.Underline = wdUnderlineSingle And parola.Font.Bold = True And parola.Font.Color = wdColorBlue) Or (parola.Hyperlinks.Count) > 0 Then

e tutto andrà a posto. ;)

sonicomorto
07-06-2009, 20:33
@sonicomorto : posto qui la soluzione finale, dato che si tratta di una piccola modifica al codice precedente.
Quando hai aperto il thread hai parlato di "testo-bold-blu-sottlineato", non hai però menzionato un dettaglio fondamentale : che quelli sono link !
Quindi Word modifica l'apparenza del testo, ma di fatto non ne cambia le proprietà. In un Link blu il colore testo è ancora su Automatico.
Perciò per gestire un testo-bold-blu-sottlineato, che sia link oppure no, modificare questa linea :

If parola.Underline = wdUnderlineSingle And parola.Font.Bold = True And parola.Font.Color = wdColorBlue Then

con QUESTA :

If (parola.Underline = wdUnderlineSingle And parola.Font.Bold = True And parola.Font.Color = wdColorBlue) Or (parola.Hyperlinks.Count) > 0 Then

e tutto andrà a posto. ;)

Ma infatti avevo controllato i link ma sembrava che word avesse tenuto solo colore ecc. Evidentemente non era così!
Grazie infinite, funziona perfettamente!! Creato l'indice copio le voci in excel per ordinarle in ordine alfabetico!
Non avrei mai pensato che un lavoro del genere fosse possibile! Sei un genio!
Complimenti! :)