Saltar al contenido

Enviar mail con macro


Recommended Posts

publicado

Buenas, tengo un problema con estos codigos. El siguiente, me falla en la parte del codigo donde graba el archivo temporal (negrita). y Me aparece el siguiente mensaje de eror al depurar:

Se ha producido el error '1004' en tiempo de ejecucion:

No se puede tener acceso al archivo. Intente lo siguiente:

Compruebe que la carpeta especificada existe
Compruebe que la carpeta que contiene el archivo no es de solo lectura
Compruebe que el archivo no contiene ninguno de los siguientes caracteres: < > ? [ ] : o *[/HTML]

Lo extraño es que anteriormente funcionaba facilmente y lo unico que hice antes de que dejara de funcionar es cambiarle el nombre de la hoja a enviar.

[CODE]Sub EmailtraspasoP()
'Working in 2000-2010
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim Sourcewb As Workbook
Dim Destwb As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim OutApp As Object
Dim OutMail As Object
Dim sh As Worksheet
Dim TheActiveWindow As Window
Dim TempWindow As Window

With Application
.ScreenUpdating = False
.EnableEvents = False
End With

Set Sourcewb = ActiveWorkbook

'Copy the sheets to a new workbook
'We add a temporary Window to avoid the Copy problem
'if there is a List or Table in one of the sheets and
'if the sheets are grouped
With Sourcewb
Set TheActiveWindow = ActiveWindow
Set TempWindow = .NewWindow
.Sheets("Traspasos Permanentes").Copy
End With

'Close temporary Window
TempWindow.Close

Set Destwb = ActiveWorkbook

'Determine the Excel version and file extension/format
With Destwb
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007-2010, we exit the sub when your answer is
'NO in the security dialog that you only see when you copy
'an sheet from a xlsm file with macro's disabled.
If Sourcewb.Name = .Name Then
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
MsgBox "Your answer is NO in the security dialog"
Exit Sub
Else

Select Case Sourcewb.FileFormat
Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
Case 52:
If .HasVBProject Then
FileExtStr = ".xlsm": FileFormatNum = 52
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
Case 56: FileExtStr = ".xls": FileFormatNum = 56
Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
End Select
End If
End If
End With

'Change all cells in the worksheets to values if you want
For Each sh In Destwb.Worksheets
sh.Select
With sh.UsedRange
.Cells.Copy
.Cells.PasteSpecial xlPasteValues
.Cells(1).Select
End With
Application.CutCopyMode = False
Destwb.Worksheets(1).Select
Next sh


'Save the new workbook/Mail it/Delete it
TempFilePath = Environ$("temp") & "\"
TempFileName = "Traspasos Permanentes " & Sourcewb.Name & " " _
& Format(Now, "dd/mm/yyyy a las hh:mm")

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

With Destwb
.SaveAs TempFilePath & TempFileName & FileExtStr, _
FileFormat:=FileFormatNum

With OutMail
.To = "aaaaa@ar.iveco.com"
.CC = ""
.BCC = ""
.Subject = "Traspasos Permanentes" & Sourcewb.Name & " " _
& Format(Now, "dd/mm/yyyy hh:mm")
.Body = "Han habido Traspasos Permanantes de Personal en la" & " " & Sourcewb.Name & " " _
& "el dia " & Format(Now, "dd/mm/yyyy a las hh:mm")
.Attachments.Add Destwb.FullName
'You can add other files also like this
'.Attachments.Add ("C:\test.txt")
.Send 'or use .Display
End With

.Close SaveChanges:=False

End with
'Delete the file you have send
Kill TempFilePath & TempFileName & FileExtStr

Set OutMail = Nothing
Set OutApp = Nothing

With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub[/CODE]

publicado

Hola:

Cuando usas macros y estableces nombres de hojas, estas se mantienen en la macro y no se actualizan si las cambias en el libro, la solucion mas facil para esto, y actualizarlo tu mismo es:

1. Busca en tu macro el nombre de tu Hoja anterior.

2. Reemplazalo por el nuevo, y veras que todo te va como antes.

Para enviar un mail hay varias opciones, deseas mandar todo el libro? o solo una hoja?

Espero te sirva,

Saludos,

Fernando

publicado

Hola enferchats:

Gracias por responder, cuando me referia a cambiar el nombre de la hoja, me referia a que lo habia hecho dentro de la macro....

En principio estoy probando con enviar una hoja unicamente.


.SaveAs TempFilePath & TempFileName & FileExtStr, _ FileFormat:=FileFormatNum
[/PHP]

Esa es la parte del codigo que me marca al depurar, es decir, por lo que entiendo no es capaz de grabar el libro, bajo los parametros que establece el codigo. La cuestion es por que, si antes podia.

El codigo sin cambio asi como lo extraje de la pagina Ron's excel Tips es el siguiente. Lo que no encuentro es el cambio que me genera el error en mi codigo.

[PHP]
Sub Mail_Sheets_Array() 'Working in 2000-2010 Dim FileExtStr As String Dim FileFormatNum As Long Dim Sourcewb As Workbook Dim Destwb As Workbook Dim TempFilePath As String Dim TempFileName As String Dim OutApp As Object Dim OutMail As Object Dim sh As Worksheet Dim TheActiveWindow As Window Dim TempWindow As Window With Application .ScreenUpdating = False .EnableEvents = False End With Set Sourcewb = ActiveWorkbook 'Copy the sheets to a new workbook 'We add a temporary Window to avoid the Copy problem 'if there is a List or Table in one of the sheets and 'if the sheets are grouped With Sourcewb Set TheActiveWindow = ActiveWindow Set TempWindow = .NewWindow .Sheets(Array("Sheet1", "Sheet3")).Copy End With 'Close temporary Window TempWindow.Close Set Destwb = ActiveWorkbook 'Determine the Excel version and file extension/format With Destwb If Val(Application.Version) < 12 Then 'You use Excel 97-2003 FileExtStr = ".xls": FileFormatNum = -4143 Else 'You use Excel 2007-2010, we exit the sub when your answer is 'NO in the security dialog that you only see when you copy 'an sheet from a xlsm file with macro's disabled. If Sourcewb.Name = .Name Then With Application .ScreenUpdating = True .EnableEvents = True End With MsgBox "Your answer is NO in the security dialog" Exit Sub Else Select Case Sourcewb.FileFormat Case 51: FileExtStr = ".xlsx": FileFormatNum = 51 Case 52: If .HasVBProject Then FileExtStr = ".xlsm": FileFormatNum = 52 Else FileExtStr = ".xlsx": FileFormatNum = 51 End If Case 56: FileExtStr = ".xls": FileFormatNum = 56 Case Else: FileExtStr = ".xlsb": FileFormatNum = 50 End Select End If End If End With ' 'Change all cells in the worksheets to values if you want ' For Each sh In Destwb.Worksheets ' sh.Select ' With sh.UsedRange ' .Cells.Copy ' .Cells.PasteSpecial xlPasteValues ' .Cells(1).Select ' End With ' Application.CutCopyMode = False ' Destwb.Worksheets(1).Select ' Next sh 'Save the new workbook/Mail it/Delete it TempFilePath = Environ$("temp") & "\" TempFileName = "Part of " & Sourcewb.Name & " " _ & Format(Now, "dd-mmm-yy h-mm-ss") Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0) With Destwb .SaveAs TempFilePath & TempFileName & FileExtStr, _ FileFormat:=FileFormatNum On Error Resume Next With OutMail .To = "ron@debruin.nl" .CC = "" .BCC = "" .Subject = "This is the Subject line" .Body = "Hi there" .Attachments.Add Destwb.FullName 'You can add other files also like this '.Attachments.Add ("C:\test.txt") .Send 'or use .Display End With On Error GoTo 0 .Close SaveChanges:=False End With 'Delete the file you have send Kill TempFilePath & TempFileName & FileExtStr Set OutMail = Nothing Set OutApp = Nothing With Application .ScreenUpdating = True .EnableEvents = True End With End Sub
[/PHP]

Para ser mas claro con otro macro yo creo una hoja donde cargo los datos y le coloco el nombre "Traspasos Permanentes" y eso es lo que deseo copiar y mandar por email.

Esta hoja solo tiene datos en el Range("A1:L2"), y por eso tambien intente enviar solamente ese rango en el cuerpo del email pero esto ni siquiera me funciono.

O sea el codigo para enviar la hoja, si me funcionaba en un primer momento.

publicado

Lo que entiendo es que con una macro creas una hoja nueva y copias algunos datos y le pones cierto nombre.

Y lo que deseas es esa hoja enviarla por correo no?. Si es asi te copio un codigo que te podria ayudar

Sub enviar()

Dim wb As Workbook

Dim strEmail As String

strEmail = (direccion a donde la quieres enviar, puedes usar el valor d una celda)

asunto = (pones el nombre del asunto que saldra en el mail, ejem: "CONFIRMAR RECEPCION")

Set wb = ActiveWorkbook

With wb

.SaveAs nombre & ".xls"

.SendMail strEmail, asunto

.ChangeFileAccess xlReadOnly

Kill .FullName

.Close False

End With

End Sub

a mi me sirvio mucho este codigo, pruebalo y espero te solucione el problema

publicado

Esta bueno ese codigo, pero el problema es que a mi me sirve el que yo puse (si funcionara). Esto por que el de arriba, copia la hoja con datos incluidos a un nuevo libro, lo graba en temporales, lo envia, y lo borra todo esto desde el archivo desde donde se creo aquella hoja de la que hablabamos.

El codigo que vos compartis conmigo, necesitaria ejecutarse (si mal no entiendo) desde el nuevo libro. Puesto que si yo ejecutara ese codigo desde el libro principal, dado que posee muchas otras hojas, creo que tiraria error.

La verdad es que no tengo los conocimientos actualmente como para adaptar ese codigo al que yo coloco primero. Colocar el macro en el libro no es una opcion, a menos que se ejecute solo y luego lo borre cosa que desconozco si puede hacerse.

Saludos

publicado

BUeh, finalmente despues de releer el codigo 830 mil veces, probando 732 mil cambios distintos, descubri donde se hallaba el error, aunque todavia no descubri cual era el error.

El error estaba en la linea que define y asigna el nombre al archivo temporal a grabar con el nuevo libro creado.

Asi estaba inicialmente en el modulo del mencionado autor de la macro:

   TempFileName = "Part of " & Sourcewb.Name & " " _
& Format(Now, "dd-mmm-yy h-mm-ss")[/CODE]

Estos son los cambios que yo le hice y donde aparentenemente dejo de funcionar

[CODE]
TempFileName = "Traspasos Permanentes " & Sourcewb.Name & " " _
& Format(Now, "dd/mm/yyyy a las hh:mm")[/CODE]

El error esta en las "/" que separan la mascara de los dias y los ":" que separan las horas. Dado que es un nombre de libro solo puede utilizarse "-" o "_". Bueno saludos, gracias por las respuestas. Y disculpen el post tan inservible que acavo de crear :culpability:.

pueden colocarlo como solucionado

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Current Donation Goals

    • Raised 0.00 EUR of 130.00 EUR target
  • Archivos

  • Estadísticas de descargas

    • Archivos
      189
    • Comentarios
      99
    • Revisiones
      29

  • Crear macros Excel

  • Mensajes

    • Hola Buenas Noches, Me podrán ayudar a resolver un problema con una planilla que tengo, les comento brevemente. Tengo un archivo que cuenta con 2 hojas, la primera se llama "Movimientos" que básicamente muestra los productos con quiebres que se presentan y la hoja "Producción" que como su nombre lo dice son las producciones de cada producto según fecha de creación. Lo que necesito es lo siguiente: Cada vez que agregue una producción en la hoja "producción", debo ingresar el código creado su cantidad y lote respetivamente, además de la fecha en que se realiza la producción, en caso que sea mayor a las 12:00 se considera PM sino AM. Lo complejo es acá en la otra hoja llamada Movimientos: Esta hoja contiene una columna que se llama "Saldo", que básicamente es la diferencia de lo producido vs el quiebre en esa fecha. Una columna llamada "Cumple", que significa que ese pedido lleva si o no el producto con quiebre. Y una columna "Se preparo", que es si el pedido se preparo o no. Lo complicado viene acá es que si la fecha de la producción que ingrese en la hoja "Produccion", se hace después de la fecha de la hoja movimientos no me debe contar esa producción para efecto de la columna Saldos, si la fecha es igual o menor si se considera y ese saldo que queda disponible se puede ocupar para futuros ingresos de pedidos. Otra conducción es que las producciones siempre se deben asignar al pedido más antiguo de ese código salvo que la fecha de entrega ya haya pasado. La columna "Cumple" es básicamente para poder generar un KPI donde me indique cuales producciones se cumplieron con el plazo y cuales No. Espero me puedan ayudar ya que tengo la siguiente formula pero no sirve ya que me toma las unidades totales y no cumple con la restricción del horario. =SUMAR.SI(Produccion!A:A; $A2; Produccion!C:C) - SUMAR.SI.CONJUNTO($E$2:$E2; $A$2:$A2; A2)) Muchas gracias. Ejemplo..xlsx
    • Hola a ambos, Prueba con: =BYROW(G5:G6;LAMBDA(x;UNIRCADENAS(" - ";1;FILTRAR(E5:E10;B5:B10=x)))) Saludos,
    • Si tienes office 365 puedes usar algo como FILTER ó TEXTJOIN y si no tienes, entonces se puede jugar con las formulas, pero no te recomiendo mucho si son muchos datos, de todas maneras te dejo una fórmula y en vba, ya tu decides cual ocupar, vale Saludos BUSCAR.xlsm
    • Buenos días mis estimados Familia ayudaexcel,  Favor quisiera solicitar su gentil soporte con lo siguiente: Necesito una formula que al buscar encuentre el valor inicial de busqueda y dea todo los resultados encontrado en una celda como ejemplo. si este producto tienes 4 cantidades esta al hacer una formula de busqueda me dea el resultado de las 4 en una celda, dejo el adjunto a espera de su gran soporte.   BUSCAR.xlsx
    • Saludos Sr @Israel Cassales espero este bien quise verificar bien su solución y que las modificaciones que hice funcionarán adecuadamente y al respecto debo decir que su aporte es excelente ya que no solo me ayudo a resolver lo que necesitada sino que también me ayudo a solventar dos cosas más por lo cual estoy muy agradecido 
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.