avrei bisogno di una macro che cancellasse dei
paragrafi SE all'interno di due determinate
stringhe di caratteri fosse contenuta una
determinata stringa.
GRAZIE
>avrei bisogno di una macro che cancellasse dei
>paragrafi SE all'interno di due determinate
>stringhe di caratteri fosse contenuta una
>determinata stringa.
Io mi farei prestare delle espressioni regolari degne di questo nome
da VBScript:
Set regEx = CreateObject("VBScript.RegExp")
e poi scorrerei i paragrafi uno alla volta, cancellando quelli
incriminati; alla fine, una cosa cosě:
Public Sub CancellaParagrafiCosieCosa()
Dim regEx
Dim Testo
Dim Paragrafi As Paragraphs
Dim Par As Paragraph
Dim NextPar As Paragraph
Set Paragrafi = ActiveDocument.Paragraphs
Set Par = Paragrafi.First
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = ... 'Qui dobbiamo pensarci un attimo, magari
'in un orario un po' piů ragionevole
Do
Testo = Par.Range.Text
Set NextPar = Par.Next
If regEx.Test(Testo) Then
On Error Resume Next
Par.Range.Delete
On Error GoTo 0
End If
Set Par = NextPar
Loop While IsObjectValid(Par)
End Sub
Magari si fa anche in un modo piů diretto ed efficiente, ma i
"caratteri jolly" sono un po' troppo, per me.
Ciao.
> Set regEx = CreateObject("VBScript.RegExp")
> regEx.Pattern = ... 'Qui dobbiamo pensarci un attimo, magari
> 'in un orario un po' più ragionevole
Direi che si potrebbe cominciare a provare qualcosa del genere:
....
regEx.Pattern = "determinata_str1.*stringa.*determinata_str2"
....
Eventualmente da aggiustare per comprendere caretteri di fine riga
(posto che possano esserci all'interno del testo di un paragrafo).
Ciao.
>Carlo, nel messaggio <43b5a755...@news.tin.it>, scriveva:
>
>>avrei bisogno di una macro che cancellasse dei
>>paragrafi SE all'interno di due determinate
>>stringhe di caratteri fosse contenuta una
>>determinata stringa.
>
>Io mi farei prestare delle espressioni regolari degne di questo nome
>da VBScript:
>
> Set regEx = CreateObject("VBScript.RegExp")
>
Il problema è che non conosco VBScript !
Se hai voglia e pazienza di guidarmi passo passo
bene altrimenti ... pazienza.
Ho aperto il file (si tratta di un file html) ho
cliccato su Strumenti/Macro/MicrosoftScriptEditor
e . . . mi sono arreso !!!
>Il problema è che non conosco VBScript !
Non hai necessità di conoscerlo. Oppure sì, come vuoi, si può anche fare
tutto in VBScript; a me, però, parlando di macro di Word, è venuto naturale
pensare di lavorare in VBA di Word.
Però, per fare quello che vuoi, vengono comode delle espressioni regolari
che siano veramente "regolari", e di cui Word non dispone, per cui me le
andavo a prendere in VBScript. E tutto quello che serve sapere di VBScript
è nell'istruzione:
Set regEx = CreateObject("VBScript.RegExp")
che è un'istruzione di VBA di Word, così come il resto della macro
suggerita. Insomma, noi scriviamo in VBA di Word, e andiamo a prendere uno
strumento in VBScript, che però poi usiamo come fosse nostro.
Nessuna necessità di andare oltre nella conoscenza di VBScript, tranne
eventualmente un'infarinatura sulle espressioni regolari (che comunque non
sono specifiche di VBScript, e si trovano anche, e soprattutto, in altri
linguaggi).
>Ho aperto il file (si tratta di un file html) ho
Hmmm... questo non l'avevi detto. Per lavorare su formati complessi come
html, piuttosto che partire da zero con una semplice macro e sperare che
vada tutto bene, è meglio utilizzare strumenti appositi, che abbiano una
competenza completa su html.
Se quello che devi fare è molto semplice, e i documenti html su cui devi
lavorare sono più o meno sempre gli stessi, e si tratta di codice per uso
"casalingo", si può comunque anche provare ad andare avanti con la macro
(anche perché al momento non saprei bene quale strumento suggerirti, che si
possa integrare facilmente in una macro di Word).
>cliccato su Strumenti/Macro/MicrosoftScriptEditor
>e . . . mi sono arreso !!!
Bene, adesso invece guarda in Strumenti/Macro/Editor di Visual Basic e vedi
che succede.
Tanto per cominciare, puoi incollare la macro pubblicata, così com'è, in
una finestra di codice di Visual Basic (Visualizza -> Codice).
Eventualmente ci sarà da aggiustare il pattern, nell'istruzione:
....
regEx.Pattern = ...
....
Ciao.
>Tanto per cominciare, puoi incollare la macro pubblicata, cosě com'č, in
>una finestra di codice di Visual Basic (Visualizza -> Codice).
Incredibile !
Non so come ma *pare* che abbia funzionato !
> . . .
>Testo = Par.Range.Text
>Set NextPar = Par.Next
>If regEx.Test(Testo) Then
> On Error Resume Next
> Par.Range.Delete
> On Error GoTo 0
>End If
>Set Par = NextPar
> . . .
E se invece di voler cancellare un paragrafo
avessi voluto cancellare esattamente una stringa
cosa avrei dovuto scrivere?
C'č un altro problema!
I paragrafi da cercare e cancellare sono:
<!-- include file =
"../../arc_sys/ins_campi_lista.asp" -->
<tr>
<td class="tb1" with="270" align="left"
height="32" valign="top"><span
class="txtgblu">Abacus</span></td>
<td class="tb1" align="center" height="32"
valign="middle"><img
src="list_nomi%20a.asp_files/m.jpg"
align="middle"></td>
</tr>
e sono contenuti nel testo :
. . . . .
<!-- include file =
"../../arc_sys/ins_campi_lista.asp" -->
<tr>
<td
class="tb1" with="270" align="left" height="32"
valign="top"><span
class="txtgblu">Abaddon</span></td>
<td
class="tb1" align="center" height="32"
valign="middle"><img
src="list_nomi%20a.asp_files/m.jpg"
align="middle"></td>
</tr>
<!-- include
file = "../../arc_sys/ins_campi_lista.asp" -->
<tr>
<td
class="tb1" with="270" align="left" height="32"
valign="top"><span
class="txtgblu">Abagtha</span></td>
<td
class="tb1" align="center" height="32"
valign="middle"><img
src="list_nomi%20a.asp_files/f.jpg"
align="middle"></td>
</tr>
<!-- include
file = "../../arc_sys/ins_campi_lista.asp" -->
<tr>
<td
class="tb1" with="270" align="left" height="32"
valign="top"><span
class="txtgblu">Abaris</span></td>
<td
class="tb1" align="center" height="32"
valign="middle"><img
src="list_nomi%20a.asp_files/f.jpg"
align="middle"></td>
</tr>
. . . . . .
In pratica vorrei cancellare le righe della
tabella che contengono la stringa "m.jpg".
Dovrei ricorrere ai caratteri jolly.
Ho fatto una prova con la funzione Trova usando la
stringa:
(\<\!-- include file )*m.jpg*(\</tr\>)
che purtroppo non ha funzionato bene.
Gradirei un aiuto.
GRAZIE ancora
>E se invece di voler cancellare un paragrafo
>avessi voluto cancellare esattamente una stringa
>cosa avrei dovuto scrivere?
Dipende, evidentemente, dalla stringa che volessi avuto cancellare.
Il trucchetto delle regex a prestito però non so se ci è più di tanto
aiuto. Cioè, sarebbe anche possibile usare il metodo regEx.Replace, in
luogo di regEx.Test, e quindi riassegnare il testo ottenuto alla proprietà
Text del Range; l'impressione generale però è che si stia usando lo
strumento sbagliato per la cosa sbagliata nel modo sbagliato.
Piuttosto che cercare di convincere Word a processare del testo, forse è
meglio usare dall'inizio qualche strumento più adeguato. Difficile
consigliarti quale, si va da un semplice editor di testo ad un linguaggio
di programmazione a un sistema sgml (o xml), secondo quello che devi fare.
>In pratica vorrei cancellare le righe della
>tabella che contengono la stringa "m.jpg".
>Dovrei ricorrere ai caratteri jolly.
>Ho fatto una prova con la funzione Trova usando la
>stringa:
>
>(\<\!-- include file )*m.jpg*(\</tr\>)
>
>che purtroppo non ha funzionato bene.
Non sono sicuro di avere capito quello che vuoi fare. Se "\<\!-- include
file " e "\</tr\>" sono le due stringhe che racchiudono il testo cercato,
può darsi che vada meglio qualcosa come:
\<\!-- include file .*m\.jpg.*\</tr\>
Ti consiglio di leggere un po' di documentazione sulle espressioni
regolari. E vale ancora l'avvertimento che processare in questo modo dei
documenti html non è molto appropriato: come è accaduto in questo thread,
si parte da una cosa che sembra semplicissima, e pare che un'espressione di
sostituzione risolva tutto, poi le cose diventano rapidamente più complesse
e si finisce per costruire qualcosa che assomiglia molto ad un parser
completo di html.
Tanto vale partire fin dall'inizio con un parser completo già fatto (ce ne
sono in giro tanti, disponibili praticamente per qualunque linguaggio di
programmazione) e semplificarsi (a conti fatti) la vita (nonostante
l'investimento iniziale in tempo di apprendimento possa sembrare maggiore).
Ciao.