Normalmente la solución sería poner un código en cada hoja, con la contraseña y con el evento que controle si se da el acceso o no...
Con un hipervínculo, Excel te direcciona a la hoja... de esto Excel solo recupera el evento de haber hecho clic en el evento indicando el hipervínculo desde el cual se hizo clic... es un poco difícil así controlar... pero se me ha ocurrido algo..
estoy suponiendo lo siguiente...
1) Si tienes una hoja INDICE (y de hecho en mi macro la he llamado así) que te permita/restrinja el acceso a las otras, las otras tienen que estar ocultas... si no no tendría sentido la restricción, cualquier usuario podría hacer el click directo en las hojas...
Asumo: que la hoja índice se llama INDICE (puedes cambiar en la macro, las dos veces que se hace mención a esa hoja para adecuar a tu archivo).
2) Asumo que has creado los hipervínculos con la herramienta hipervínculo de Excel, por lo tanto, los links están en celdas... no en dibujos
Copia este código en un módulo normal (de los comunes, no los de hoja).
Public Sub gor(d As String)
Range(d).Select
End Sub
y copia este código en el MODULO DE LA HOJA que tengas como INDICE (revisa que en el código figura 2 veces la palabra INDICE, cambia eso a como se llame de verdad tu hoja)
Option Compare Text
Private Sub Worksheet_Activate()
Dim eHoja As Worksheet
For Each eHoja In Worksheets
If eHoja.Name <> "INDICE" Then eHoja.Visible = xlSheetVeryHidden
Next eHoja
End Sub
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Dim clave As String
Dim destino As Worksheet
Dim direc As String
Dim hoja As String
Application.ScreenUpdating = False
clave = Application.InputBox("Necesita introducir la contraseña para acceder a la hoja", "AVISO", , , , , , 2)
DoEvents
If Not (clave = passw(Target.Range)) Then
Sheets("INDICE").Select
MsgBox "Contraseña equivocada", vbCritical, "ERROR"
Else
hoja = Replace(Left(Target.Name, InStr(1, Target.Name, "!") - 1), "'", "")
direc = Mid(Target.Name, InStr(1, Target.Name, "!") + 1)
Sheets(hoja).Visible = xlSheetVisible
Sheets(hoja).Select
gor direc
End If
Application.ScreenUpdating = True
End Sub
Function passw(rango As Range) As String
' Aqui van las contraseña, segun las celdas en donde están los hipervinculos
Select Case Replace(rango.Address, "$", "")
Case "A1"
passw = "hola1"
Case "A2"
passw = "hola2"
Case "A3"
passw = "hola3"
End Select
End Function
En las ultimas lineas pondrás las contraseñas, según la celda en donde se encuentren los hipervinculos.