Guardar informe en una ruta especifica y con el nombre de campos específicos a pdf.

Pues te comento que gracias a toda tu ayuda el día lunes a expensas de algún error que le detecte el fin de semana se pondrá a trabajar el sistemita, migrare todos los registros de ASPEL y empezaremos con este sistema.

Por lo que viene, este tema que llevo todas las noches buscando en la red un código que me exporte a pdf un informe, en una ruta especifica ejemplo c:\cotizaciones\ y me lo guarde con un nombre que lleve de los campos nodecotizacion, y fecha y no se si en ese mismo botón se pueda dar la instrucción de adjuntarlo a un correo de microsoft outlook (pero no de outlook express ese no lo usamos) y que me ponga en CC:el email del campo email y en asunto ponga PRESUPUESTO. Y nombre del archivo pdf. Esa es la idea principal si no se puede guardar y después mandar en dato adunto a plantilla de envío de correo por microsoft outlook, solo que lo guarde en pdf con la ruta y nombre especifico.

NOMBRE DE INFORME=cotizacion

Te comento que ya utilice dos códigos y en este me dice que formato guardar y sale snp rich text entre otros le seleccione todos los formatos que me pone y me lo guarda en pdf pero no con el nombre que yo quiero y el formato del pdf al abrir me sale desconocido y no lo abre.

Private Sub pdf3_Click()
On Error GoTo Err_pdf3_Click
' transforma a pdf
Dim NombreArchivo, Título, ValorPred, MiValor
'1) Utilizando InputBox
NombreArchivo = "COTIZACIÓN NO." 'Establece el mensaje.
Título = "Creación de PDF" 'Establece el título.
ValorPred = "nodecotizacion" & Me.nodecotizacion & ".PDF" '
MiValor = InputBox(NombreArchivo, Título, ValorPred)
DoCmd.OutputTo acOutputReport, "cotización", acFormatPDF, "C:\informes\" & ValorPred
Exit_pdf3_Click:
Exit Sub
Err_pdf3_Click:
MsgBox Err.Description
Resume Exit_pdf3_Click
End Sub

<strong style="line-height: 1.5em;">El segundo código yo me lo arme pero de plano no jalo pero me suena lógico a lo que estoy pidiendo solo de guardar en pdf, lo de enviar por correo no se ni como va el código.

Private Sub pdf_Click()
On Error GoTo Err_pdf_Click
Dim stDocName As String
stDocName = "cotización"
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OutputTo acOutputReport, "stDocName", "PDFFormat(*.pdf)", "C:\informes" & nodecotizacion & " _ " & claveempresa & "_- " & Format(fecha, "dd-mm-yyyy") & ".pdf", False, "", 0, acExportQualityPrint
Exit_pdf_Click:
Exit Sub
Err_pdf_Click:
MsgBox Err.Description
End Sub

Ya instale impresoras de acrobat pdf y pdf creator y lo puedo hacer manual pero me gustaría hacerlo en la misma aplicación cotizaciones para automatizar todo el sistema.

1 respuesta

Respuesta
2

En estos temas no estoy muy puesto, pero si miras este enlace del manual de Neckkito ( http://dl.dropboxusercontent.com/u/7400954/WebAccess/Pdf/CursoVBA/CursoVB16.pdf ) te explica cómo imprimir en la impresora que quieras directamente por código (en tu caso elige pdfcreator para que el informe te salga en pdf)

Para adjuntar a Outlook, mira estos otros (hay 3 de emails):( http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/codigo)

Si quieres usar el DoCmd.OutputTo, el código sería parecido a este:

Private Sub pdf3_Click()

Dim miInforme as String

Dim miRuta as String

Dim nomArchivo as String

miInforme="NombreInformeaExportar"

miRuta="C:\cotizaciones\" 'Ruta del directorio donde quieres los pdfs, acabada en la contrabarra (\)

nomArchivo=Me.nodecotizacion & "-" & Format(Date, "dd-mm-yyyy") & ".pdf"

DoCmd.OutputTo acOutputReport, miInforme, "PDFFormat(*.pdf)" _
, miRuta & nomArchivo, True, "", 0, acExportQualityPrint

End Sub

Muchas Gracias por los ejemplos. Los he leído pero no logro comprenderlos en su totalidad, por lo que No se si tu me puedas ayudar o ampliar mas el tema.

He logrado conseguir mandar imprimir a la impresora Virtual Pdfcreator con el siguiente código.

Private Sub cmdImpr1_Click()
On Error GoTo sol_err
'Establecemos la impresora predeterminada a la que
'tiene el índice 1
Set Application.Printer = Application.Printers(0)
'Imprimimos el informe
Dim stDocName As String
stDocName = "cotización"
Dim nomArchivo As String
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OpenReport stDocName, acNormal, , where
Salida:
DoCmd.Close acReport, "nodecotizacion"
Exit Sub
sol_err:
If Err.Number = 2501 Then
MsgBox "Canceló la impresión", vbExclamation, "CANCELADO"
Else
MsgBox "Se ha producido el error: " & Err.Number & " - " & Err.Description
End If
Resume Salida
End Sub

Solo que no se como darle al instrucción que me guarde el nombre del informe con el nodecotizacion-fecha y en mi destino c:\informes\ y que me tome el campo email y cuando me abre el correo me ponga el dato recibido de el campo email.

O si me ayudas a comprender el código que viene en esta pagina por que lo puse en un modulo y lo quise abrir por medio de una macro y luego en el botón al dar click y me salen errores mira esta es la pagina.

http://www.excelguru.ca/content.php?192

Ojala y me pudieras ayudar por favor

Si copias el código de la web esa que comentas en tu botón cmdImpr1 (desde: 'Author : Ken Puls ( www.excelguru.ca)), sólo tienes que cambiar esta porte por los nombres que tu quieras:

'/// Change the report and output file name here! ///
sReportName = "Chart of Accounts"
sPDFName = sReportName & ".pdf"
sPDFPath = Application.CurrentProject.Path & "\"

que en tu caso sería:

'/// Change the report and output file name here! ///
sReportName = "cotizacion"
sPDFName = sReportName & ".pdf"
sPDFPath = "c:\informes\"

Y esta otra:

'Print the document to PDF
DoCmd. OpenReport (sReportName)

Que le tendrías que añadir el "where" (evidentemente, tendrás que declarar esta variable y asignarla previamente)

Entonces no debo crear ningún modulo y luego ejecutarlo mediante alguna instrucción, solo pego el código en un botón y al hacer click le pego el codigo?

Correcto, copia el código con los cambios que te comentaba y te debería funcionar

PUES YA LO HE ECHO Y ME SALE ERROR DE COMPILACIÓN Y ME PONE EN NEGRITA ESTO.

Private Sub cmdImpr2_Click()
Option Compare Database
Option Explicit
Sub PrintAccessReportToPDF_Early()
'Author : Ken Puls ( www.excelguru.ca)
'Macro Purpose: Print to PDF file using PDFCreator
' (Download from http://sourceforge.net/projects/pdfcreator/ )
' Designed for early bind, set reference to PDFCreator
Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String
Dim sPrinterName As String
Dim sReportName As String
Dim lPrinters As Long
Dim lPrinterCurrent As Long
Dim lPrinterPDF As Long
Dim prtDefault As Printer
'/// Change the report and output file name here! ///
sReportName = "cotizacion"
sPDFName = sReportName & ".pdf"
sPDFPath = "c:\informes\" & "\"
'Resolve index number of printers to allow changing and preserving
sPrinterName = Application.Printer.DeviceName
On Error Resume Next
For lPrinters = 0 To Application.Printers.Count
Set Application.Printer = Application.Printers(lPrinters)
Set prtDefault = Application.Printer
Select Case prtDefault.DeviceName
Case Is = sPrinterName
lPrinterCurrent = lPrinters
Case Is = "PDFCreator"
lPrinterPDF = lPrinters
Case Else
'do nothing
End Select
Next lPrinters
On Error GoTo 0
'Change the default printer
Set Application.Printer = Application.Printers(lPrinterPDF)
Set prtDefault = Application.Printer
'Start PFF Creator
Set pdfjob = New PDFCreator.clsPDFCreator
With pdfjob
If .cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "PrtPDFCreator"
Exit Sub
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = sPDFPath
.cOption("AutosaveFilename") = sPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With
'Print the document to PDF
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OpenReport stDocName, acNormal, , where
'Wait until the print job has entered the print queue
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
pdfjob.cPrinterStop = False
'Wait until PDF creator is finished then release the objects
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
'Reset the (original) default printer and release PDF Creator
Set Application.Printer = Application.Printers(lPrinterCurrent)
Set pdfjob = Nothing
End Sub
Private Sub Comando357_Click()
On Error GoTo Err_Comando357_Click
DoCmd.Close
Exit_Comando357_Click:
Exit Sub
Err_Comando357_Click:
MsgBox Err.Description
Resume Exit_Comando357_Click
End Sub
Private Sub Comando375_Click()
On Error GoTo Err_Comando375_Click
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 2, , acMenuVer70
Exit_Comando375_Click:
Exit Sub
Err_Comando375_Click:
MsgBox Err.Description
Resume Exit_Comando375_Click
End Sub

QUE ESTOY HACIENDO MAL????

Borra esto:

Option Compare Database
Option Explicit
Sub PrintAccessReportToPDF_Early()

Cambia esto:

sPDFPath = "c:\informes\" & "\"

por esto:

sPDFPath = "c:\informes\"

y añade: Dim where as string antes de: where = "[nodecotizacion]=" & Me.nodecotizacion

Pues ya lo he puesto así y ahora me marca en negro esto.

Private Sub cmdImpr1_Click()
'Author : Ken Puls ( www.excelguru.ca)
'Macro Purpose: Print to PDF file using PDFCreator
' (Download from http://sourceforge.net/projects/pdfcreator/ )
' Designed for early bind, set reference to PDFCreator
Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String
Dim sPrinterName As String
Dim sReportName As String
Dim lPrinters As Long
Dim lPrinterCurrent As Long
Dim lPrinterPDF As Long
Dim prtDefault As Printer
'/// Change the report and output file name here! ///
sReportName = "cotización"
sPDFName = sReportName & ".pdf"
sPDFPath = "c:\informes\"
'Resolve index number of printers to allow changing and preserving
sPrinterName = Application.Printer.DeviceName
On Error Resume Next
For lPrinters = 0 To Application.Printers.Count
Set Application.Printer = Application.Printers(lPrinters)
Set prtDefault = Application.Printer
Select Case prtDefault.DeviceName
Case Is = sPrinterName
lPrinterCurrent = lPrinters
Case Is = "PDFCreator"
lPrinterPDF = lPrinters
Case Else
'do nothing
End Select
Next lPrinters
On Error GoTo 0
'Change the default printer
Set Application.Printer = Application.Printers(lPrinterPDF)
Set prtDefault = Application.Printer
'Start PFF Creator
Set pdfjob = New PDFCreator.clsPDFCreator
With pdfjob
If .cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "PrtPDFCreator"
Exit Sub
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = sPDFPath
.cOption("AutosaveFilename") = sPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With
'Print the document to PDF
Dim where As String
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OpenReport stDocName, acNormal, , where
'Wait until the print job has entered the print queue
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
pdfjob.cPrinterStop = False
'Wait until PDF creator is finished then release the objects
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
'Reset the (original) default printer and release PDF Creator
Set Application.Printer = Application.Printers(lPrinterCurrent)
Set pdfjob = Nothing
End Sub

HELP POR favor.

Tienes que registrar la referencia al PDFCreator, como te dice aquí, que seguro no lo has hecho... jeje:

Code Required:
This code goes in a standard module. You will need to set a reference to PDFCreator, and change the name of the report. You may also want to update the directory to sabe the file into (sPDFPath), as it will currently sabe the file into the database's directory.

Para eso, en el modulo de vba, vete a Herramientas->Referencias y busca y marca la del PDFCreator

YA LA LLEVAMOS JA JA, AHORA ME ARROJA. Se ha producido el error 2497 en tiempo de ejecución la acción o el método requiere un argumento Nombre del informe. y me selecciona al depurar este código. el que esta en negrillas.

Dim where As String
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OpenReport stDocName, acNormal, , where

perdón ya me di cuenta por que era el error era la cadena así.

'Print the document to PDF
Dim where As String
Dim stDocName As String
stDocName = "cotización"
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OpenReport stDocName, acNormal, , where y ya lo guarda en la carpeta especifica, ahora 2 puntos me lo esta guardando como nombre cotización, como le puedo poner para que me guarde el nombre con nodepresupuesto y un guion medio(-) y fecha eso creo debe ir aquí no?

sReportName = "cotización"

sReportName = "cotización" es el nombre del informe;

sPDFName = "cotización" & ".pdf" es el nombre del archivo.

Tu tendrás que ponerle algo como esto:

sPDFName = Me.nocotizacion & "-" & Format(Date, "yy.mm.dd") & ".pdf"

El darle formato a la fecha, es por un lado, evitar errores al nombrar el archivo con las "/", y por otro, que las puedas ordenar por fecha.

Y fíjate que aquí, lo tienes mal:

DoCmd.OpenReport stDocName, acNormal, , where

StDocName no es ninguna variable que tengas declarada ni un valor asignado a ella. Tienes que poner sReportName, que es la que tienes.

EFECTIVAMENTE ME SALÍ POR LA TANGENTE Y DECLARE UNA VARIABLE CON EL NOMBRE stDocName y por eso me funcionada ja ja, pero ya lo he corregido a sRepotName y a quedado super Genial.

AHORA HE LOGRADO: Que me envíe el informe atra vez del botón a PDFCreator y que me lo guarde con el Nombre que yo quiero, y le he puesto una opción al PDFCreator que me adjunte el archivo pdf en una pantalla de envío de correo por medio de Microsoft Outlook 2003, pero que instrucción debe llevar o como declaro para que me envíe del campo "email" la dirección que esta escrita en ese campo y me lo ponga en la ventana que me adjunto el pdf que a creado de mi informe.

Eso es lo único que me falta de ese modulo y también no sabes por que me salen los informes en blanco y negro cuando los convierto a PDF. ya le moví los parámetros al PDFCreator y no va por ahí la cosa ya que todo lo demás si lo convierte a color en pdf menos los informes, habrá alguna opción en access para declararle eso??

Nuevamente muchas gracias por todas tus atenciones.

A ver, lo del color negro, ni idea del motivo.

Lo del email, ni idea tampoco. Además no entiendo a que te refieres con esto: "le he puesto una opción al PDFCreator que me adjunte el archivo pdf en una pantalla de envío de correo por medio de Microsoft Outlook 2003"

A Mira el programa PdfCreator tiene una opción que dice después de autoguardar abrir el documento con el programa predeterminado y enviar Email después de Autoguardado.

Entonces con el botón de access que ya tiene especificado que nombre ponerle al PDF. me lo guarga en c:/informes/ con el nombre que quiero y me habré un correo con el archivo adjunto pero en donde va el destinatario (Para) sale en blanco entonces quisiera ver lo de una instrucción dentro del código que acabamos de hacer que convierte a pdf y me lo guarda con los datos que me dijiste que me tome el dato del campo email y me lo ponga como destinatario en el correo que me habré con el informe adjunto en pdf. Si me explico o no?

Estaba pensando en una opción algo así como:

DoCmd.SendObject acReport, sRepotName =Me.e-mail.

Pero no se en donde meterlo dentro del código este:

Private Sub cmdImpr1_Click()
'Author : Ken Puls ( www.excelguru.ca)
'Macro Purpose: Print to PDF file using PDFCreator
' (Download from http://sourceforge.net/projects/pdfcreator/ )
' Designed for early bind, set reference to PDFCreator
Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String
Dim sPrinterName As String
Dim sReportName As String
Dim lPrinters As Long
Dim lPrinterCurrent As Long
Dim lPrinterPDF As Long
Dim prtDefault As Printer
'/// Change the report and output file name here! ///
Dim nomArchivo As String
sReportName = "cotización"
sPDFName = "PRESUPUESTO No." & Me.nodecotizacion & "-" & Format(Date, "dd.mm.yy") & ".pdf"
sPDFPath = "c:\informes\"
'Resolve index number of printers to allow changing and preserving
sPrinterName = Application.Printer.DeviceName
On Error Resume Next
For lPrinters = 0 To Application.Printers.Count
Set Application.Printer = Application.Printers(lPrinters)
Set prtDefault = Application.Printer
Select Case prtDefault.DeviceName
Case Is = sPrinterName
lPrinterCurrent = lPrinters
Case Is = "PDFCreator"
lPrinterPDF = lPrinters
Case Else
'do nothing
End Select
Next lPrinters
On Error GoTo 0
'Change the default printer
Set Application.Printer = Application.Printers(lPrinterPDF)
Set prtDefault = Application.Printer
'Start PFF Creator
Set pdfjob = New PDFCreator.clsPDFCreator
With pdfjob
If .cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "PrtPDFCreator"
Exit Sub
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = sPDFPath
.cOption("AutosaveFilename") = sPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With
'Print the document to PDF
Dim where As String
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OpenReport sReportName, acNormal, , where
'Wait until the print job has entered the print queue
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
pdfjob.cPrinterStop = False
'Wait until PDF creator is finished then release the objects
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
'Reset the (original) default printer and release PDF Creator
Set Application.Printer = Application.Printers(lPrinterCurrent)
Set pdfjob = Nothing
End Sub

Por que si esta respetando el PDFCreator que le mande guardar el documento mediante

sPDFName = "PRESUPUESTO No." & Me.nodecotizacion & "-" & Format(Date, "dd.mm.yy") & ".pdf", yo creo que también puede mandar esa instrucción del email al correo no??

Mira he probado con esta opción pero solo me manda el correo y no me adjunta el archivo por lógica no le manda instrucción al pdf creator pero si toma la dirección de email, que instrucción podría ser?
dim OutLookApp As Outlook.Application
dim Msg As Outlook.MailItem
dim Diré(1) As String
dim POR As Long
diré(1) = Me!email
Set OutLookApp = New Outlook.Application
for POR = 1 To 1
Set Msg = OutLookApp.CreateItem(olMailItem)
msg.Subject = "PRESUPUESTO"
msg.Body = "Buen día." & Diré(1)
msg.To = Diré(1)
msg.Send
Next
'OutLookApp = Nothing

Que te complicas bien!

En el ejemplo de Neckkito "Y Dos de Email" (http://dl.dropboxusercontent.com/u/7400954/WebAccess/Pdf/EjemplosCodigo/YDosDeMail.pdf), tienes el código para mandar un correo con adjunto a través de outlook.

Lo único que tienes que hacer es poner el código a continuación del que te genera el pdf, y olvidate de las opciones del PDFCreator de mandar por mail.

Y ¡Ojo!, no copies el código completo, sólo lo que te haga falta, y con los cmabios a los cmapos de tu bd

HOLA. Nuevamente molestándote fijate que ya trate de modificar el código del programador Nikkito y creo que lo he echo muy mal podrías revisarlo por favor, ya que me sale un recuadro que dice un programa esta intentando obtener direcciones de correo electronico almacenadas en Outlook desea premitirlo? y me dice permitir y en access me sale 438:El objeto no admite esta propiedad o metodo? Que estoy haciendo remal??

Private Sub pdfcorreo_Click()
'Author : Ken Puls ( www.excelguru.ca)
'Macro Purpose: Print to PDF file using PDFCreator
' (Download from http://sourceforge.net/projects/pdfcreator/ )
' Designed for early bind, set reference to PDFCreator
Dim pdfjob As PDFCreator.clsPDFCreator
Dim sPDFName As String
Dim sPDFPath As String
Dim sPrinterName As String
Dim sReportName As String
Dim lPrinters As Long
Dim lPrinterCurrent As Long
Dim lPrinterPDF As Long
Dim prtDefault As Printer
'/// Change the report and output file name here! ///
Dim nomArchivo As String
sReportName = "cotizacion"
sPDFName = "PRESUPUESTO No." & Me.nodecotizacion & "-" & Format(Date, "dd.mm.yy") & ".pdf"
sPDFPath = "c:\informes\"
'Resolve index number of printers to allow changing and preserving
sPrinterName = Application.Printer.DeviceName
On Error Resume Next
For lPrinters = 0 To Application.Printers.Count
Set Application.Printer = Application.Printers(lPrinters)
Set prtDefault = Application.Printer
Select Case prtDefault.DeviceName
Case Is = sPrinterName
lPrinterCurrent = lPrinters
Case Is = "PDFCreator"
lPrinterPDF = lPrinters
Case Else
'do nothing
End Select
Next lPrinters
On Error GoTo 0
'Change the default printer
Set Application.Printer = Application.Printers(lPrinterPDF)
Set prtDefault = Application.Printer
'Start PFF Creator
Set pdfjob = New PDFCreator.clsPDFCreator
With pdfjob
If .cStart("/NoProcessingAtStartup") = False Then
MsgBox "Can't initialize PDFCreator.", vbCritical + _
vbOKOnly, "PrtPDFCreator"
Exit Sub
End If
.cOption("UseAutosave") = 1
.cOption("UseAutosaveDirectory") = 1
.cOption("AutosaveDirectory") = sPDFPath
.cOption("AutosaveFilename") = sPDFName
.cOption("AutosaveFormat") = 0 ' 0 = PDF
.cClearCache
End With
'Print the document to PDF
Dim where As String
where = "[nodecotizacion]=" & Me.nodecotizacion
DoCmd.OpenReport sReportName, acNormal, , where
'Wait until the print job has entered the print queue
Do Until pdfjob.cCountOfPrintjobs = 1
DoEvents
Loop
pdfjob.cPrinterStop = False
'Wait until PDF creator is finished then release the objects
Do Until pdfjob.cCountOfPrintjobs = 0
DoEvents
Loop
pdfjob.cClose
'Reset the (original) default printer and release PDF Creator
Set Application.Printer = Application.Printers(lPrinterCurrent)
Set pdfjob = Nothing
'****** AQUI EMPIEZA LA PARTE DEL CORREO******
On Error GoTo sol_err
'Definimos las variables
Dim mailA As String
Dim elAsunto As String, elMsg As String
'Cogemos los valores que hemos indicado en el formulario
mailA = Me.email.Value
elAsunto = "PRESUPUESTO"
'Creamos una instancia de Outlook
Dim Olk As Outlook.Application
Set Olk = CreateObject("Outlook.Application")
'Creamos un nuevo mensaje de Outlook
Dim OlkMsg As Outlook.MailItem
Set OlkMsg = Olk.CreateItem(olMailItem)
'Creamos la información del mail
With OlkMsg
'Definimos los elementos del mail
Dim OlkDestinatario As Outlook.Recipient
Dim OlkAdjunto As Outlook.Attachment
'Inicializamos los elementos del mail
Set OlkDestinatario = .Recipients.Add(mailA)
OlkDestinatario.Type = olTo
'Comprobamos que exista el archivo que vamos a adjuntar
If Not IsMissing(cotizacion) Then
Set OlkAdjunto = .Attachments.Add(cotizacion)
End If
'Añadimos los elementos Asunto y Mensaje
.Subject = "PRESUPUESTO No."
.Body = "Buen dia" Me.contactos
'Enviamos el mail
.Send
End With
'Lanzamos un mensaje de OK
MsgBox "El mensaje se ha enviado correctamente", vbInformation, "CORRECTO"
'Eliminamos el archivo Informe.snp de la carpeta
Kill miInforme
'Eliminamos la instancia
Set Olk = Nothing
Set OlkMsg = Nothing
Set OlkDestinatario = Nothing
Set OlkAdjunto = Nothing
Salida:
Exit Sub
sol_err:
MsgBox Err.Number & ": " & Err.Description
End Sub

Varias cosas:

1º/ ¿Te fijaste en hacer esto:

¿

? IMPORTANTE: para que los códigos que se explican en este ejemplo no os den erroresMicrosoft Outlook debe estar abierto antes de ejecutarlos. Si no el propio código produce elbloqueo de la apertura de Outlook. ¡Ojo!? IMPORTANTE: para que puedan funcionar los códigos debemos registrar la librería“Microsoft Outlook x.x Object Library”. Para ello podemos hacer lo siguiente:– Una vez abierta la base de datos, abrimos el editor de VB (¿pulsamos ALT+F11)– Nos vamos a menú Herramientas? Referencias– Buscamos esa librería (¿con la versión x.x que tengamos)– Marcamos su check y aceptamos?

2º/ ¿Te fijaste en esto otro, que no sé si es tu caso:

.- El informe lo hemos sacado en formato snapshot para hacer el ejemplo compatible con Access 2003. Si tenemos Access 2007 o superior podríamos haberlo sacado en pdf,pero debemos tener en cuenta que en nuestro ordenador tiene que estar instalado el complemento que proporciona Microsoft ((http://www.microsoft.com/downloads/eses/details.aspx?displaylang=es&FamilyID=4D951911-3E7E-4AE6-B059-A2E79ED87041)En este caso las modificaciones en el código deberían ser las siguientes:– Redefinir la variable miInforme, así: miInforme = ruta & "Informe.pdf"– Redefinir la línea de exportación, así:DoCmd.OutputTo acOutputReport, "RDatos", "PDF", miInforme, False?

Si usas esas veriones, puedes olvidarte del pdfcreator.

3º/ Tienes varios errores en el código, por hacer copia-pega a lo bruto:

->Esto te sobra, pq no viene a cuento o pq no lo usas:

Dim elAsunto As String, elMsg As String

'Eliminamos el archivo Informe. Snp de la carpetaKill miInforme

->Tienes mal el adjunto, debería ser:

'Comprobamos que exista el archivo que vamos a adjuntarIf Not IsMissing(sPDFPath & sPDFName)ThenSet OlkAdjunto = .Attachments.Add(sPDFPath & sPDFName)End If

-> Aqui te dará un error porque te falta un &:

.Body = "Buen dia " & Me.contactos

Y a ver si con esto ya lo solucionas definitivamente.

Hola buen día, agradezco infinitamente tu paciencia y enseñanza, te comento que me atreví a usar el código para mandar imprimir a través de PDFCreator por que estoy utilizando Access 2003 y esa version solo te manda a exportar a formato .snp y aquí los clientes que reciben los presupuestos muchos de ellos no pueden abrir ese formato por lo que lo debo de mandar en PDF, Con tu ayuda pude lograr a través del PdfCreator manda imprimir desde Access un Informe que sigue apareciendo en blanco y negro jajajaja pero ya lo hace con las indicaciones de mandarlo guardar a una ruta especifica y con el nombre de algunos campos de mi formulario. Quiero entender que con el código que estamos trabajando no va a tomar el dato adjunto que me crea el código que hicimos para el pdf creator y por eso lo puse así después de que ejecutara la primera operación que es convertir el informe a pdf con nombre especifico tomame el archivo y mandalo a outlook con el remitente del campo email, pero por lo que me dices creo que son dos códigos que trabajan independientes verdad?

No entiendo nada de lo que dices.

La primera parte del código te crea un pdf del informe en la ruta que le pones en esta variable: sPDFPath, y con el nombre que le asignas a esta otra: sPDFName

Luego, la segunda parte, te coge ese archivo, y lo manda al contacto que le dices por medio de outlook con esto:

'Comprobamos que exista el archivo que vamos a adjuntar

If Not IsMissing(sPDFPath & sPDFName)Then

Set OlkAdjunto = .Attachments.Add(sPDFPath & sPDFName)

End If

Buen día, ya he echo las modificaciones que me haz indicado y con algunos detalles me envía los correos pero lo que quiero es que en vez de enviarlos con el .send quiero que me habrá el correo con todas las instrucciones que ya me esta mandando pero sin enviarlo solo que me lo habrá ya le cambie el .send por .open y no jalo sera otro comando??

Te comento que si lo envío así con el .send me sigue apareciendo un programa esta intentando obtener acceso a direcciones de correo electrónico almacenadas en outlook Desea Permitirlo? y me dice permitir accesos. Ya di de alta como me indicaste el Microsoft Outlook 11 Object Library y aun así me sale ese problema, de cualquier forma me gustaría que no lo enviara automáticamente si no que me abra el correo ya con todas las instrucciones del código. que debo ponerle en vez del sed.

Este es mi código

'****** AQUI EMPIEZA LA PARTE DEL CORREO******
On Error GoTo sol_err
'Definimos las variables
Dim mailA As String
'Cogemos los valores que hemos indicado en el formulario
mailA = Me.email.Value
'Creamos una instancia de Outlook
Dim Olk As Outlook.Application
Set Olk = CreateObject("Outlook.Application")
'Creamos un nuevo mensaje de Outlook
Dim OlkMsg As Outlook.MailItem
Set OlkMsg = Olk.CreateItem(olMailItem)
'Creamos la información del mail
With OlkMsg
'Definimos los elementos del mail
Dim OlkDestinatario As Outlook.Recipient
Dim OlkAdjunto As Outlook.Attachment
'Inicializamos los elementos del mail
Set OlkDestinatario = .Recipients.Add(mailA)
OlkDestinatario.Type = olTo
'Comprobamos que exista el archivo que vamos a adjuntar
If Not IsMissing(sPDFPath & sPDFName) Then
Set OlkAdjunto = .Attachments.Add(sPDFPath & sPDFName)
End If
'Añadimos los elementos Asunto y Mensaje
.Subject = "PRESUPUESTO DE BOMBAS NILO DE MEXICO"
.Body = "Buen día " & Me.contactos
'Abrimos el mail abrir en vez de envía por si hay que agregarle algo
.Send
End With
'Lanzamos un mensaje de OK
MsgBox "El mensaje se ha enviado correctamente", vbInformation, "CORRECTO"
Salida:
Exit Sub
sol_err:
MsgBox Err.Number & ": " & Err.Description
End Sub

Tienes que cambiar el .Send por .Display, y evidentemente, quitar el mensaje de "el mensaje se ha enviado correctamente".

Lo del mensaje de outlook no sé cómo solucionarlo.

EXCELENTE, Como siempre me haz dado la mejor ayuda para este modulo quedo a la perfección ya encontrare como quitar el mensaje de outlook. Te agradezco todas tus atenciones excelente día.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas