Newsgroup: it.comp.appl.access
Titolo: errore di run time 5273

Ho questa function che mi permette di dìselezionare più file
attraveso una finestra windows
Una volta selezionati dovrei stampare i file ma il codice mi da errore
di run time 5273 qualcuno puo aiutarmi
questo è il codice e il punto dove mi da errore
ption Compare Database
Public oWord As Word.Application
Public oDoc As Word.Document
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
'questa è la struct che vuole la API
Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
Const ANF_PERMETTESELEZIONEMULTIPLA = &H200
Const ANF_CREAPROMPT = &H2000
Const ANF_EXPLORER = &H80000
Const ANF_ENABLETEMPLATE = &H40
Const ANF_ENABLEHOOK = &H20
Const ANF_FILEDEVEESISTERE = &H1000
Const ANF_NASCONDESOLALETTURA = &H4
Const ANF_NONCAMBIACARTELLA = &H8
Const ANF_COLLEGAMENTIRIFERIMENTONODI = &H100000
Const ANF_NESSUNPULSANTEDIRETE = &H20000
Const ANF_NONRESTITUISCESOLALETTURA = &H8000
Const ANF_NESSUNACONVALIDA = &H100
Const ANF_SOVRASCRIVEPROMPT = &H2
Const ANF_PERCORSODEVEESISTERE = &H800
Const ANF_SOLALETTURA = &H1
Const ANF_MOSTRAGUIDA = &H10
Const ANF_NODEREFERENCELINKS = &H100000
Sub GetFileName()
  Dim IMPFILE, IMPORTFILE As String
    Dim OpenFile As OPENFILENAME
    Dim lReturn As Long
    Dim sFilter As String
    OpenFile.lStructSize = Len(OpenFile)
    OpenFile.hwndOwner = 0  ' Usa Me.hwnd se il codice fa parte della
form
    OpenFile.hInstance = 0
    sFilter = "All Files (*.*)" & Chr(0) & "*.*" & Chr(0)
    OpenFile.lpstrFilter = sFilter
    OpenFile.nFilterIndex = 0
    OpenFile.lpstrFile = String(4097, 0)
    OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1
    OpenFile.lpstrFileTitle = OpenFile.lpstrFile
    OpenFile.nMaxFileTitle = OpenFile.nMaxFile
    OpenFile.lpstrInitialDir = "c:\*.DOC"
    OpenFile.lpstrTitle = "Select file"
    OpenFile.flags = ANF_EXPLORER Or ANF_PERMETTESELEZIONEMULTIPLA
    lReturn = GetOpenFileName(OpenFile)
    If lReturn = 0 Then
    cmdlg_file = ""
Else
    cmdlg_file = Left(OpenFile.lpstrFile, InStr(OpenFile.lpstrFile,
Chr$(0) & Chr(0)) - 1)
End If
Dim strArray() As String
   Dim f As Integer
   Dim strTest As String
     Dim nomefile As Variant
   strTest = cmdlg_file
   strArray = Split(strTest, Chr$(0))
   For f = 0 To UBound(strArray)
    nomefile = strArray(0) & "\" & strArray(f)
    Set oWord = New Word.Application
    Set oDoc =
oWord.Documents.Open(nomefile)----------------------ERRORE run time
5273 percorso non trovato
oWord.PrintOut FileName:=nomefile(f)
Next f
  End Sub

 ption Compare Database
Option Compare Database
Magari se ci aggiungi anche
Option explicit
puo' essere utile
Copiato e incollato ehhhh?
-- 
ac
y-1=x

budem...@libero.it
 ha scritto:

Ma non si fà una cosa del genere.....!!!
Non usare l'automazione per lanciare la stampa a meno di non rendere
SINCRONO il sistema, in quel modo tenti di aprire un sacco di istanze
di Word per nulla...!!!!
Se vuoi usare l'automazione devi attendere la chiusura della stampa, e
riaprtire.
altrimenti la soluzione migliore è quella di sfruttare ShellExecute,
visto che hai copiato ed incollato quello di prima incolla anche
questo:
For f = 0 To UBound(strArray)
     nomefile = strArray(0) & "\" & strArray(f)
     Call PrintBatch(NomeFile, "", SW_HIDE, True)
Next f
Accertati cosa esce da NomeFile con il Debug in modo da capire se la
costruzione dell'indirizzo è corretta....!
Quì trovi la funzione per lanciare la stampa Batch di tutti i file...!
Metti tutto in un Modulo poi passa alla funzione il nome file:
Private Type SHELLEXECUTEINFO
   cbSize As Long
   fMask As Long
      '0x00000001 (SEE_MASK_CLASSNAME) lpClass
      '0x00000003 (SEE_MASK_CLASSKEY) hkeyClass
      '0x00000004 (SEE_MASK_IDLIST) lpIDList
      '0x0000000c (SEE_MASK_INVOKEIDLIST)
      '0x00000010 (SEE_MASK_ICON) hIcon
      '0x00000020 (SEE_MASK_HOTKEY) dwHotKey
      '0x00000040 (SEE_MASK_NOCLOSEPROCESS)
      '0x00000080 (SEE_MASK_CONNECTNETDRV) lpName
      '0x00000100 (SEE_MASK_FLAG_DDEWAIT) DDE
      '0x00000200 (SEE_MASK_DOENVSUBST) lpDirectory
      '0x00000400 (SEE_MASK_FLAG_NO_UI)
      '0x00004000 (SEE_MASK_UNICODE) Unicode
      '0x00008000 (SEE_MASK_NO_CONSOLE)
      '0x00200000 (SEE_MASK_HMONITOR)
      '0x04000000 (SEE_MASK_FLAG_LOG_USAGE)
   hwnd As Long
   lpVerb As String
   lpFile As String
   lpParameters As String
   lpDirectory As String
   nShow As Long
   hInstApp As Long
   lpIDList As Long
   lpClass As String
   hkeyClass As Long
   dwHotKey As Long
   hIcon As Long
   hProcess As Long
End Type
Private Const SEE_MASK_NOCLOSEPROCESS = &H40
Private Const SEE_MASK_NO_CONSOLE = &H8000
Private Const SEE_MASK_CLASSKEY = &H3
Private Const SEE_MASK_IDLIST = &H4
Private Const SEE_MASK_CLASSNAME = &H1
Private Const SEE_MASK_INVOKEIDLIST = &HC
Private Const SEE_MASK_FLAG_DDEWAIT = &H100
Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias
"ShellExecuteExA" (lpExecInfo As SHELLEXECUTEINFO) As Long
Public Enum LauncherDisplayMode
  SW_HIDE = 0
  SW_SHOWNORMAL = 1
  SW_SHOWMINIMIZED = 2
  SW_SHOWMAXIMIZED = 3
  SW_SHOW = 5
  SW_MINIMIZE = 6
  SW_SHOWMINNOACTIVE = 7
  SW_SHOWNA = 8
  SW_RESTORE = 9
  SW_SHOWDEFAULT = 10
End Enum
Public Enum LauncherCommand
  LC_OPEN = 0
  LC_EDIT = 1
  LC_PRINT = 2
  LC_PROPERTIES = 3
End Enum
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal
hHandle As Long, ByVal _
   dwMilliseconds As Long) As Long
Const INFINITE = &HFFFF
Const WAIT_TIMEOUT = &H102
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
Public Function PrintBatch(FileName As String, FileOptions As String,
DisplayMode As LauncherDisplayMode, Optional WaitEndOfProces As Boolean
= False) As Boolean
'
'-- lancia un'applicazione e restituisce un booleano che indica la
'   riuscita dell'operazione
--
'-- in caso di errore visualizza il relativo messaggio se ShowError è
True --
  Dim sei As SHELLEXECUTEINFO
  Dim RetVal As Long
  With sei
    .cbSize = Len(sei)
    .fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_FLAG_DDEWAIT Or
SEE_MASK_NO_CONSOLE
    .hwnd = GetDesktopWindow()
    .lpVerb = "PRINT"
    .lpFile = FileName
    .lpParameters = FileOptions
    .lpDirectory = ""
    .nShow = DisplayMode
  End With
  ' Open the file using its associated program.
  RetVal = ShellExecuteEx(sei)
  PrintBatch = (RetVal <> 0)
  If RetVal = 0 Then
    ' The function failed, so report the error.  Err.LastDllError
    ' could also be used instead, if you wish.
    Else
    If WaitEndOfProces Then
      '--- attesa ---
      ' Wait for the opened process to close before continuing. Instead
      ' of waiting once for a time of INFINITE, this example repeatedly
checks to see if the
      ' is still open.  This allows the DoEvents VB function to be
called, preventing
      ' our program from appearing to lock up while it waits.
      Do
        DoEvents
        RetVal = WaitForSingleObject(sei.hProcess, 0)
      Loop While RetVal = WAIT_TIMEOUT
      Call CloseHandle(sei.hProcess)
    End If 
  End If 
End Function 
@Alex

Così mi funziona
Dim strArray() As String
   Dim f As Integer
   Dim strTest As String
     Dim nomefile As Variant
   strTest = cmdlg_file
   strArray = Split(strTest, Chr$(0))
   For f = 1 To UBound(strArray)
Debug.Print Trim(strArray(f))
    nomefile = strArray(0) & "\" & strArray(f)
    Set oWord = New Word.Application
    Set oDoc = oWord.Documents.Open(nomefile)
oDoc.PrintOut
DoEvents
    oDoc.Close (False)
    Set oDoc = Nothing
Next f
msgbox ("Fine Stampa")
  End Sub
Ciao

 Ciao
@Alex

Alessandro Baraldi ha scritto:

Mi serve per uso personale devo  velocizzare la stampa di molte lettere
doc, avevo scaricato un progarmmino da internet bacthdocprint ma tra la
stampa e l'altra attendeva troppo tempo speriamo bene
grazie ancora

 ha scritto nel messaggio 
news:1166444134.3...@79g2000cws.googlegroups.com...
Mi serve per uso personale devo  velocizzare la stampa di molte lettere
doc, avevo scaricato un progarmmino da internet bacthdocprint ma tra la
stampa e l'altra attendeva troppo tempo speriamo bene
grazie ancora
[risposta]
Se devi stampare una serie di documenti della stessa "natura" (es. documenti 
word); allora ti conviene dare ascolto ad Alessandro.
Il tuo codice č molto instabile e rischi di non velocizzare nulla ma, anzi, 
ti ritroverai con molte istanze di word invisibili piů i relativi documenti; 
rischiando di rovinarli se il pc si blocca per mancanza di risorse. Senza 
parlare poi che ingolfando il pc rallenterai sempre di piů la stampa di 
qualsiasi documento.
Fai sicuramente prima se:
1 - Apri una istanza di word
2 - Apri il documento da stampare
3 - Stampi il documento
4 - Chiudi il documento
5 - (per ogni documento ripeti il ciclo dal punto 2)
poi devi gestire eventuali errori e distruggere (set nomeVar = nothing) le 
variabili che hai creato.
Invece di ripercorrere tutto dal punto 1 per ogni documento.
In questo modo sei al riparo da quasi tutti i problemi...
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
Sti giovinastri che non ascoltano....
@Alex

 ha scritto nel messaggio 
news:1166450641.2...@48g2000cwx.googlegroups.com...
Sti giovinastri che non ascoltano....
@Alex
[risposta]
Ah! Beata gioventů...
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
Dite così
Set oWord = New Word.Application
Set oDoc = oWord.Documents.Open(nomefile)
For f = 1 To UBound(strArray)
Set oDoc = oWord.Documents.Open(nomefile)
 nomefile = strArray(0) & "\" & strArray(f)
oDoc.PrintOut
NEXT F
DoEvents
    oDoc.Close (False)
    Set oDoc = Nothing


budemar...@libero.it
 ha scritto:

In verità ho anche un problemino nell'ordine di stampa l'ultimo file
lo stampa per primo

 ha scritto nel messaggio 
news:1166457361.6...@j72g2000cwa.googlegroups.com...
Dite cosě
Set oWord = New Word.Application
Set oDoc = oWord.Documents.Open(nomefile)
For f = 1 To UBound(strArray)
Set oDoc = oWord.Documents.Open(nomefile)
 nomefile = strArray(0) & "\" & strArray(f)
oDoc.PrintOut
NEXT F
DoEvents
    oDoc.Close (False)
    Set oDoc = Nothing
msgbox ("Fine Stampa")
[risposta]
Meglio se cosě:
'---
on error goto errori
Set oWord = New Word.Application
For f = 1 To UBound(strArray)
    nomefile = strArray(0) & "\" & strArray(f)
    oWord.PrintOut FileName:= nomefile, Background:=True
NEXT F
Do
    DoEvents
    If oWord.BackgroundPrintingStatus = 0 Then
        Exit Do
    End If
Loop
oWord.Quit false
Set oWord = nothing
msgbox "Fine Stampa"
exit sub
errori:
    set oWord = nothing
    msgbox err.number & " " & application.accesserror(err.number)
'---
Non c'č bisogno di istanziare un oggetto Document se devi solo stamparlo; lo 
fai direttamente dall'oggetto Application utilizzando sempre il metodo 
PrintOut.
Prima di chiudere l'applicazione, fai un test per vedere se word ha ancora 
in coda qualche file (oWord.BackgroundPrintingStatus)...
Ciao.
-- 
Sergio MAZZA 

E' sorto un problema mi stampa l'ultimo documento al posto del
primo.....!!???
Qualcuno sa dirmi il perchè????
CIAO

 ha scritto nel messaggio 
news:1166536930....@n67g2000cwd.googlegroups.com...
E' sorto un problema mi stampa l'ultimo documento al posto del
primo.....!!???
Qualcuno sa dirmi il perchč????
CIAO
[risposta]
L.I.F.O. (Last In First Out)?
Mettili in ordine contrario...
Ciao.
-- 
Sergio MAZZA 


 [Risposta]
Non riesco a trovare esempi che riguardano questo metodo...
Mi potresti fare unn esempio 
grazie

 ha scritto nel messaggio 
news:1166612762.2...@48g2000cwx.googlegroups.com...
Non riesco a trovare esempi che riguardano questo metodo...
Mi potresti fare unn esempio
grazie
[risposta]
http://it.wikipedia.org/wiki/LIFO
Ti indicavo un possibile perché l'ultimo file inviato è il primo ad essere 
stampato.
La soluzione potrebbe (è chiaramente da provare) essere quella di invertire 
l'ordine di stampa dei file...
Ciao.
-- 
Sergio MAZZA 

nomefile = strArray(0) & "\" & strArray(f)
    oWord.PrintOut FileName:= nomefile, Background:=True
--------Errore run time 4605
NEXT F
Do
    DoEvents
    If oWord.BackgroundPrintingStatus = 0 Then
        Exit Do
    End If
Loop
oWord.Quit false
Set oWord = nothing
msgbox "Fine Stampa"
exit sub
errori:
    set oWord = nothing
    msgbox err.number & " " & application.accesserror(err.number)
Con il codice suggerito da te mi da questo errore 
Ciao

 ha scritto nel messaggio 
news:1166620206....@73g2000cwn.googlegroups.com...

Su quale riga?
Prova ad andare in "debug mode" e verificare che nomeFile sia valorizzata 
prima del PrintOut...
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA ha scritto:
risposta
 oWord.PrintOut FileName:= nomefile, Background:=True (su questa riga)
prima del printout è visualizzato sia il percorso che il nome del file
 ciao

 ha scritto nel messaggio 
news:1166623728.4...@a3g2000cwd.googlegroups.com...
 oWord.PrintOut FileName:= nomefile, Background:=True (su questa riga)
prima del printout č visualizzato sia il percorso che il nome del file
 ciao
[risposta]
Prova:
 oWord.PrintOut FileName:= nomefile, Background:=-1
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
risposta
Mi da un msgbox con errore 4605
L'altro mio codice funziona ma come dicevi è instabile infatti molte
volte rimangono aperte sessioni word e il sistema si imballa.Inoltre se
stampo molte lettere mi dice memoria insufficente...Dovrei riuscire a
dare un tempo di stampa tra un documento e l'altro.....
che dici si può fare?
Ciao

 ha scritto nel messaggio 
news:1166685126.7...@80g2000cwy.googlegroups.com...
risposta
Mi da un msgbox con errore 4605
L'altro mio codice funziona ma come dicevi è instabile infatti molte
volte rimangono aperte sessioni word e il sistema si imballa.Inoltre se
stampo molte lettere mi dice memoria insufficente...Dovrei riuscire a
dare un tempo di stampa tra un documento e l'altro.....
che dici si può fare?
Ciao
[risposta]
Dammi tempo per implementare il tuo esempio e ti faccio sapere in 
giornata...
Ciao.
-- 
Sergio MAZZA 

Sergio MAZZA ha scritto:
Grazie mille........

 ha scritto nel messaggio 
news:1166685126.7...@80g2000cwy.googlegroups.com...
risposta
Mi da un msgbox con errore 4605
L'altro mio codice funziona ma come dicevi è instabile infatti molte
volte rimangono aperte sessioni word e il sistema si imballa.Inoltre se
stampo molte lettere mi dice memoria insufficente...Dovrei riuscire a
dare un tempo di stampa tra un documento e l'altro.....
che dici si può fare?
Ciao
[risposta]
Allora; ho scaricato l'esempio di Alessandro BARALDI 
(
http://www.alessandrobaraldi.it/DettaglioFaq.asp?IdFAQ=27
) e l'ho 
modificato inserendoci le istruzioni che ti interessano.
Devi modificare la routine evento "su clic" del bottone cmdTest; tra le 
righe:
...
If baOfficeGetFileName(gfni, Me.grpMode) = bacAccErrSuccess Then
e
End if
scrivi:
        Dim oWord As Object
        Set oWord = CreateObject("Word.Application")
        oWord.Documents.Add
        Dim arrFile() As String, numFile As Integer
        arrFile = Split(Trim(gfni.strFile), Chr$(9), , vbBinaryCompare)
        For numFile = 0 To UBound(arrFile)
            oWord.PrintOut FileName:=arrFile(numFile), background:=True
            If oWord.backgroundprintingstatus > 10 Then
                Do
                    DoEvents
                    If oWord.backgroundprintingstatus = 0 Then
                        Exit Do
                    End If
                Loop
            End If
        Next
        oWord.Quit False
        Set oWord = Nothing
        MsgBox "Fine Stampa"
e in:
    HandleErrors:
inserisci:
    If IsObject(oWord) Then
        oWord.Quit False
    End If
    Set oWord = Nothing
...
Sulla form devi mettere la spunta su: Allow Multi-Select.
Comunque l'istruzione di prima ti presentava errore perché non era caricato 
nessun documento; si risolve caricando un foglio bianco prima del printout:
es.
oWord.Documents.Add
oWord.PrintOut FileName:=arrFile(numFile), background:=True
Fammi sapere...
Ciao.
-- 
Sergio MAZZA 

 risposta
Cosi mi funziona
Dim strArray() As String
Dim WordObj As Object
Dim f As Integer
 Dim strTest As String
Dim nomefile As Variant
   strTest = cmdlg_file
   strArray = Split(strTest, Chr$(0))
   For f = 1 To UBound(strArray)
Debug.Print Trim(strArray(f))
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO tabella1(nominativo) VALUES ('" &
Trim(strArray(f)) & "')"
DoCmd.SetWarnings True
nomefile = strArray(0) & "\" & strArray(f)
      Set WordObj = CreateObject("Word.Application")
      WordObj.Documents.Open (nomefile)
      WordObj.PrintOut Background:=False
      WordObj.Quit SaveChanges:=wdDoNotSaveChanges
      Set WordObj = Nothing
Next f
 
  End Sub
ciao grazie