Porteger celdas sin perder el vinculo a otra hoja en formulario

Es un problema difícil de describir,, no se como explicarlo, pero voy a intentarlo, de ser el caso envío el archivo

La verdad no he podido

Explico

Estoy haciendo una programita básico con código para gestionar un pqñ hotel sin facturación, en excel con visual

En la hoja menu tengo una serie de celdas distribuidas uniformemente en la hoja, cada celda representa una habitación y tiene un color,, son 2 celdas que cambian a 4 estados, las 2 de arriba, se llaman disponible y ocupada y las 2 de abajo, limpieza(azul) y mantenimiento(naranja),, ok,,

Cuando hago doble clic en la celda disponible (verde) se abre un formulario para registrar los datos que va a reposar a otra hoja, ok

Cuando se registran los datos con el formulario,, la celda dispobible pasa a color rosa y ocupada

Ok,,

El inconveniente es:

Quiero que me permita, bloquear las celdas cuando ya estén ocupadas (rosa) ya que alguien tal ves por error o malintencionado,, haga doble clic en la celda ocupada y la coloque disponible otra vez, sabiendo que todavía esta el huésped en la habitación

Si llego a proteger la hoja,, al cargar el formulario y llenar los datos, estos se registran pero sale un error en el código que me envía a DEPURAR o finalizar

1 respuesta

Respuesta
2

Supongo que la hoja está protegida y alguna celda está bloqueda, por lo que no puedes escribir en esa celda.

Lo que puedes hacer en tu código es desbloquear la hoja, guardar la información y después volver a bloquear la hoja, por ejemplo:

Private Sub CommandButton1_Click()
    Sheets("hoja1"). Unprotect "abc"
    '
    'aquí va tu código para guardar los datos en la hoja
    '
    Sheets("hoja1"). Protect "abc" 'abc es el password
End Sub

En algún momento si la celda está en "ocupada", la celda estará bloqueda y la hoja protegida, pero cuando realmente se pase a "disponible", necesitas desproteger la hoja, cambiar el estado y proteger la hoja. Te sugiero que lo hagas desde el userform, tal vez con algún mensaje de advertencia o con algún password, si el que va a hacer el cambio se sabe el pasword entonces que realice el cambio. Por ejemplo:

Private Sub CommandButton1_Click()
    res = InputBox("Introduce el password")
    If res = "admin" Then
        Sheets("hoja1"). Unprotect "abc"
        '
        'aquí va tu código para guardar los datos en la hoja
        '
        Sheets("hoja1"). Protect "abc" 'abc es el password
    Else
        MsgBox "El password es incorrecto"
    End If
End Sub

Avísame cualquier duda

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

MMM,, gracias, sr dante, pero no,, así no es,, creo que no me comprendió,,, es que es como complicado

Tendría como enviarle el archivo para que usted lo vea,,

La celdas están desbloqueadas, y hoja no están protegidas

Es un chcicharron que tengo y la verdad no se como explicarlo

A ver, otra vez

En la hoja menu, que esta desbloqueada, normal,, tengo un cuadro de celdas de colores, una de ellas al hacer doble clic llama a un formulario para digitar algnso datos, al hacer clic en registras estos se depositan en otra hoja, ok,,

Cual es el problema, que a veces pienso que es logístico,

Cuando se registran los datos en el formulario la celda en excel pasa a color rosa, con el texto "ocupada" esta celda mientras el huésped no haya facturado o pagado o este todavía en la habitación no puede pasar a disponible(verde), que se tiene que hacer manualmente al hacer doble clic otra vez, ok,,, ¿pero de repente alguien le hace doble clic por error la y coloca en disponible sin que el cliente haya pagado o este aun en la hbaitacion? Como inhabilito cuando la celda este ocupada, es decir que pida tal ves alguna contraseña para poner en dispoble otra ves y volver a utilizarla de nuevo

Lo que me pregunto: ¿Cómo una operaria va a colocar arbirtrariamente en disponible si la habitación esta ocupada? Pero dicen que pueden cometer un error.. y que es humana,,

Y yo tengo que resolverlo..

Por eso pido ayuda

No se si me hice entender..' gracias..

Solamente te puse un ejemplo. Realmente no explicaste mucho en tu pregunta inicial.

Mencionas que te aparece un error, tienes que poner el mensaje completo del error y en qué línea de la macro se detiene.

Ahora pones esto:

"Como inhabilito cuando la celda este ocupada, es decir que pida tal ves alguna contraseña para poner en dispoble otra ves y volver a utilizarla de nuevo"

Cuando presionas doble click, supongo que ejecutas una macro, entonces al inicio de esa macro debes solicitar el password.


Si la hoja no está protegida, entonces olvida el doble click, la celda es susceptible de cambiarse, eliminarse, borrarse, pueden borrar toda la columna, toda la fila, sin necesidad de presionar doble click.

El password lo debes solicitar para cambiar de ocupada a disponible y viceversa; de esa forma puedes minimizar el error.

Pero si la habitación está ocupada y no han pagado y el usuario decide cambiarla a disponible así le pongas 20 password, simplemente lo va a hacer. Lo del password es un punto de control, pero no necesariamente es la solución completa. Los errores seguirán existiendo, si van a poner en disponible la habitación 19 y por error le dan doble click a la 18, ponen password, etc, van a dejar disponible la 18 y la 19 seguirá ocupada.


En resumen, con qué quieres que te ayude, poniendo un password cuando le dan doble click, protegiendo la hoja, bloqueando celdas, ¿o con el error que te aparece en tu macro?

saludos}

le adjunto una imagen de mi programa

el pantallazo de la hoja menu

Ok

Si logra ver que la habtiacion 102-doble esta ocupada, quiere decir que ya se cargaron los datos en el formulario y estos reposan en otra hoja, ok

Ahora, la operaria dice,, que "alguien" puede poner la celda color rosa ocupada otra ves en disponible,, y ella quiere evitar que esto ocurra, entonce se me ocurrió protegr la hoja o la celda, seria mejor o más bien toda la hoja pero no se la verdad como hacerlo,,,

Se puede poner en "disponible" solamente si ya registraron la salida o el pago.

Eso quiere decir, que si tienes un formulario para registrar el pago, entonces desde ese formulario se deberá cambiar de "rosa" a "verde".

Entonces debes quitar tu doble click y hacer el cambio desde otro Control.

Podría darte varios consejos o ejemplos o controles para evitar los "errores", pero todo debe estar relacionado.

Por ejemplo, el proceso podría ser así:

1. La habitación 101 está "disponible".

2. Doble click sobre la hab 101

3. Si la celda = "disponible" entonces Abres el formulario de "ocupación", se registra en la "otra hoja"

4. Se cambia de "disponible" a "ocupada"

5. El cliente se va.

6. Doble click sobre la hab 101

7. Si la celda = "ocupada" entonces abres el formulario de "pago", registras el pago del cliente en una "tercera hoja" o en la "otra hoja" (eso no lo sé, ni tampoco sé si llevas un registro de pagos, es un ejemplo, de esa forma te aseguras que estás registrando la salida de la habitación)

8. Si y solo sí, registraste el pago, entonces cambias la hab 101 de "ocupada" a "disponible".

9. Además de todo lo anterior, debes proteger la hoja y bloquear las celdas; para que de esta forma no pueda mover los datos manualmente, solamente podrán mover los datos desde el formulario.


Si quieres que te ayude con el proceso que acabo de describirte, envíame tu archivo con tus formularios y lo reviso para ajustar la hoja y las macros.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Lug Barry Lopez” y el título de esta pregunta.

sr dante le acabo de enviar mi archivo

En el correo están los datos para entrar

Te anexo el código actualizado

Sub OcuparDesocuparReservar()
Application.ScreenUpdating = False
Dim celda As Range
Set celda = ActiveCell
If Not celda.Offset(-1) = "" Then
   Select Case celda
      Case ""
         'celda = "DISPONIBLE"
         'celda.Interior.Color = vbGreen
      Case "DISPONIBLE"
         UsClien.Habitacion = celda.Offset(-1)
         Registrado = False
         UsClien.Show
         If Registrado = True Then
            'desprotege hoja
            ActiveSheet.Unprotect "abc"
            celda = "OCUPADA"
            celda.Interior.Color = RojoPálido
            ActiveSheet.Protect "abc"
         End If
      Case "OCUPADA"
         res = InputBox("La habitación está OCUPADA, quieres ponerla como DISPONIBLE" & vbCr & vbCr & _
                        "Captura el número de habitación para confirmar :", "A T E N C I Ó N. SALIDA DE HUESPED")
         If res = "" Then Exit Sub
         If res = Left(celda.Offset(-1), 3) Then
            ActiveSheet.Unprotect "abc"
            'celda = ""
            'celda.Interior.ColorIndex = xlNone
            celda = "DISPONIBLE"
            celda.Interior.Color = vbGreen
            ActiveSheet.Protect "abc"
         Else
            MsgBox "Los números de habitación no corresponden", vbExclamation, "SALIDA"
         End If
   End Select
End If
End Sub

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas