Ho una routine di importazione che mi apre Word, fa qualche sostituzione, mi
salva il file come txt e mi importa i dati in Access.
Funziona perfettamente.
Se però rieseguo la routine mi restituisce l'errore di run time '462'
"computer server remoto non esiste o non è raggiungibile.
Access riesce ad accedere a Word e ad aprire il file che gli ho indicato.
Tuttavia si blocca quando deve effettuare le sostituzioni
Il problema è simile a quello del post di Femto "Errore di run-time" ma, pur
seguendo i consigli di Carlo Costarella e di Sergio Mazza non ho risolto
Dopo WordApp.Quit
ho scritto
Set WordApp = Nothing
Set frase = Nothing
(oggetto RANGE che utiilizzo)
Set colFoundItems = Nothing
(oggetto Collection che utiilizzo)
ma non va lo stesso
Suggerimenti??
La gestione degli errori?
Ciao.
--
Sergio MAZZA
Cosa intendi?
Ho riletto la tua risposta ma non capisco come potrei gestire l'errore
Non vorrei dover dire all'utente guarda, se devi importare 10 files devi
aprire e chiudere access 10 volte...
Se per un qualsiasi caso va in errore la ruotine ti potrebbe rimanere aperta
una sessione a word che il riavvio dell'applicazione non azzera.
Quindi dovresti (se non l'hai fatto) inserire le istruzioni necessarie per
intercettare un eventuale errore:
Es.
Private Sub bttnEsporta()
On error goto bttnEsporta_err
Dim oggetti as qualcosa
istruzioni
istruzioni
istruzioni
Exit Sub
bttnEsporta_err:
Set WordApp = Nothing
Set frase = Nothing
Set colFoundItems = Nothing
End Sub
Questo intendevo. Controlla con ctrl-alt-canc se hai delle sessioni
"appese"...
Ciao.
--
Sergio MAZZA
AGGIORNAMENTO:
cercando su Google mi sono imbattuto in questo thread
http://groups.google.it/groups?hl=it&lr=&ie=UTF-8&threadm=8s75mu%24orj%241%4
0suite03.caspur.it&rnum=1&prev=/groups%3Fhl%3Dit%26lr%3D%26ie%3DUTF-8%26selm
%3D8s75mu%2524orj%25241%2540suite03.caspur.it
dal titolo Una volta si' e una no
dell'ottobre 2000 dove Sergio Mazza, (sempre lui) risolve il mio problema
dicendo di referenziare bene gli oggetti.
In sostanza mettere sempre (che palle) WordApp. davanti ad ogni comando Word
(logicamente se fai Dim WordApp as Word.Object)
Cosě facendo una delle mie procedure funziona.
Il problema č l'altra.
Devo far fare a Word una serie di sostituzioni e ho utilizzato un
"raccoglitore" trovato su microsoft.public.it.office.word
http://groups.google.it/groups?hl=it&lr=&ie=UTF-8&threadm=19yTa.5763%24Df5.1
38545%40news1.tin.it&rnum=1&prev=/groups%3Fhl%3Dit%26lr%3D%26ie%3DISO-8859-1
%26q%3Dottimizzazione%2Bmacro%26btnG%3DCerca%2Bcon%2BGoogle%26meta%3Dgroup%2
53Dmicrosoft.public.it.office.word
che qui vi posto:
Sub formPnd()
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
ImpostaParametri Testo:="Event", TestoNuovo:="Dati"
ImpostaParametri Testo:="Date", TestoNuovo:="Anno"
ImpostaParametri Testo:="White", TestoNuovo:="Bianco"
ImpostaParametri Testo:="Black", TestoNuovo:="Nero"
ImpostaParametri Testo:="Result", TestoNuovo:="Risultato"
ImpostaParametri Testo:="ECO", TestoNuovo:="Apertura"
End Sub
Sub ImpostaParametri(byVal Testo As String, byVal TestoNuovo As String)
With Selection.Find
.Text = Testo
.Replacement.Text = TestoNuovo
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Il problema č che non riesco a referenziare bene la routine ImpostaParametri
ogni volta si blocca su questo.
Cioč anche se scrivo:
WordApp.Selection.Find.Replacement.ClearFormatting
ImpostaParametri Testo:="Event", TestoNuovo:="Dati"
mi da errore.
Devo fare le sostituzioni una a una o posso sperare in una soluzione?
Grazie a tutti e soprattutto a Sergio "CreateObjet" MAzza
Ciao
MArco
Forse era meglio Dim WordApp as Word.Application
> Così facendo una delle mie procedure funziona.
>
> Il problema è l'altra.
> Il problema è che non riesco a referenziare bene la routine
ImpostaParametri
> ogni volta si blocca su questo.
> Cioè anche se scrivo:
>
> WordApp.Selection.Find.Replacement.ClearFormatting
> ImpostaParametri Testo:="Event", TestoNuovo:="Dati"
> mi da errore.
>
> Devo fare le sostituzioni una a una o posso sperare in una soluzione?
>
> Grazie a tutti e soprattutto a Sergio "CreateObjet" MAzza
> Ciao
> MArco
Aspe', facciamo un po' di ordine; queste sub sono scritte in VBA "lato word"
no? Quindi manca il riferimento all'oggetto principale, l'oggetto
application. Ma se utilizzi delle sub dovresti dichiarare l'oggetto
application come globale.
Dim WordApp as Word.Application
set WordApp = createobject("Word.Application")
Sub ImpostaParametri(byVal Testo As String, byVal TestoNuovo As String)
With WordApp.Selection.Find
etc. etc.
End sub
Sub formPnd()
WordApp.Selection.Find.ClearFormatting
etc. etc.
End Sub
TuaSub
ImpostaParametri "Event", "Dati"
Alla chiusura dell'applicazione devi testare se l'oggetto WordApp è ancora
vivo, se è così devi chiuderlo; e sopratutto inserire la gestione degli
errori nella TuaSub che preveda lo stesso test...
Spero di aver capito.
Ciao.
--
Sergio CreateObject("MAZZA")
> Forse era meglio Dim WordApp as Word.Application
Qual'è la differenza??
[Cut]
> Aspe', facciamo un po' di ordine; queste sub sono scritte in VBA "lato
word"
> no? Quindi manca il riferimento all'oggetto principale, l'oggetto
> application. Ma se utilizzi delle sub dovresti dichiarare l'oggetto
> application come globale.
> Dim WordApp as Word.Application
> set WordApp = createobject("Word.Application")
Fin qui ci siamo e così ho risolto i problemi dell'altra
> Sub ImpostaParametri(byVal Testo As String, byVal TestoNuovo As String)
> With WordApp.Selection.Find
> etc. etc.
> End sub
Se scrivo così mi ritorna un errore 91 variabile oggetto o variabile del
blocco With non impostata
> Sub formPnd()
> WordApp.Selection.Find.ClearFormatting
> etc. etc.
> End Sub
>
> TuaSub
> ImpostaParametri "Event", "Dati"
>
> Alla chiusura dell'applicazione devi testare se l'oggetto WordApp è ancora
> vivo, se è così devi chiuderlo; e sopratutto inserire la gestione degli
> errori nella TuaSub che preveda lo stesso test...
>
> Spero di aver capito.
>
> Ciao.
>
> --
> Sergio CreateObject("MAZZA")
Suggerimenti???
Ciao
Marco
Con questa dichiarazione hai le proprietà/metodi visibili quando premi il
"punto" dopo l'oggetto e MS la consiglia.
> Se scrivo così mi ritorna un errore 91 variabile oggetto o variabile del
> blocco With non impostata
Strano; con il debug ci passi nella dim globale?
> Suggerimenti???
Invia il codice se non risolvi;
> Ciao
> Marco
Ciao.
--
Sergio MAZZA
Ci arrivo e si blocca in questo punto:
Sub ImpostaParametri(ByVal Testo As String, ByVal TestoNuovo As String)
With Selection.Find
Invia il codice se non risolvi;
Ecco a Lei, Maestro
' Crea l'oggeto Word e apre il file specificato
On Error GoTo ErroreImportazione
Dim WordApp As Word.Application
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = False
WordApp.Documents.Open FileName:=PercorsoFile
WordApp.Selection.Find.ClearFormatting
WordApp.Selection.Find.Replacement.ClearFormatting
'Esegue le sostituzioni dei caratteri
ImpostaParametri Testo:=" ", TestoNuovo:=""
ImpostaParametri Testo:="_", TestoNuovo:=""
ImpostaParametri Testo:="~", TestoNuovo:="ņ"
ImpostaParametri Testo:="", TestoNuovo:="°"
ImpostaParametri Testo:="^", TestoNuovo:="ą"
ImpostaParametri Testo:="¯", TestoNuovo:="ł"
ImpostaParametri Testo:=ChrW(8220), TestoNuovo:="ģ"
ImpostaParametri Testo:="Z", TestoNuovo:="é"
ImpostaParametri Testo:="¸", TestoNuovo:="č"
ImpostaParametri Testo:="¤", TestoNuovo:="§"
Dim NomeRtf As String
Dim Percorso As String
Dim LunghezzaNome As Variant
Dim NomeSenzaEstensione As Long
Dim Nome As String
Dim NomeTXT As String
NomeRtf = WordApp.ActiveDocument.Name
Percorso = WordApp.ActiveDocument.Path
LunghezzaNome = Len(PercorsoFile)
NomeSenzaEstensione = (LunghezzaNome - 4)
Nome = Left(PercorsoFile, NomeSenzaEstensione)
NomeTXT = Nome & ".txt"
WordApp.ActiveDocument.SaveAs FileName:=NomeTXT, FileFormat:= _
wdFormatText, LockComments:=False, Password:="",
AddToRecentFiles:=False, _
WritePassword:="", ReadOnlyRecommended:=False,
EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False,
SaveAsAOCELetter:= _
False
WordApp.Quit
Set WordApp = Nothing
Sub ImpostaParametri(ByVal Testo As String, ByVal TestoNuovo As String)
' Routine che passa i parametri per la sostituzione dei caratteri alla
routine
' di sostituzione. Definiti TESTO e TESTONUOVO gli dice di trovare il primo
' e sostituirlo col secondo con la formattazione adeguata
With Selection.Find
.Text = Testo
.Replacement.Text = TestoNuovo
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Ciao
Marco
Prova con:
Public WordApp As Word.Application
...
e poi
Sub ImpostaParametri(ByVal Testo As String, ByVal TestoNuovo As String)
With WordApp.Selection.Find
Sub ImpostaParametri(ByVal Testo As String, ByVal TestoNuovo As String)
With WordApp.Selection.Find
che con
> Sub ImpostaParametri(ByVal Testo As String, ByVal TestoNuovo As String)
> With Selection.Find
Mi rivolgo al Mago di Arcella??? o č meglio il mago Forrest??
Provo ad eliminare la sub ImpostaParametri e a fare le sostituzioni a
"manella"
Ti tengo informato
Ciao
Marco
[cut]
> Aspe', facciamo un po' di ordine; queste sub sono scritte in VBA "lato
word"
> no? Quindi manca il riferimento all'oggetto principale, l'oggetto
> application. Ma se utilizzi delle sub dovresti dichiarare l'oggetto
> application come globale.
> Dim WordApp as Word.Application
> set WordApp = createobject("Word.Application")
>
> Sub ImpostaParametri(byVal Testo As String, byVal TestoNuovo As String)
> With WordApp.Selection.Find
> etc. etc.
> End sub
>
> Sub formPnd()
> WordApp.Selection.Find.ClearFormatting
> etc. etc.
> End Sub
>
> TuaSub
> ImpostaParametri "Event", "Dati"
>
> Alla chiusura dell'applicazione devi testare se l'oggetto WordApp è ancora
> vivo, se è così devi chiuderlo; e sopratutto inserire la gestione degli
> errori nella TuaSub che preveda lo stesso test...
>
> Spero di aver capito.
>
> Ciao.
>
> --
> Sergio CreateObject("MAZZA")
>
AGGIORNAMENTO:
Ho eliminato la procedura IMPOSTA PARAMETRI scrivendo " a manella " tutte le
sostituzioni e mi fa andare avanti.
Dopo aver fatto le sostituzioni devo trovare una certa stringa ad inizio
riga e devo eliminare tutta la riga perché non so quanti caratteri ci
possano essere
Per fare questo utilizzo questa procedura, sempre lato Word:
Dim colFoundItems As New Collection
Dim frase As Word.Range
Dim intFindCounter As Integer
With WordApp.Selection.Find
.ClearFormatting
.Forward = True
.Wrap = wdFindContinue
.Text = "§§§§§"
.MatchWildcards = True
.Execute
Do While WordApp.Selection.Find..Found =
True
intFindCounter = intFindCounter + 1
colFoundItems.Add Selection.Range,
CStr(intFindCounter)
WordApp.Selection.Find.Execute
Loop
End With
' Per ogni occorrenza seleziona la riga e la elimina
For Each frase In colFoundItems
If frase.Text = "§§§§§" Then
WordApp.Selection.HomeKey Unit:=wdStory
With WordApp.Selection.Find
.ClearFormatting
.Text = "§§§§§"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
WordApp.Selection.Find.Execute
WordApp.Selection.EndKey Unit:=wdLine,
Extend:=wdExtend
WordApp.Selection.Delete Unit:=wdCharacter,
Count:= End If
Next frase
L'altro punto in cui si blocca è questo:
...
colFoundItems.Add Selection.Range, CStr(intFindCounter)
Non so bene allora come fare riferimento all'oggetto Collection e chiuderlo
bene
PS. alla fine della procedura c'è
Set frase = Noting
Set colFoundItems = Nothing
PS. ho provato anche a definire
Public colFoundItems As New Collection
ma senza risultato
Ciao
Marco
Il problema era:
1) trovare una stringa ad inizio paragrafo
2) selezionare tutta la riga
3) eliminarla
piuttosto che quella spippolata precedente ho utilizzato questo codice:
With WordApp.ActiveDocument.Content.Find
.ClearFormatting
Do While .Execute(FindText:="STRINGA", Forward:=True, _
Format:=True) = True ' Trova la stringa
With .parent
.EndOf Unit:=wdParagraph, Extend:=wdExtend 'seleziona
tutta la riga
.Delete ' la cancella
.Move Unit:=wdParagraph, Count: =1 ' riprende il ciclo
End With
Loop
End With
Così sembra funzionare e non bloccarsi una volta sì ed una no.
Ciao a tutti e grazie ancora a Sergio
Marco
Urgh! Ma cosě tieni lontato pure i cristiani...
> Il problema era:
>
> 1) trovare una stringa ad inizio paragrafo
> 2) selezionare tutta la riga
> 3) eliminarla
>
> piuttosto che quella spippolata precedente ho utilizzato questo codice:
>
> With WordApp.ActiveDocument.Content.Find
> .ClearFormatting
> Do While .Execute(FindText:="STRINGA", Forward:=True, _
> Format:=True) = True ' Trova la stringa
> With .parent
> .EndOf Unit:=wdParagraph, Extend:=wdExtend 'seleziona
> tutta la riga
> .Delete ' la cancella
> .Move Unit:=wdParagraph, Count: =1 ' riprende il ciclo
> End With
> Loop
> End With
>
> Cosě sembra funzionare e non bloccarsi una volta sě ed una no.
>
> Ciao a tutti e grazie ancora a Sergio
> Marco
>
Nel messaggio precedente dicevi di essere in "lato Word" o sbaglio? Se č
cosě non hai bisogno di istanziare di nuovo "word.application"...
Ciao.
--
Sergio MAZZA