UseForm --> ocultación de libro

Hola Valedor.
Tengo un problema con un libro en el que, al abrirse, se carga un UseForm, en el que solicita un nombre de usuario y un password, y permanece invisible el libro en cuestión. Cuando el usuario introduce correctamente el nombre de usuario y el password, y después de darle al botón de ACEPTAR, desaparece el formulario, y aparece el libro de excel (supongamos que se llama Prueba.xls).
Hasta aquí, todo perfecto, puesto que en el código he puesto lo siguiente para que se aparezca el libro:
Windows("Prueba.xls").Visible = True
El problema me surge en el caso de que el usuario le cambie el nombre al libro. En tal caso no se haría visible, puesto que Prueba no existe.
Si en cambio pongo el siguiente código, sin referirme directamente a su nombre, me surge otro problema:
Windows(1).Visible = True
El problema es que si el usuario tiene abierto otro libro, antes de abrir Prueba.xls, y no cierra aquel, entonces no hace visible el libro este último libro,
que es el que interesa que se haga visible.
Miles de gracias, genio.

1 respuesta

Respuesta
1
La respuesta es usar la referencia al libro ThisWorkbook de esta manera, tenga el nombre que tenga el libro, siempre funcionara, yo lo hice de la siguiente manera, no es estrictamente necesario usar un UserForm, pero te muestro las dos maneras...
Primero: sin un UserForm, todo el código va en el evento Open del libro en cuestión, el cual quedaría así...
Private Sub Workbook_Open()
Dim co1 As Integer
Dim strContra As String
'Si esta visible la ventana la ocultamos
If Windows(ThisWorkbook.Name).Visible Then
Windows(ThisWorkbook.Name).Visible = False
End If
'Damos tres intentos de introducción de contraseña
For co1 = 1 To 3
'Solicitamos la contraseña
strContra = Trim(InputBox("Introduce la contraseña", "Constraseña"))
'Verificamos que sea la correcta
If strContra <> "abrete" Then
'Si no es le informamos al usuario
MsgBox "Contraseña incorrecta..."
Else
'Si es correcta salimos del ciclo
Exit For
End If
Next co1
'Si co1=4 se agotaron los intentos
If co1 = 4 Then
'Establecemos como guardado
ThisWorkbook.Saved = True
'Cerramos el libro
ThisWorkbook.Close
End If
'Si NO esta visible la ventana la mostramos
If Not Windows(ThisWorkbook.Name).Visible Then
Windows(ThisWorkbook.Name).Visible = True
End If
End Sub
Segunda: esta es con el uso de un UserForm, el código es prácticamente el mismo, pero ahora lo hacemos en el UserForm, estoy considerando que tenemos una caja de texto que se llama TextBox1 y un botón de comando CommandButton1
'Seguimos usando el evento Open del libro
Private Sub Workbook_Open()
'Si esta visible la ventana la ocultamos
If Windows(ThisWorkbook.Name).Visible Then
Windows(ThisWorkbook.Name).Visible = False
End If
'Mostramos el formulario donde pedimos la contraseña
UserForm1.Show
'Si NO esta visible la ventana la mostramos
If Not Windows(ThisWorkbook.Name).Visible Then
Windows(ThisWorkbook.Name).Visible = True
End If
End Sub
'Este código va dentro del UserForm
Option Explicit
Private Sub CommandButton1_Click()
Dim strContra As String
Static co1 As Integer
Const intIntentos As Integer = 3
'Solicitamos la contraseña
strContra = Trim(TextBox1.Text)
'Evaluamos que sea la correcta
If strContra <> "abrete" Then
'Notificamos que es incorrect
MsgBox "Contraseña invalida", vbInformation, "Error"
'Aumentamos el contador de intentos
co1 = co1 + 1
'Verificamo si llego al limite de intentos
If co1 = intIntentos Then
ThisWorkbook.Saved = True
'Cerramos el libro
ThisWorkbook.Close
End If
Else
'Si es correcta cerramos el UserForm
Unload Me
MsgBox "Bienvenido..."
End If
End Sub
Private Sub TextBox1_Enter()
'Con este código seleccionamos todo el texto al recibir el foco
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Con este código evitamos que el usuario cierre el UserForm
If CloseMode <> 1 Then
Cancel = True
End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas