General

6.131 Inviare da VBA uno o più file per fax usando FaxServer di Windows XP
  Sergio Mazza
(D)
Vorrei poter inviare dal codice VBA di Access un report attraverso il fax di Windows XP, ma senza dover scegliere la stampante fax dal menu a tendina delle stampanti e senza poi dover fare la procedura guidata di invio fax.

(R)
Se Windows XP ha il servizio fax puoi utilizzare quello; nel codice VBA che segue trovi come inviare per fax i file contenuti in una cartella, quindi anche il file ottenuto dal metodo OutputTo e relativo ad un report:
On Error GoTo inviaFax_err

'--> creo il file di log
Dim nomeFileLog As String
nomeFileLog = "C:\liste\logFaxInvio_" & Format(Date, "ddmmyyyy") & ".txt"
Open nomeFileLog For Output As #1

'--> dichiarazione oggetti
Dim oFso As Scripting.FileSystemObject, oDoc As Object
Dim oFax As FaxServer, oFaxDoc As FaxDoc, JobId As Variant

'--> dichiarazione variabili
Dim numeroFaxDaComporre As String, posInizio As Integer

'--> creazione oggetti
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFax = CreateObject("FaxServer.FaxServer")

'--> inizio impostazione server fax
Print #1, "'--> inizio impostazione server fax"
With oFax
    .Connect "" '<-- creo una connessione (al pc), se stringa nulla é il pc locale
    .ArchiveDirectory = "C:\Documenti\Fax\Fax inviati" '<-- directory dove posizionare i fax inviati
    .ArchiveOutboundFaxes = 1 '<-- salvataggio di una copia del fax nella cartella
    .Branding = 1 '<-- scrivi intestazione del fax nel documento
    .DirtyDays = 5 '<-- giorni per ritentare l'invio se non riuscito
    .Retries = 1 '<-- numero ore per ritentare l'invio (del fax) non riuscito
    .RetryDelay = 5 '<-- numero minuti per ritentare l'invio (del fax) non riuscito
    .ServerCoverpage = 0 '<-- non invio la pagina di informazioni
    .UseDeviceTsid = 1 '<-- invio l'identificativo del fax che trasmette
End With
Print #1, "'--> fine impostazione server fax" '<-- fine impostazione server fax

'--> ciclo per ogni documento nella cartella dei fax
Print #1, "'--> ciclo per ogni documento nella cartella dei fax"
For Each oDoc In oFso.GetFolder("C:\liste\FaxDaInviare\").Files

'--> inizio creazione documento fax
'--> creazione documento fax
    Set oFaxDoc = oFax.CreateDocument("C:\liste\FaxDaInviare\" & oDoc.Name)

'--> inizio impostazione e invio documento fax
    posInizio = InStr(1, oDoc.Name, "_") + 1 '<-- posizione carattere underscore
    numeroFaxDaComporre = Mid(oDoc.Name, posInizio) '<-- tolgo i numeri prima del carattere underscore
    numeroFaxDaComporre = Left(numeroFaxDaComporre, Len(numeroFaxDaComporre) - 4) '<-- tolgo l'estensione del file e il punto

    With oFaxDoc
        .FaxNumber = "0" & numeroFaxDaComporre '<-- numero del fax
        Print #1, numeroFaxDaComporre & "'<-- numero del fax da comporre"
        On Error Resume Next '<-- verifica errore invio fax
        JobId = .Send '<-- invio fax
        Print #1, "'<-- invio fax: " & oDoc.Name

        If Err.Number <> 0 Then '<-- se si é verificato un errore
            Print #1, "Errore: " & Application.AccessError(Err.Number) & " su invio fax: " & oDoc.Name & ", JobId: " & JobId
        Else
            Print #1, "Fax: " & oDoc.Name & ", JobId: " & JobId & "...Inviato."
        End If
    End With
'--> fine impostazione documento fax

    On Error GoTo 0 '<-- ripristino la gestione degli errori

'--> fine creazione documento fax
    Set oFaxDoc = Nothing
Next

On Error GoTo 0 '<-- reimposto la gestione degli errori

inviaFax_exit:
    Print #1, "Disconnessione dal server fax."
    oFax.Disconnect '<-- disconnetto il server fax
    Print #1, "'--> distruggo gli oggetti"
'--> distruggo gli oggetti
    Set oFso = Nothing
    Set oFax = Nothing
    Print #1, "Invio fax terminato."
    Close #1
    Exit Sub

inviaFax_err:
    Print #1, "Disconnessione dal server fax."
    Print #1, "'--> distruggo gli oggetti"
'--> distruggo gli oggetti
    Set oFso = Nothing
    Set oDoc = Nothing
    Set oFax = Nothing
    Set oFaxDoc = Nothing
    Set JobId = Nothing
    Print #1, Application.AccessError(Err.Number), vbCritical + vbOKOnly, "Routine InviaFax - Errore"
    Close #1
La routine:
1) Invia tutti i file presenti in una cartella "C:\liste\FaxDaInviare\"; i file hanno nel nome il numero di telefono del fax, ad esempio il nome potrebbe essere 06656566_docFax.doc;
2) Utilizza un file di testo come log per le operazioni;
3) Salva una copia dei fax inviati nella cartella "C:\Documenti\Fax\Fax inviati";

Prima di utilizzare il codice si deve avviare il servizio fax…

Considerazioni di Fidirico (lavoro)
Ho provato questo codice VBA e funziona bene per inviare per fax dei file usando il FaxServer di Windows XP. Da questo esempio si possono trarre ottimi spunti per costruire applicazioni davvero non banali. Gli oggetti usati sono ben documentati su MSDN; ad esempio trovi decritto l'oggetto FaxServer in questo link:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fax/faxlegacyvb_836n.asp


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.