Hotel San Martín *****
En el siguiente ejercicio proponemos realizar una pequeña aplicación para gestionar las reservas de un hotel, con tres hojas:
- Hotel, donde:
- Contamos con un formulario donde introducir los datos para la gestión de las reservas: creación, modificación y/o cancelación
- Gráfico que nos indica las habitaciones disponibles (no coloreadas) para las fechas solicitadas por el cliente.
- Listado de habitaciones ocupadas en dichas fechas
- Reservas: relación histórica de todas las operaciones registradas. Los datos se recogen en una Tabla de Excel, lo que facilita el trabajo posterior.
- Tarifas: importe por persona y noche en función de la temporada y servicio contratado (sólo habitación, habitación + desayuno, Media pensión, o pensión completa
A continuación te dejo una serie de indicaciones para poder llevar a cabo el trabajo. ¿Te atreves?
La plantilla inicial la puedes encontrar aquí.
Si quieres que te facilite PDF con todos los pasos para su resolución escríbeme a rbruixola@dssanalitic.com.
Recuerda, si quieres estar al tanto de las nuevas publicaciones no olvides suscribirte.
Herramientas utilizadas
Formato condicional
Se han establecido formatos condicionales para indicar la disponibilidad de las habitaciones:
- Si el número de la habitación coincide con una de las habitaciones ya reservada dentro de las fechas indicadas por el cliente, esta se coloreara de color Naranja, Énfasis 2, Clara 60%. En este caso utilizamos la función COINCIDIR, para determinar el formato.
- Todas aquellas habitaciones no reservadas, en las fechas indicadas por el cliente, y que el número de huéspedes que puede alojar es inferior al solicitado por el cliente se mostrarán de color gris.
Si no se indica ninguna fecha, por defecto el gráfico muestra las habitaciones disponibles a fecha de hoy.
Función FILTRAR().
Con esta función, nueva disponible en Microsoft 365, obtendremos el número de las habitaciones ocupadas, que serán las que cumplan estas condiciones:
- Que la fechas de entrada, solicitada por el cliente, este comprendida entre las fechas de entrada y salida de las habitaciones ya reservadas.
- O, que la fechas de entrada, solicitada por el cliente, este comprendida entre las fechas de entrada y salida de las habitaciones ya reservadas.
Si no disponemos de esta función, podremos desarrollar el trabajo mediante filtros avanzados
Función COINCIDIR().
Utilizamos está función, en el formato condicional creado para determinar las habitaciones ocupadas
Función BUSCARV()
Utilizaremos esta función para determinar el importe total de la reserva, buscando el servicio solicitado en la hoja "Tarifas".
Función SI()
Para determinar que cálculos hacer cuando no se han definido datos para la reserva, y cuales hacer cuando los datos de la reserva están disponibles.
Formulario de reserva.
El formulario ha sido diseñado con las siguientes características:
- Los campos: Nº de reserva y Fecha de Reserva, se cumplimentan mediante una macro.
- El campo Nº de personas, admite un mínimo de 1 y un máximo de 8 (es la máxima capacidad de las habitaciones del sexto piso).
- El campo tipo de alojamiento, esta compuesto por una lista de validación:
- 1 Sólo habitación.
- 2 Hab + desayuno
- 3 Media pensión
- 4 Pensión completa
- El campo número de tarjeta tiene formato personalizado para que los 16 números de la tarjeta se muestren agrupados de 4 en 4 y separados por un espacio.
- El campo Fecha caducidad solo muestra mes y año: mm/aa
Macros
las macros utilizadas las hemos dividido en dos módulos. En el módulo 1 recogemos aquellas macros que realizamos mediante la grabadora de macros; y en el módulo 2 las que han exigido programación. No obstante a continuación os dejo el código de cada una de las macros.
Módulo 1. Borrar
Sub Borrar()
' Borrar Macro: borra todos los datos del formulario'
Application.ScreenUpdating = False
Range("C4:C15").Select
Selection.ClearContents
Range("C5").Select
Application.ScreenUpdating = True
End Sub
Módulo 1. Editar
Sub Editar()
'
' Editar Macro: Busca el número de reserva indicado y muestra todos los relativas a dicha reserva
Range("C5").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(R4C,Tabla3,Hotel!RC[-2],0)"
Range("C5").Select
Selection.Copy
Range("C6:C15").Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("C6:C15").Select
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("C6").Select
Application.ScreenUpdating = True
End Sub
Módulo 1. Registrar
Sub Registrar()
'
' Traslada los datos del formulario a la tabla de la hoja Reservas
Application.ScreenUpdating = False
Sheets("Reservas").Select
Range("B3").Select
Selection.ListObject.ListRows.Add (1)
Sheets("Hotel").Select
Range("C4").Select
Range("C4:C15").Select
Selection.Copy
Sheets("Reservas").Select
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
Range("N3").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "Reservada"
Range("A3").Select
Sheets("Hotel").Select
Range("C5").Select
Application.ScreenUpdating = True
End Sub
Módulo 1. Fecha
Sub Fecha()
'
' Escribe automáticamente la fecha de hoy en el campo fecha de reserva
Application.ScreenUpdating = False
Range("C5").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Range("C5").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("C6").Select
Application.ScreenUpdating = True
End Sub
Módulo 1. Consecutivo
Sub Consecutivo()
'
' Asigna automáticamente un número correlativo a cada reserva
Application.ScreenUpdating = False
Range("C4").Select
ActiveCell.FormulaR1C1 = "=R[-3]C[-1]+1"
Range("C4").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("B1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("C4").Select
Application.CutCopyMode = False
Range("C5").Select
Application.ScreenUpdating = True
End Sub
Módulo 2. Reservar
Sub Reservar()
'Guarda la reserva en la tabla y borra el contenido del formulario
Application.ScreenUpdating = False
'Macro que evita que se ejecute macro secundaria si existen celdas especificas vacías
existe = False
For Each C In Range("C6:C15") 'Cambiar la C por la columna donde esta las celdas a evaluar. cambiar ("C5:C15") por las celdas a evaluar
If C.Value = "" Then 'Cambiar C por la columna identificada más arriba
celdas = celdas & " " & C.Address(False, False) 'Cambiar C por la columna identificada más arriba
existe = True
End If
Next
If existe Then
MsgBox "Falta información obligatoria en las celdas : " & celdas 'mensaje
Exit Sub
End If
'A continuación colocar el nombre de las macros (Consecutivo, Fecha, Registrar).
Consecutivo
Fecha
Registrar
'Sigue la macro
MsgBox "El dato se guardó", vbInformation, "GUARDAR" 'Entre las primeras comillas mensaje que se muestra si su macro se ejecutó satisfactoriamente.
'A continuación colocar el nombre de la macro limpiar
Borrar
Application.ScreenUpdating = False
'Fin de la macro
End Sub
Módulo 2. Cancelar
Sub CANCELAR()
'Cambia el estado de la reserva a Cancelado
'A continuación colocar la macro Editar
Editar
Application.ScreenUpdating = False
Dim lista As New Collection
Set h1 = Sheets("Hotel") 'Cambiar "Hotel" por el nombre de la hoja que contiene el n° de registro que se desea eliminar
Set h2 = Sheets("Reservas") 'Cambiar "Reservas" por el nombre de la hoja de donde se va a eliminar el n° de registro buscado más arriba
'
dato = h1.[c4] 'En corchetes [C5] colocar la celda del n° de registro que se desea eliminar
If dato = "" Then
MsgBox "Indicar número de reserva" 'Mensaje
Exit Sub
End If
'
u = h2.Range("B" & Rows.Count).End(xlUp).Row 'Cambiar "B" por la columna donde se encuentra el n° de registro buscado en la base de datos hoja "Reservas" para eliminar
'
existe = False
For i = 2 To u
If UCase(h2.Cells(i, "B")) = UCase(dato) Then 'Cambiar "B" por la columna donde se encuentra el n° de registro buscado en la base de datos hoja "Reservas" para eliminar
existe = True
lista.Add i
End If
Next i
'Continúa la macro
If existe Then
cf = MsgBox("Desea cancelar la reserva n°: " & Range("C4"), vbInformation + vbYesNo, "AVISO") 'Cambiar "C5" por la celda que contiene el n° de registro que se desea eliminar en la hoja "principal"
If cf = vbYes Then
Set r = h2.Columns("B") 'Cambiar "B" por la columna que contiene el n° de registro que se desea eliminar en la hoja "Reservas"
Set b = r.Find(h1.[C4], lookat:=xlWhole) 'Cambiar [C4] por la celda que contiene el n° de registro que se desea eliminar en la hoja "registros"
If Not b Is Nothing Then
h2.Cells(b.Row, "N") = "Cancelado" 'Cambiar "N" por la celda donde se quiere poner el mensaje "Cancelado"
End If
MsgBox "Reserva cancelada con éxito", vbInformation 'Mensaje
End If
Else
MsgBox "No se encontró el código: " & Range("C4") 'Cambiar "C4" por la celda que contiene el n° de registro que se desea eliminar en la hoja "principal"
Exit Sub
End If
'A continuación colocar la macro limpiar
Borrar
'fin de la macro
Application.ScreenUpdating = True
End Sub
Módulo 2. Modificar
Sub MODIFICAR()
' funciona en combinación con la macro Editar, en primer lugar editar una reserva, y una vez hechos los cambios los traslada a la tabla de reservas
Application.ScreenUpdating = False
Set h1 = Sheets("Hotel") 'Cambiar "Hotel" por la hoja que contenga el n° de registro que se desee reemplazar
Set h2 = Sheets("Reservas") 'Cambiar "Reservas" por la hoja que contenga la base de datos donde se encuentre el registro que se desea reemplazar
cf = MsgBox("Desea reemplazar el registro?", vbInformation + vbYesNo, "AVISO") 'Mensaje
If cf = vbYes Then
'Estas cuatros líneas seguidas son para que la macro se detenga si falta información en la celda especificada
If h1.[c4] = "" Then 'Cambiar [D11] por la celda que contenga el n° de registro que se quiere reemplazar
MsgBox "Indique número de reserva" 'Mensaje que se muestra si la celda B2 está vacía
Exit Sub
End If
If h1.[c5] = "" Then 'Cambiar [D11] por la celda que contenga el n° de registro que se quiere reemplazar
MsgBox "Indique fecha de reserva" 'Mensaje que se muestra si la celda B2 está vacía
Exit Sub
End If
'
If h1.[c6] = "" Then 'Cambiar [D12] por la siguiente celda que se desee reemplazar
MsgBox "Indique fecha de entrada" 'Mensaje que se muestra si la celda D12 está vacía
Exit Sub
End If
'
If h1.[c7] = "" Then 'Cambiar [D13] por la siguiente celda que se desee reemplazar
MsgBox "Indique fecha de salida" 'Mensaje que se muestra si la celda D13 está vacía
Exit Sub
End If
'
If h1.[c8] = "" Then 'Cambiar [D14] por la siguiente celda que se desee reemplazar
MsgBox "Indique Nº personas" 'Mensaje que se muestra si la celda D14 está vacía
Exit Sub
End If
'
If h1.[c9] = "" Then 'Cambiar [D15] por la siguiente celda que se desee reemplazar
MsgBox "Indique nº habitación" 'Mensaje que se muestra si la celda D15 está vacía
Exit Sub
End If
'
If h1.[c10] = "" Then 'Cambiar [D16] por la siguiente celda que se desee reemplazar
MsgBox "Seleccione servicio" 'Mensaje que se muestra si la celda D16 está vacía
Exit Sub
End If
'
If h1.[c11] = "" Then 'Cambiar [D17] por la siguiente celda que se desee reemplazar
MsgBox "Indique Nombre" 'Mensaje que se muestra si la celda D17 está vacía
Exit Sub
End If
'
If h1.[c12] = "" Then 'Cambiar [D18] por la siguiente celda que se desee reemplazar
MsgBox "Indique Apellidos" 'Mensaje que se muestra si la celda D18 está vacía
Exit Sub
End If
'
If h1.[c13] = "" Then 'Cambiar [D18] por la siguiente celda que se desee reemplazar
MsgBox "Indique nº de tarjeta" 'Mensaje que se muestra si la celda D18 está vacía
Exit Sub
End If
'
If h1.[c14] = "" Then 'Cambiar [D18] por la siguiente celda que se desee reemplazar
MsgBox "Indique Fecha Caducidad Tarjeta" 'Mensaje que se muestra si la celda D18 está vacía
Exit Sub
End If
'
If h1.[c15] = "" Then 'Cambiar [D18] por la siguiente celda que se desee reemplazar
MsgBox "Indique una dirección de correo electrónico" 'Mensaje que se muestra si la celda D18 está vacía
Exit Sub
End If
Set r = h2.Columns("B") 'Cambiar "B" por la columna donde se encuentra el n° de registro a reemplazar en la base de datos
Set b = r.Find(h1.[c4], lookat:=xlWhole) 'Cambiar [D9] por la celda donde esta el n° de registro que se desea reemplazar
If Not b Is Nothing Then 'Cambiar B por la columna donde están los datos que se desean reemplazar
h2.Cells(b.Row, "C") = h1.[c5] 'Cambiar C por la columna donde están los datos que se desea reemplazar con los datos de la hoja "Principal". Cambiar [D12] por la celda seguida del n° de registro en la hoja "Principal" que se desea reemplazar
h2.Cells(b.Row, "D") = h1.[c6]
h2.Cells(b.Row, "E") = h1.[c7]
h2.Cells(b.Row, "F") = h1.[c8]
h2.Cells(b.Row, "G") = h1.[c9]
h2.Cells(b.Row, "H") = h1.[c10]
h2.Cells(b.Row, "I") = h1.[c11]
h2.Cells(b.Row, "J") = h1.[c12]
h2.Cells(b.Row, "K") = h1.[c13]
h2.Cells(b.Row, "L") = h1.[c14]
h2.Cells(b.Row, "M") = h1.[c15]
MsgBox "Su reserva se ha modificado con éxito", vbInformation 'Mensaje
Else
MsgBox "El código no existe", vbInformation 'Mensaje
Exit Sub
End If
'A continuación colocar la macro limpiar
Borrar
'Continúa la macro
End If
Application.ScreenUpdating = True
End Sub
Comentarios
Publicar un comentario