Sei sulla pagina 1di 6

Envo y recepcin de encuestas con Excel

Francisco 05-05-08
Programacin : Ofimtica

Gestin de las evaluaciones de un curso


por parte de los alumnos. El proceso se
automatiza mediante una plantilla de MSExcel.
Los pasos a seguir son:
1. Introducir la informacin general del curso y los alumnos a los que
se enviarn luego las encuestas
2. Crear una encuesta personalizada para cada alumno
3. Enviar las encuestas a los alumnos y esperar su respuesta
4. Importar las encuestas recibidas
5. Revisar las encuestas
Ver una imagen del men principal

Ficheros

Plantilla sin cdigo

Cdigo Visual Basic

Cdigo Visual Basic en formato PDF

Plantilla con cdigo

Option Explicit
Const SUBCARPETA = "Encuestas"
'BOTN 1 DE INICIO
Sub Guardar()
'''ActiveWorkbook.SaveAs
Select Case Application.LanguageSettings.LanguageID(msoLanguageIDUI)
Case 3082: SendKeys "%au" ' [A]rchivo->G[u]ardar como...
Case Else: SendKeys "%fa" ' [F]ile->Save [A]s...
End Select
End Sub
'BOTN 2 DE INICIO
Sub GuardarEncuestas()
'Crear una encuesta para cada alumno en la subcarpeta "encuestas"
'Hay que copiar las hojas en este orden: valoracion, evaluacion y datos
Dim
Dim
Dim
Dim
Dim
Dim
Dim

libroInicial As Workbook
hojaInicio As Worksheet
ruta As String, archivo As String, plantilla As String
nombreArchivo As String, alumno As String, mensaje As String
celda As range
fso As FileSystemObject
respuesta As Integer, cuentaEncuestas As Integer

Set libroInicial = ActiveWorkbook


Set hojaInicio = ActiveSheet
'Crear la subcarpeta
ruta = libroInicial.Path & "\" & SUBCARPETA
If Dir(ruta, vbDirectory) = "" Then
MkDir ruta
End If
'Duplica el libro actual para crear una plantilla
' a partir de la cual crear las encuestas para los alumnos
plantilla = libroInicial.Path & "\EvaluaPPG_plantilla.xlt"
If Dir(plantilla) <> "" Then Kill plantilla 'Reemplazar si exista
'FileCopy libroInicial.FullName, plantilla ' NO FUNCIONA PORQUE EST
ABIERTO
Set fso = New FileSystemObject
fso.CopyFile libroInicial.FullName, plantilla
Set fso = Nothing
Workbooks.Open plantilla, editable:=True
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("inicio").Delete
ActiveWorkbook.Worksheets("revision").Delete
ActiveWorkbook.Worksheets("evaluacion").Activate
Application.DisplayAlerts = False
With ActiveWindow
.DisplayGridlines = False

.DisplayHeadings = False
.DisplayWorkbookTabs = False
End With
ActiveSheet.Protect DrawingObjects:=True, Contents:=True,
Scenarios:=True
ActiveWorkbook.SaveAs plantilla, FileFormat:=xlTemplate
ActiveWorkbook.Close
'Por cada alumno del rango alumnos creamos un libro
' a partir de la plantilla y copiamos unos datos
cuentaEncuestas = 0
For Each celda In range("alumnos")
alumno = Trim(celda.Value)
If alumno = "" Then Exit For
archivo = ruta & "\Encuesta de " & alumno & ".xls"
If Dir(archivo) = "" Then
respuesta = vbYes
Else
respuesta = MsgBox("Ya existe la encuesta de " & alumno & ".
Volverla a crear?", _
vbExclamation + vbYesNo, archivo)
End If
If respuesta = vbYes Then
Workbooks.Add Template:=plantilla
ActiveSheet.range("e12") = hojaInicio.range("e5")
ActiveSheet.range("e14") = hojaInicio.range("e6")
ActiveSheet.range("e16") = alumno
ActiveSheet.range("e18") = hojaInicio.range("e7")
ActiveSheet.range("e20") = hojaInicio.range("e8")
ActiveWorkbook.SaveAs archivo, FileFormat:=xlNormal
ActiveWorkbook.Close
cuentaEncuestas = cuentaEncuestas + 1
End If
Next
'Ya no es necesaria la plantilla que hemos creado
If Dir(plantilla) <> "" Then Kill plantilla
'Mensaje final
MsgBox "Se han guardado " & cuentaEncuestas & " encuestas en " &
vbCrLf & ruta, vbInformation
End Sub
'BOTN 3 DE INICIO
Sub AbrirEncuestas()
'Abre las encuestas ya rellenadas y copia el rango "encuesta" en filas
sucesivas del rango "datos"
On Error GoTo Errores
''ActiveWorkbook.Application.Visible = False
Dim libroInicial As Workbook
Set libroInicial = ActiveWorkbook
Dim fichero As String, mensaje As String, ruta As String

Dim cuenta As Integer


Dim celdaDestino As Variant 'TIENE QUE SER VARIANT POR CULPA DEL
MTODO COPY
Dim rangoEncuesta As range
''Dim appExcel As Excel.Application
'Ruta de la subcarpeta
ruta = libroInicial.Path & "\" & SUBCARPETA
If Dir(ruta, vbDirectory) = "" Then
MsgBox "No existe la carpeta " & vbCrLf & ruta, vbExclamation
Exit Sub
End If
'Borrar datos actuales que pudiesen haber
Dim cell As range
range("DATOS").ClearContents
For Each cell In range("datos").Rows(1) 'Poner ceros en la primera

fila

cell = "0"

Next

'Leer todos los ficheros de Excel de la subcarpeta


fichero = Dir(ruta & "\*.xls")
cuenta = 0
Do Until fichero = ""
cuenta = cuenta + 1
mensaje = mensaje & fichero & vbCrLf
fichero = ruta & "\" & fichero
Workbooks.Open fichero
Set rangoEncuesta =
ActiveWorkbook.Sheets("datos").range("encuesta")
Set celdaDestino =
libroInicial.Sheets("datos").range("datos").Cells(cuenta, 1)
rangoEncuesta.Copy celdaDestino
ActiveWorkbook.Close
fichero = Dir
Loop
'''MsgBox mensaje, vbInformation, cuenta
If cuenta = 0 Then
MsgBox "No hay encuestas en la carpeta " & vbCrLf & ruta,
vbExclamation
Exit Sub
Else
'''Dejar slo los valores y eliminar las frmulas con referencia
a las encuestas
range("DATOS").Copy
range("DATOS").PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
'range("DATOS").Cells(1, 1).Select
Call IrAHojaInicio

MsgBox "Se han ledo " & cuenta & " encuestas" & vbCrLf & vbCrLf
& mensaje, vbInformation
End If
Salida:
''ActiveWorkbook.Application.Visible = True
Exit Sub
Errores:
MsgBox Err.Description, vbCritical
Resume Salida
End Sub
'BOTN 4 DE INICIO
Sub IrAHojaRevision()
Sheets("revision").Select
range("numAlumno").Select
End Sub
Option Explicit
'Funciones utilizadas en frmulas de la hoja "evaluacin"
Function ExtraerNumero(texto) As Currency
'Extrae el nmero que hay al principio del texto
Dim pos As Integer, largo As Integer
Dim car As String * 1
largo = Len(texto)
For pos = 1 To largo
car = Mid(texto, pos, 1)
If InStr("0123456789,.", car) = 0 Then
texto = Mid(texto, 1, pos - 1)
Exit For
End If
Next
If IsNumeric(texto) Then
ExtraerNumero = CCur(texto)
Else
ExtraerNumero = 0
End If
End Function
Function RelacionRango(numero, minimo, maximo) As Currency
'Indica la relacin (tanto por uno) del nmero respecto al rango
(minimo..maximo)
' Si numero es minimo da 0
' Si numero es maximo da 1
numero = ExtraerNumero(numero)
RelacionRango = (numero - minimo) / (maximo - minimo)
End Function
Function MostrarPorcentaje(tantoPorUno) As String

'ROUND(AVERAGE(G25:G33)*100;2)&"%"
If IsNumeric(tantoPorUno) Then
MostrarPorcentaje = Round(tantoPorUno * 100, 2) & "%"
Else
MostrarPorcentaje = ""
End If
End Function
'Macros usadas en la hoja "evaluacin"
Sub IrAHojaInicio()
Sheets("inicio").Select
End Sub
Sub SiguienteRevision()
Call revision(1)
End Sub
Sub AnteriorRevision()
Call revision(-1)
End Sub
Function revision(avanzar)
Dim celda As range
Dim numero As Integer
Set celda = range("numAlumno")
numero = celda.Value
numero = numero + avanzar
If numero < 0 Then
numero = 25
ElseIf numero > 25 Then
numero = 0
End If
celda.Value = numero
End Function

Potrebbero piacerti anche