Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Formulario no cierra con "X" pero...

134 views
Skip to first unread message

GRIEGO59

unread,
Jan 21, 2008, 2:16:00 AM1/21/08
to
Hola!
Tengo un formulario "Ventas" que no se cierra con "X", sino con un botón
"cerrar".
Con estos codigos que no se exactamente como funcionan:
Option Explicit
Private Sub cmdCerrar_Click()
Unload Me 'para cerrar el formulario
ActiveWorkbook.Save 'para grabar antes de cerrar el libro
ActiveWorkbook.Close 'para cerrar el libro al cerrar el formulario
End Sub

Private Sub UserForm_QueryClose(cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then
MsgBox "Use el botón CERRAR del formulario", vbInformation, " Botón No
Disponible "
cancel = 1
CloseMode = 1
End If
End Sub

y en un módulo:
Sub Auto_open()
Load Clientes
Ventas.Show
End Sub

Me pareció bien que el formulario se activa automáticamente al abrir el
libro y al cerrar el formulario, se cierra tambien el libro de excel, de esta
forma el usuario tiene menos oportunidad de distraerse con la información de
las hojas.

Lo único malo es que al abrir el libro si no se habilitan las macros el
usuario tiene acceso a la información del libro, y si se habilitaran las
macros automáticamente al abrir el libro, entonces como podría luego yo tener
acceso a la información del libro.

Todas las hojas están protegidas y se protegen y desprotegen según las macros.

Si oculto las hojas, luego pueden mostrarse libremente por el usuario.

Darío

Héctor Miguel

unread,
Jan 22, 2008, 12:17:25 AM1/22/08
to
hola, Darío !

__ 1 __
> Tengo un formulario "Ventas" que no se cierra con "X", sino con un boton "cerrar"...
> ... el formulario se activa... al abrir el libro y al cerrar el formulario, se cierra tambien el libro
> ... de esta forma el usuario tiene menos oportunidad de distraerse con la informacion de las hojas.
> Lo unico malo es que al abrir el libro si no se habilitan las macros el usuario tiene acceso a la informacion del libro
__ 2 __
> y si se habilitaran las macros... al abrir el libro, entonces como podria... yo tener acceso a la informacion del libro.
__ 3 __
> Todas las hojas estan protegidas y se protegen y desprotegen segun las macros.


> Si oculto las hojas, luego pueden mostrarse libremente por el usuario.

1) lo usual (y mas recomendado) en estos casos es tener una "primera hoja" como presentacion (en caso de "no macros")
que se oculte en el evento '_open' de tu libro y quede a la vista la hoja que consideres apropiada (ademas)...
es obligado bloquear la visualizacion de tu proyecto de macros (vba) y asignarle una clave (de esta forma)...

2) puedes mantener pulsada la tecla {shift/mayusc} al momento de aprobar el uso de macros y hasta que se abra tu libro
este paso omite la ejecucion de macros y eventos de apertura, con lo que el formulario no debera aparecer
y ya que tu conoces la clave de tu proyecto de macros... ;)

3) para que las hojas ocultas queden "fuera del alcance" de los usuarios, procura ocultarlas (por codigo)
-> estableciendo su propiedad "Visible" como xlSheetVeryHidden (no aparecen en los menus para mostrar hoajs ocultas)
(obviamente) no es infalible... (pero se espera que pueda desesperanzar a usuarios "comunes" y quiza medio-avanzados)...

OJO: asegurate tambien de que al guardar el libro ocultas todas las hojas y solo queda visible "la de pantalla"
(para el siguiente open) y de que el usuario no pueda hacer acciones de guardar o guardar como (por si las dudas)

saludos,
hector.


GRIEGO59

unread,
Jan 27, 2008, 11:23:00 PM1/27/08
to
Hola Hector Miguel!
Mil gracias por tu ayuda.


> 1) lo usual (y mas recomendado) en estos casos es tener una "primera hoja" como presentacion (en caso de "no macros")
> que se oculte en el evento '_open' de tu libro y quede a la vista la hoja que consideres apropiada (ademas)...
> es obligado bloquear la visualizacion de tu proyecto de macros (vba) y asignarle una clave (de esta forma)...

Podrías decirme, por favor, como haría para/que significa que la hoja de
presentación se oculte en el evento "open"?


> OJO: asegurate tambien de que al guardar el libro ocultas todas las hojas y solo queda visible "la de pantalla"
> (para el siguiente open) y de que el usuario no pueda hacer acciones de guardar o guardar como (por si las dudas)

Podrías decirme, por favor, como evitar que el usuario pueda hacer estas
acciones de guardar o guardar como, y si se pueden evitar otras acciones del
menú herramientas-opciones como listas personalizadas, ocultar y mostrar
barras de desplazamiento horizontal y vertical, encabezados de filas y
columnas?

Saludos desde Venezuela
Darío

Ivan

unread,
Jan 28, 2008, 5:49:59 AM1/28/08
to
> Podrías decirme, por favor, como evitar que el usuario pueda hacer estas
> acciones de guardar o guardar como, y si se pueden evitar  otras acciones del
> menú herramientas-opciones como listas personalizadas, ocultar y mostrar
> barras de desplazamiento horizontal y vertical, encabezados de filas y
> columnas?


hola Darío

mientras vuelve Hector, que por su 'infrecuente infrecuencia' me da la
impresion debe de andar liadillo, mira a ver si te vale algo de esto,
que ademas en gran medida es obra suya,

Y al menos te ira sonando cuando el vuelva=>

http://tinyurl.com/3asmtn

http://tinyurl.com/2ugcbc

espero te ayude

un saludo
Ivan


GRIEGO59

unread,
Jan 28, 2008, 6:54:01 AM1/28/08
to
Gracias por tu ayuda Ivan


> hola Darío
> mientras vuelve Hector, que por su 'infrecuente infrecuencia' me da la impresion debe de andar liadillo, mira a ver si te vale algo de esto,
> que ademas en gran medida es obra suya,
> Y al menos te ira sonando cuando el vuelva=>
> http://tinyurl.com/3asmtn
> http://tinyurl.com/2ugcbc
> espero te ayude

De las alternativas presentadas, la que mejor se adapta a mi ignorancia es
esta:

Complementariamente (y para NO "perjudicar" la interacción con el usuario)
puedes usar los eventos "WindowActivate" y
"WindowDeactivate" del objeto "ThisWorkbook" para que, los comandos queden
inhabilitados "solamente" cuando la ventana
"activa" sea "el libro".

Private Sub Workbook_WindowActivate(ByVal Wn As Window)

DesHabilitarComandos

End Sub
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)

ReHabilitarComandos

End Sub

Yo copié el código y lo pegué en la hoja de código que se abre al hacer
click en ThisWorkbook.
Pero al abrir el libro me dá este:

"Error de compilación, no seha definido sub o function"

y sobre salta esta parte del código:

Private Sub Workbook_WindowActivate(ByVal Wn As Window)

DesHabilitarComandos

Supongo que estoy haciendo algo mal. Podrías decirme, por favor, que estoy
haciendo mal?

Saludos
Darío

GRIEGO59

unread,
Jan 28, 2008, 8:08:00 AM1/28/08
to
> hola Darío
>
> mientras vuelve Hector, que por su 'infrecuente infrecuencia' me da la
> impresion debe de andar liadillo, mira a ver si te vale algo de esto,
> que ademas en gran medida es obra suya,
>
> Y al menos te ira sonando cuando el vuelva=>
>
> http://tinyurl.com/3asmtn
>
> http://tinyurl.com/2ugcbc

También me gustó los códigos para evitar copias no autorizadas:

'Muestra el serial del disco duro para escribirlo en el código en ThisWorkBook
Sub ShowSerial()
Dim fs, d
Set fs = CreateObject("Scripting.FileSystemObject")
Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName("c:\")))
MsgBox d.serialnumber
End Sub


'En ThisWorkBook Cierra el libro si el serial no coincide
Private Sub Workbook_Open()
Dim fs, d
Set fs = CreateObject("Scripting.FileSystemObject")
Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName("c:\")))
If d.serialnumber <> -455497706 Then:
End
Application.Quit
End Sub

Pero siempre se cierra mi libro. No sé si tiene que ver el signo (-) delante
del serial.
Ya intenté sin escribir el (-) y usando el (-) del panel numérico y del
alfabético del teclado.

Que estoy haciendo mal?

Saludos

Darío

Ivan

unread,
Jan 28, 2008, 4:23:24 PM1/28/08
to
hola Dario,

> Pero siempre se cierra mi libro. No sé si tiene que ver el signo (-) delante
> del serial.

aunque creo que ya anda de nuevo por aqui Hector y una vez mas solo
para que vayas viendolo echale un ojo a las posibilidades que ves
abajo, obra de ....... quien va a ser, je, je,..

de todas formas, sin querer hablar mucho pues no lo tengo muy claro,
me da la impresion de que el uso de 'End' no es demasiado
recomendable. Posiblemente en ese punto deberias asegurarte de que se
cumplen las condiciones que hector te comenttaba a la hora de cerrar
el libo y cerrarlo con close, aun mas si luego te vas a '(des)cargar'
la aplicacion 'Excel' (ojo con los posibles destrozos a un posible
usuario 'torpe' pero no mal intencionado, creo que podrias hacerle una
picia si tiene otros libros abiertos sin guardar)

bueno, este es otro extracto de HM para obtener 'los' nros de serie:

'''****************************extracto respuesta de Hector Miguel
*******

hola, José !


> ... el codigo de Marco Barbosa... me arroja el numero: "1691898342"
> ... el codigo de Fernando Arroyo... me da un numero distinto... "3JV1K32T"
> Cual es el correcto ? Porque obtengo datos diferentes" [...]


1) la informacion que necesitas la puedes encontrar en la MSDN / SDK
[que por cierto...
es mas amplia y basta que...] :D
visita como 'punto de arranque'... -> <A HREF="HTTP: 2mros"
target='"_blank">http://tinyurl.com/2mros [ademas de que
existen bastantes sitios con llamadas a las API's] ;)
[ahi podras consultar/obtener/probar/... con otro tipo de
propiedads para cada 'tipo'
de informacion]
[probablemente] tambien encontraras la -posible- 'causa' de los
errores, ya que los
WMI 'requieren' Win_NT/2000/XP :-(
2) el serial que devuelve la funcion que utliza WMI [Windows
Management Instrumentation]
-al navegar por la info anterior veras que...-
ES el numero con el cual ->el fabricante<- ha
'etiquetado' [fisicamente] la unidad
de almacenamiento [HD]
es decir... es el unico y 'verdadero' numero de serie: D
3) el serial que devuelve ->cualquier otro metodo/procedimiento/
llamada/API/...'<-
NO es 'permanente' -?-
es decir... cambia por cada vez que la unidad de almacenamiento 'pasa'
por un proceso
de 'preparacion' ->se le da formato<-: D
4) aunque se que sera mas que 'suficiente' informacion [NO la que te
'proveo' en este
mensaje, sino la que existe en la MSDN/SDK] :))
haz unas pruebas con los siguientes codigos de ejemplo ;)

si cualquier duda... comentas?
saludos,
hector.

'''===== en un modulo de codigo 'normal' ===


Sub Unidad_Fisica()
' como 've' las unidades una pc con windows_NT/2000/XP como SO '
Dim Disco As Object
With GetObject("WinMgmts:")
For Each Disco In .InstancesOf("Win32_DiskDrive")
MsgBox "Serie decimal: " & Disco.Signature & vbCr & _
"Serie Hexadecimal: " & Hex(Disco.Signature) & vbCr & _
"Fabricante: " & Disco.Manufacturer & vbCr & _
"Tipo de medio: " & StrConv(Disco.MediaType, vbProperCase) &
vbCr & _
"Modelo: " & Disco.Model & vbCr & _
"Nombre: " & Disco.Name & vbCr & _
"Identificador: " & Disco.Signature
Next
End With
End Sub

Sub Unidad_Logica()
' por cada unidad logica '
Dim Disco As Object
With GetObject("WinMgmts:")
For Each Disco In .InstancesOf("Win32_LogicalDisk")
MsgBox "Unidad disco: " & Disco.Name & vbCr & _
"Serie logica: " & Disco.VolumeSerialNumber
Next
End With
End Sub


Sub Medio_Fisico()
' la 'etiqueta' que le pone el fabricante =>NO cambia<= al re/
formatear unidades '
Dim Disco As Object
With GetObject("WinMgmts:")
For Each Disco In .InstancesOf("Win32_PhysicalMedia")
MsgBox "Serie Fabrica: " &
Application.Trim(Disco.SerialNumber)
Next
End With
End Sub

Sub NumeroDeSerie()
' mismo numero de serie que Win32_LogicalDisk '
With CreateObject("Scripting.FileSystemObject")
MsgBox .GetDrive(.GetDriveName("C:")).SerialNumber & vbCr & _
Hex(.Drives.Item("C:").SerialNumber)
End With
End Sub

''*************************************

en cuanto a las otras dudas croe que sera mejor que se encargue el
propio Hectro. (para no liarte)

un saludo
Ivan

Héctor Miguel

unread,
Jan 28, 2008, 10:28:29 PM1/28/08
to
hola, Darío !

> Private Sub Workbook_WindowActivate(ByVal Wn As Window)
> DesHabilitarComandos
> End Sub
> Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
> ReHabilitarComandos
> End Sub
>

> ... copie el codigo y lo pegue en la hoja de codigo que se abre al hacer click en ThisWorkbook.
> Pero al abrir el libro me da este: "Error de compilacion, no seha definido sub o function"
> y sobre salta esta parte del codigo:


> Private Sub Workbook_WindowActivate(ByVal Wn As Window)
> DesHabilitarComandos
>

> Supongo que estoy haciendo algo mal...

solo te hace falta definir (copiar/pegar) los procedimientos a que hacen referencia los eventos
-> DesHabilitarComandos
-> ReHabilitarComandos
mismos que se espera encontrar (de preferencia) en un modulo de codigo estandar/general/normal/... :D

saludos,
hector.


Héctor Miguel

unread,
Jan 28, 2008, 11:21:38 PM1/28/08
to
hola, Darío !

> 'En ThisWorkBook Cierra el libro si el serial no coincide
> Private Sub Workbook_Open()
> Dim fs, d
> Set fs = CreateObject("Scripting.FileSystemObject")
> Set d = fs.GetDrive(fs.GetDriveName(fs.GetAbsolutePathName("c:\")))
> If d.serialnumber <> -455497706 Then:
> End
> Application.Quit
> End Sub
>

> Pero siempre se cierra mi libro. No se si tiene que ver el signo (-) delante del serial.
> Ya intente sin escribir el (-) y usando el (-) del panel numerico y del alfabetico del teclado.
> Que estoy haciendo mal?

(aparentemente) de donde (o como) copiaste el codigo, le hace falta completar instrucciones (If...End If) -?-
si ya estas seguro que el numero del serial "valido" es -455497707 (incluyendo el "menos" al inicio)...
prueba modificando la instruccion en el evento '_open' de tu libro +/- a lo siguiente:

Private Sub Workbook_Open()
With CreateObject("scripting.filesystemobject")
If .GetDrive(.GetDriveName("c:")).SerialNumber _
<> -455497707 Then ThisWorkbook.Close False
End With
End Sub

saludos,
hector.


0 new messages