Hola a todos,
Hace unos días estuve pensando en la posibilidad de poner una encuesta en el blog, sobre todo para saber si los contenidos están gustando, si hay algo que mejorar o quizás orientar el blog hacia otro tipo de áreas (financieras, estadísticas, etc…), pero es que hace un tiempo ya había colgado una encuesta, de esas que se hacen automáticamente desde WordPress y el resultado no fue el esperado porque la participación fue muy pequeña.
Ahora que ya llevo unas cuentas entradas y algunas me consta que están siendo de utilidad, me he propuesto basar esta entrada en cómo hacer una encuesta en Excel y la posibilidad de enviarla automáticamente desde outlook usando vba. Que conste que me lo pensé dado que no todo el mundo tiene instalado en su equipo outlook y por lo tanto no podrá responder o utilizar la macro, pero bueno, creo que es una forma de aprender algo nuevo y de trasladar a los lectores una encuesta de forma original.
Pues vamos allá, empecemos por la encuesta primero, que hay que hacerla siguiendo unos criterios específicos para que luego el código funcione correctamente.
Como en cualquier encuesta debemos escribir una pregunta y una serie de respuestas para que el encuestado pueda expresar su opinión, en este caso en particular voy a proponer:
– Una primera pregunta en la que solo debemos seleccionar una respuesta.
– Una segunda pregunta en la que podremos seleccionar cualquier respuesta.
– Una tercera pregunta que será de respuesta abierta, pudiéndola dejar en blanco.
Esta sería la encuesta:
Como podéis observar, al lado de cada respuesta he incrustado en la hoja una «casilla de verificación» para marcar y validar el dato, este control lo podéis encontrar accediendo a la ficha «Programador» de la cinta de opciones de Excel y pulsando en la pestaña «Modo diseño» y a continuación en «Insertar», una vez que se abran las opciones elegiremos dentro de los Controles Active X la «casilla de verificación»:
Para la pregunta 3 he elegido otro control Active X, en este caso se trata de un «cuadro de texto»:
y que tendremos la posibilidad de configurar sus propiedades entrando en el editor del objeto, para ello pulsaremos el botón derecho del ratón y pulsaremos en «propiedades», de forma que vamos a asignar una longitud máxima de 1.000 caracteres y le agregaremos una barra de scroll lateral por si se pasan del espacio del cuadro de texto:
Y así ya tenemos resuelta la parte visual de la entrevista. Ahora nos queda pendiente la parte de la programación, y lo primero que vamos a hacer es condicionar a que en la pregunta 1 solo se pueda responder una sola pregunta y que no se pueda dejar ninguna sin contestar, en la pregunta 2 se pueda responder a una o varias preguntas pero no pueda dejar ninguna vacía y en el cuadro de texto no haremos nada, es una pregunta abierta.
Abrimos el editor de visual basic y en la hoja una escribimos en siguiente código:
Os lo dejo aquí para que lo podáis copiar:
Private Sub validar_encuesta()
'Pregunta 1_condicionamos a no se puede dejar la pregunta sin responder.
If CheckBox1 = Empty And CheckBox2 = Empty And CheckBox3 = Empty Then
MsgBox "DEBES SELECCIONAR UNA RESPUESTA PARA LA PREGUNTA 1"
Exit Sub
Else
' Condicionamos a que se debe responder solo una pregunta.
If CheckBox1 <> Empty And CheckBox2 <> Empty Then
MsgBox "DEBES SELECCIONAR SOLO UNA RESPUESTA PARA LA PREGUNTA 1"
Exit Sub
End If
If CheckBox2 <> Empty And CheckBox3 <> Empty Then
MsgBox "DEBES SELECCIONAR SOLO UNA RESPUESTA PARA LA PREGUNTA 1"
Exit Sub
End If
If CheckBox3 <> Empty And CheckBox1 <> Empty Then
MsgBox "DEBES SELECCIONAR SOLO UNA RESPUESTA PARA LA PREGUNTA 1"
Exit Sub
End If
End If
'Pregunta 2_ condicionamos a que al menos se tenga que seleccionar una pregunta
If CheckBox4 = Empty And CheckBox5 = Empty And CheckBox6 = Empty And CheckBox7 = Empty And CheckBox8 = Empty Then
MsgBox "DEBES SELECCIONAR UNA RESPUESTA PARA LA PREGUNTA 2"
Else
' Validamos
MsgBox "LOS DARTOS HAN SIDO VALIDADOS CORRECTAMENTE, YA PUEDES ENVIAR LA ENCUESTA"
Exit Sub
End If
End Sub
El siguiente paso será introducir un botón para validar que las preguntas estén correctamente respondidas y lo configuramos para que ejecute la macro «validar_encuesta» pulsando con el botón derecho en el ratón:
Ahora tan solo nos queda hacer otro botón para enviar por correo la encuesta, y dado que se hace de la misma forma que el anterior no lo explicaré.
Para hacer la macro que envía la encuesta, debemos volver a copiar el código anterior (para que vuelva a validar) y un pequeño formulario para advertir de que se va a proceder a enviar la información y podamos aceptar o cancelar.
He resaltado en un cuadro en rojo el userform1, que nos va a servir como advertencia para desencadenar el correo. el código que escribiremos en el userform es el siguiente:
El detalle del formulario es importante, dado que una vez que le damos a «Aceptar» se desencadena la instrucción para enviar el correo:
Private Sub CommandButton1_Click()
' Selecciona el rango de celdas que deseas copiar y enviar.
ActiveSheet.Range("b3:h35").Select
' Mostrar vista previa del área seleccionada.
ActiveWorkbook.EnvelopeVisible = True
' Detallamos la introduccion del correo, el correo del destinatario y el asunto y enviamos.
With ActiveSheet.MailEnvelope
.Introduction = "RESPUESTAS ENCUESTA EXCELSIGNUM"
.Item.To = "excelsignum@yahoo.es"
.Item.Subject = "ENCUESTA EXCEL SIGNUM"
.Item.Send
End With
'Una vez enviado el correo, procedemos a borrar lo que habiamos marcado en la encuesta.
ThisWorkbook.Worksheets(1).CheckBox1.Value = Unchecked
ThisWorkbook.Worksheets(1).CheckBox2.Value = Unchecked
ThisWorkbook.Worksheets(1).CheckBox3.Value = Unchecked
ThisWorkbook.Worksheets(1).CheckBox4.Value = Unchecked
ThisWorkbook.Worksheets(1).CheckBox5.Value = Unchecked
ThisWorkbook.Worksheets(1).CheckBox6.Value = Unchecked
ThisWorkbook.Worksheets(1).CheckBox7.Value = Unchecked
ThisWorkbook.Worksheets(1).CheckBox8.Value = Unchecked
ThisWorkbook.Worksheets(1).TextBox1.Value = ClearContents
'Ocultamos el userform de validación
UserForm1.Hide
End Sub
En verde he puesto lo que hace cada una de las líneas de código, en rojo están detallados los campos que contendrá nuestro correo, es decir: el asunto del mensaje, la dirección de correo y la introducción. En caso de querer utilizar la macro solo tendréis que modificar estos campos y el rango de celdas a seleccionar. Después de que haya enviado el correo, la macro borra el contenido de lo que hemos marcado y escrito en la encuesta y oculta el userform1.
Para finalizar, he creído conveniente poner un evento «open» para que cada vez que se abra el libro de excel deje vacío el contenido de las respuestas de la encuesta, esta macro la colocaremos en el módulo «Thisworkbook»:
Pues bien, creo que ya he terminado la explicación, ahora solo me queda dejaros el archivo de ejemplo y esperar a recibir vuestras opiniones. También espero que os resulte interesante la entrada y la podáis utilizar en vuestros trabajos.
* Importante: la macro solo funcionará en equipos con Outlook instalado (no importa la versión), en Outlook Espress no funcionará y tampoco en ninguno de los otros correos electrónicos más conocidos como Gmail, Yahoo, Hotmail, Msn , etc. para cada uno de ellos hay que configurar sus cuentas en VBA de forma específica.
Descarga el archivo pulsando en: ENVIAR CORREO DESDE OUTLOOK USANDO EXCEL
Buenas, me ayudo mucho la explicacion, pero no encuentro la manera de elegir la casilla desde donde sale, es decir, si tengo 2 casillas en outlook como hago para elegir una de ellas? Gracias!
Hola Ness,
Cuando dices «casillas» a que te refieres?? en el ejemplo, las casillas son los items para marcar las respuestas a las preguntas. Quieres decir, si tienes a varios destinatarios? o si tienes varias cuentas?. No entiendo muy bien la pregunta.
:
Si necesitas enviar a varios varios destinatarios, solo tienes que escribir el otro correo después del punto y coma:
.Item.To = «excelsignum@yahoo.es; otrocorreo@gmail.com»
Saludos.
Gracias! La pregunta es si tengo casilla aa@gmail.com y casilla bb@gmail.com, como puedo elegir la casilla de correo desde la cual sale el mail? Gracias nuevamente, disculpa que no fui claro. Saludos!
Hola Ness,
Perdona por no contestar antes, estos días estoy de vacaciones y no tengo demasiado tiempo para conectarme. Ahora entiendo, lo que necesitas es poder especificar la cuenta desde la que necesitas enviar el correo, en caso de existir varias en outlook.
Esto se puede hacer con la propiedad SendUsingAccount, ahora no tengo ordenador para realizar los cambios en el ejemplo, pero aquí tienes un enlace de interés:
https://excelpoweruser.wordpress.com/2013/09/29/send-e-mail-using-other-account-by-outlook/#comments
A la vuelta y con tiempo, realizaré un ejemplo con lo que indicas. Otra solución es que especifiques la cuenta desde la que te interesa realizar los envíos como la predeterminada, de forma que la macro siempre va utilizar esa.
Saludos.
Gracias! Espero al ejemplo. Un abrazo!
Buenas Tardes tu ejemplo es muy bueno pero tengo un pequeño problema, quiero que en el mensaje del texto se vaya en blanco como haría para que lo que esta en el libro no lo copie si no se envié un archivo adjunto.
Hola jhoan:
Para realizar lo que indicas te recomiendo esta otra macro. Ponla en un módulo estándar y ejecútala:
Seleccionas el archivo y lo envías:
Sub Envia_adjunto()
Adjunto = Application.GetOpenFilename
Set oPost = CreateObject("outlook.application")
Set oItem = oPost.createitem(olmailitem)
With oItem
.to = "correo del destinatario"
.Subject = "Asunto del mensaje"
.Attachments.Add (Adjunto)
.Send
End With
End Sub
Saludos.