AYUDA: ¿Se puede hacer esto en Excel?

10/12/2003 - 16:34 por jordi_d | Informe spam
Hola:

Necesito hacer lo siguiente con Excel:

Tengo una hoja que llamo Hoja1 como formulario de entrada de datos y
para visualizar resultados según los datos introducidos.
Y tengo una Hoja2 que contiene todos los cálculos.

¿Es posible que tras introducir los datos en Hoja1, al darle F9 o
ejecutar un proceso, o lo que sea, la Hoja1 envie los datos a la Hoja
2, esta haga los cálculos y los resultados se visualicen en la Hoja1,
PERO con la condicion de que la Hoja2 esté protegida, es decir, nadie
pueda abrirla,o sea, que nadie pueda acceder a ver como están hechos
los cálculos?

Si vinculo la Hoja 1 con la Hoja2 y a ésta le pongo una contraseña, NO
ME VALE, porque al abrir la Hoja1 me dice que está vinculada a la
Hoja2 y para operar me exige que entre la contraseña de la hoja2 y el
usuario no sabrá la contraseña.

(sería como si la hoja2 actuase como una dll, recibe unos datos y
devuelve otros pero nadie puede abrirla)

Y tiene que ser en Excel.

También me valdria que todo estuviera en un mismo Libro. Una hoja con
la entrada de datos y visualización de resultados y otra hoja con los
cálculos. Pero la condición es que la hoja de cálculos sea
inaccesible; es decir, que nadie pueda ver las fórmulas (ni siquiera
mediante copia a otra hoja o metodos parecidos).

Creo que tiene que haber una manera de lograr esto. No puedo creer que
no haya ninguna manera de proteger el acceso o visualización de
formulas de una hoja que no sea poniendo una contraseña de entrada al
Libro. Agradeceré cualquier ayuda.

Gracias y un saludo.

Preguntas similare

Leer las respuestas

#6 Nilo
14/12/2003 - 19:21 | Informe spam
"Héctor Miguel" wrote in
news::

primero que todo [y antes que nada], aprecio tus comentarios y
observaciones :)) =>muy agradecido<=



Yo sí que lo estoy de que los aprecies :))



de las 'fases' de proteccion de excel [creo yo que] la mas 'confiable'
es 'al archivo' [apertura y/o escritura] [no se 'usa' en el ejemplo ni
se comenta -a detalle- en el articulo] =>¿ya 'probaste' el
'rompe-claves' con ella???



Sin duda, pero ten en cuenta que un usario "autorizado" tiene que
tenerla... Imagina que quieres hacer un producto comercial... Imposible no
darla... De hecho, tus rutinas te complican mucho más "el asalto" si te has
llevado el libro a otra máquina. Así que yo parto del supuesto de "un
usuario "autorizado" que quiere instalarle el libro a un amigo sin pasar
por taquilla..." ;)




<= estoy [casi] seguro que 'ese' [primer]
programa que 'revento' la clave del proyecto... NO es 'gratuito'



Pues no lo es, pero seamos lógicos Héctor, cualquiera que intenta
desproteger algo sabe descargar una demo operativa y luego buscar una clave
en la red para liberar su uso... Yo creo que esto lo tendrías que esperar
de cualquiera que lo intentase... ¿no? Así que me temo que el coste será
cero pesos, compadre :(




la unica forma [hasta donde se] de 'manipular' las contraseñas del
proyecto de macros 'por macros', es... usando el metodo 'SendKeys' y
tiene algunos 'otros' requerimientos.




Pues me diste buena pista... creo... no sé... Y es que he seguido jugando
con tu código (de verdad que es un ejemplo a todos los niveles... y ¡cada
linea comentada! Uffff :)) y se presentaron diversos inconvenientes que
paso a comentarte...

El primero es para el caso de que trates de proteger una plantilla (xlt).
El método de los Path me pareció muy rígido y difícil de encajar con un
documento sin nombre, que de momento está en un directorio temporal y aún
cuando lo incluyas en el código, la apertura presenta muchos problemas...
Así que buscando una alternativa recordé que en una ocasión había
encontrado por la red un código para Access que investigaba el numero de
serie de la placa base del equipo... (al fin y al cabo, las licencias son
para UNA máquina y puede interesar que el usuario no pueda replicar
fácilmente la plantilla pero que no importe dónde guarde el documento nuevo
que genera con ella... Por cierto que respecto de esto tengo un tema
pendiente que al final te comento para no desviarnos...)

Que me perdone su autor,- y mi más sincero reconocimiento para él -, pero
no tengo ni idea de cómo lo encontré... supongo que intentando documentar
algún problema. Yo lo único que hice fue adaptarlo un poco para que
funcionase en Excel...

Antes de nada ADVIERTO al personal que si alguien prueba integramente el
código que he modificado, que lo haga SOBRE UNA COPIA del libro y no sobre
el libro original ya que puede que luego tengáis muchas dificultades para
editar el código... ¡El método es un poco bestia! :) y puede que sin
retorno... vosotros diréis... pero creo que a mi me sirve y si alguien da
con un truquillo que le permita llegar al editor de VB que lo comente, por
favor...

También vaya por delante que mis conocimientos de VB son muy limitados y
que seguro que los que sabéis, encontraréis un motón de fallos... Pues si
los comentáis, agradecido estaré...

Este es el código para comprobar el número del PC...

Option Private Module
Option Compare Text
Option Explicit
Declare Function GetVolumeInformation Lib "kernel32" Alias _
"GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal _
lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _
lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String,
ByVal _
nFileSystemNameSize As Long) As Long

Sub NumeroPC()
Dim dblx As Boolean
Dim lpRootPathName As String
Dim lpVolumeNameBuffer As String
Dim nVolumeNameSize As Long
Dim lpVolumeSerialNumber As Long
Dim lpMaximumComponentLength As Long
Dim lpFileSystemFlags As Long
Dim lpFileSystemNameBuffer As String
Dim nFileSystemNameSize As Long
Dim n As Variant

n = GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, _
nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, _
lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize) _

If lpVolumeSerialNumber = 1234567890# Then ' Aqui hay que sustituir
1234567890 por el correcto '
' para averiguarlo ejecutar la macro paso a paso y cuando se cargue '
' la variable lpVolumeSerialNumber posicionando el cursor encima veréis
su valor '
'ok es el mismo equipo no se hace nada
Else
MsgBox ("La estación no está habilitada para ejecutar el
programa..."), vbCritical, "ERROR GRAVE"
LimitarAcceso
End If

End Sub



Así que luego fui a tu código y puse...


Sub ChecarCondiciones() ' Aquí verificamos las condiciones pertinentes '
NumeroPC ' Aqui verificamos si es el PC autorizado :)'
AgregarComando ' Agregamos el comando de *Guardar especial* '
QuitarProtección ' LIBERAMOS el acceso al libro y ... '
End Sub



Ahora el problema es que "el amigo" del usuario autorizado tiene otro amigo
;) que le ha "pasado" un programa rompe claves con un "serial" para usarlo
sin limitación... (¡pues te vas a enterar tu...!:)... Este es el aunténtico
peligro... SEGURO que rompe la contraseña...


Pensando en cómo no dejarle llegar al editor de VB dónde ya tiene tu
plantilla con la contrasela cambiada y la pista del SendKeys que tu me
diste, se me ocurrió añadir la prohibición de usar CUALQUIER herramienta
relacionada con VB así que amplié la lista de esta manera... (dentro de la
Función AtenuarProhibidos)


Case 184, 186, 219, 220, 221, 222, 282, 292, 293, 294, 446, 447,
448, 467, 468, 470, 471, 475, 476, 485, _
488, 548, 642, 797, 847, 848, 855, 865, 866, 889, 890,
891, 893, 894, 896, 928, 943, 1561, 1605, 1695, _
1848, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857,
1858, 2034, 2089, 2186, 3059, 3627, 3631, 30017



Y tomé la decisión de no "reahabilitarlas" (sólo las que tu propusiste pero
no las que yo añadí) mientras el libro permaneciera abierto... Para el caso
de que se cierre, "clone" una de tus funciones con su procedimiento en una
nueva que devuelve el control de todo... si se cierra el libro...

Sub ReHabilitarTodos() ' Macro para *Re-Habilitar* los comandos
*Peligrosos* '
On Error Resume Next ' Por si existiera algún error '
' *Des-Habilitamos* el comando de *Guardar especial* (disponible *sólo* a
este libro '
If Not ThisWorkbook.ReadOnly Then _
Application.CommandBars("File").Controls("Guardar &especial").Visible =
False
' Re-Habilitamos algunas Barras de comandos "especiales" '
Application.CommandBars("Workbook tabs").Enabled = True ' La Barra de las
*pestañas* '
Application.CommandBars("Document").Enabled = True ' La Barra de
*documento* '
Application.CommandBars("Toolbar List").Enabled = True ' La Barra de
*ToolBars* '
' ... y *buscamos* comandos... '
For Each Barra In Application.CommandBars ' en TODAS las barras
(Herramientas ó Menús) '
For Each Comando In Barra.Controls ' Para buscar en TODOS los controles
(Comandos ó Sub-menús) '
Siguiente = RestablecerTodos(Comando) ' Inicia un *bucle* de búsqueda
(a través de la función *recursiva*) '
Next Comando ' *Busca* en el siguiente *botón* '
Next Barra ' y *Busca* en la siguiente Barra de Comandos '
End Sub

Private Function RestablecerTodos(Comando As CommandBarControl) As Integer
On Error Resume Next ' Por si alguno *falla*, que siga adelante '
Siguiente = 0 ' *Inicializa* la variable del *bucle* '
Select Case Comando.Type ' Para *afectar* solo a los controles necesarios
(Comandos ó Menús) '
Case 1, 2, 4, 6, 7, 13, 18 ' Si el control es un botón de comando (que
ejecuta acciones), *Brincarlo* '
Select Case Comando.ID ' Según la *Acción* que realiza ... '
Case 184, 186, 219, 220, 221, 222, 282, 292, 293, 294, 446, 447,
448, 467, 468, 470, 471, 475, 476, 485, _
488, 548, 642, 797, 847, 848, 855, 865, 866, 889, 890,
891, 893, 894, 896, 928, 943, 1561, 1605, 1695, _
1848, 1850, 1851, 1852, 1853, 1854, 1855, 1856, 1857,
1858, 2034, 2089, 2186, 3059, 3627, 3631, 30017 ' Si es de los botones
*Prohibidos* ,,, '
Comando.Enabled = True ' Lo RE-HABILITA '
End Select
Case Else ' Si es un Menú (ó Sub.menú)... '
For Each Contenedor In Comando.Controls ' ... seguir buscando *más
abajo* ... '
Siguiente = Siguiente + RestablecerTodos(Contenedor) ' ... haciendo
una *Re-Llamada* de la función '
Next Contenedor
Siguiente = Siguiente - 1 ' *Regresa* al bucle (en el mismo control)
'
End Select
RestablecerTodos = Siguiente + 1 ' *Regresa* al bucle (*llamada* de la
función, con el *siguiente* control) '
End Function


Luego, en el evento Workbook_BeforeClose añadí la linea...

ReHabilitarTodos

Y ahora sólo quedaba impedir la apertura del editor de VB ya que era obvio
que si lo tenías abierto ANTES de abrir el libro, nada te impediría
usarlo... Y hay vino el SendKeys...

Así que en el evento Workbook_Open incluí las siguientes líneas al
principio de todo...

On Error Resume Next
Application.ScreenUpdating = False
SendKeys "%{F11}" + "%A" + "C", False ' Ir al Editor de VB
Alt+F11 y pulsar Archivo Alt+A Cerrar Alt+C '


Ahora el problema es si tengo que cambiar código ¡ya no sé como hacerlo!
:)) Claro que tengo la plantilla original (sin este código tan radical) y
puedo generar nuevas copias... pero si tuviera que modificar un libro ya en
uso... en principio no se me ocurre como hacerlo... así que por eso decía
"un poco Bestia"...

Además tengo unos "interesantes" :( cracks del Excel que puede que sean por
la versión... aunque no los suelo tener amenudo...)

Suele hacerlo despues de decirle que NO quiero guardar los cambios (que
además me lo pregunta dos veces y no veo por qué)... Y es que también
modifique un poco el evento Workbook_BeforeClose con este código que no
termina de ir fino...

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Not ActiveWorkbook.Saved Then
mensaje = "El Libro ha cambiado... ¿Guardar cambios?"
Estilo = vbYesNo + vbExclamation
Titulo = "Guardar Cambios"
guardacambios = MsgBox(mensaje, Estilo, Titulo)
If Not ThisWorkbook.ReadOnly And guardacambios = vbYes Then ' Si no
está como *Sólo-Lectura* '
GuardarCambios ' *Mandamos* a la macro que graba por código '
' Si existe el comando *especial* ... lo quitamos del entorno ''
If Application.CommandBars("File").Controls(8).Caption = "Guardar
&especial" _
Then Application.CommandBars("File").Controls("Guardar
&especial").Delete (True)
End If ' ... y preparamos el libro para *cerrarlo* ... '
ThisWorkbook.Saved = True ' Establecemos el libro como *Guardado* '
ReHabilitarTodos
DetenerLoopDeEventos ' Cancela el bucle de *Re-Activación* de los
evenots '
ThisWorkbook.Close ' ... y CIERRA el libro '
Else
ReHabilitarTodos
DetenerLoopDeEventos
ThisWorkbook.Close
End If
End Sub


La última cosa que antes comenté que me queda pendiente es ver una manera
de que, cuando el libro es nuevo, te deje darle un nombre antes de nada y
lo guarde... tenemos deshabilitado el "guardar como" así que esto es un
problema...

Bueno, me ha salido un poco largo... así que corto ya...

Un saludo,
Nilo
Respuesta Responder a este mensaje
#7 Nilo
14/12/2003 - 20:10 | Informe spam
Nilo wrote in
news::

Ahora el problema es si tengo que cambiar código ¡ya no sé como
hacerlo!





Me contesto a mi mismo porque YA encontré como entrar... y bastante
sencillo... no había pensado en ello...:((

No lo diré para no dar pistas pero creo que hay que buscar otro método...

¿Existe alguna colección de comandos para controlar el Editor de VB?...
porque si no lo veo difícil...
Respuesta Responder a este mensaje
#8 jordi_d
17/12/2003 - 12:27 | Informe spam
Hola Hector !

Muchas gracias por tu respuesta.
He estado unos dias indispuesto y no he podido revisar las noticias.
Acabo de ver tu proyecto y parece muy, muy currado.
Voy a leermelo muy detenidamente, pues seguro que solucionará todas
mis dudas. Muchas gracias por tan magnífico trabajo.

Lo del reply de mi correo es un problema de yahoo que lleva tres de
semanas que funciona de pena. Lamento las molestías.

Saludos

Jordi


On Fri, 12 Dec 2003 17:16:37 -0600, "Héctor Miguel"
wrote:

hola, Daniel !
hola Jordi !

jordi: contestando a tu correo... se 'devolvio' mi mensaje :((
el articulo sobre el proyecto que comenta daniel, lo puedes revisar en:
http://www.sistemaslym.net/vba/excel/exarc1.html

si cualquier duda... ¿comentas?

saludos,
hector.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida