problemas con una aplicación en excel y VBA

16/01/2006 - 20:24 por Diana | Informe spam
Hola queridos amigos del foro!
Hice una aplicación completa en excel y código VBA con menú personalizado
(gracias a algunos "pulidos" que le dieron los maestros Héctor Miguel y KL
cuando oportunamente hice algunas preguntas en el foro).
La aplicación funciona muy bien pero tiene tres defectos fatales que
necesito corregir. Empezaré por la primer falla y las demás las haré en
otras consultas para no atosigar.
El primer problema es que si algún usuario que está usando la aplicación
tiene abiertos otros archivos de excel al mismo tiempo y cierra la
aplicación, en los archivos de excel que quedaron abiertos se perdieron los
displayalerts, o sea que cuando el usuario los cierra posteriormente, ya no
aparece la ventana preguntando si desea guardar los cambios, e
inavetiblemente pierde todo lo que estuvo modificando en esos archivos. En
algunos casos los ususarios tienen que resetear la PC para que excel vuelva
a funcionar correctamente.
¿Cómo hago para que los displayalerts del código funcionen sólo para la
aplicación, y que cuando ésta se cierre, excel recobre su configuración y
pregunte si desea guardar los cambios? Gracias por la ayuda.

El botón de salida tiene el siguiente código:
Sub salida()
ActiveSheet.Select
If ActiveSheet.Name = "COMENTARIOS" Then
MsgBox ("Seleccione el comando Guardar Comentarios para cerrar esta hoja"),
vbCritical
ElseIf ActiveWorkbook.ReadOnly = True Then
guardarcambios
Else
Sheets("inicio").Select
Application.ScreenUpdating = False
Dim opciones As Variant
opciones = MsgBox("¿Desea salir de la aplicación?", vbYesNo)
If opciones = vbYes Then
ActiveWorkbook.Unprotect
ActiveWorkbook.Save
Application.DisplayAlerts = False
Application.DisplayFullScreen = False
Sheets("INICIO").Select
Range("d10").Select
If Workbooks.Count > 1 _
Then ActiveWorkbook.Close
Application.DisplayAlerts = True
Else: Application.Quit

End If
End If
End Sub
Sub guardarcambios()
'If ActiveWorkbook.ReadOnly = True Then
ActiveWorkbook.Unprotect
Application.DisplayAlerts = False
Application.DisplayFullScreen = False
If Workbooks.Count > 1 _
Then ActiveWorkbook.Close
Application.DisplayAlerts = True
Else: Application.Quit
End Sub

Preguntas similare

Leer las respuestas

#6 Diana
19/01/2006 - 17:38 | Informe spam
Hola Héctor!
Incorporé a mi aplicación el último código que me enviaste.
Lamentablemente pasa algo extraño en el modo lectura. Hice 12 pruebas en 3
distintas terminales de usuarios que estamos en red (teniendo yo la
aplicación abierta como usuario principal y ellos en modo lectura.No todos
abiertos a la vez sino yo como usuario principal y una terminal en modo
lectura por vez. En total fueron 12 pruebas).
De esas 12 pruebas, en la mayoría el cierre anduvo perfecto pero varias
veces volvió a repertirse que al cerrar en modo lectura se abrió la ventana
de "guardar como" y al cancelarla se abrió el displayalert "Desea guardar
los cambios?". Me resulta extraño que a veces funcione bien y otras no.
Mi cierre como primer usuario anduvo perfecto.
Se te ocurre alguna sugerencia?
Gracias,
Diana

"Héctor Miguel" escribió en el mensaje
news:
hola, Diana !

Ya averigue la respuesta probando tu codigo modificado y aprendi que:
ActiveWorkbook.Close True guarda los cambios.
El unico defecto es que en modo lectura, al cerrar la aplicacion abre la
ventana de "guardar como"
cancelando esta ventana sale el displayalert "Desea guardar los cambios?"
Como hago para que en tu codigo modificado se apliquen las instrucciones
para el modo readonly:
activeworkbook.unprotect
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: ActiveWorkbook.Close False
y no muestre ningun displayalert?



[no lo he probado :-( pero... intenta con algo +/- como lo
siguiente]...
Sub Salida()
If LCase(ActiveSheet.Name) = "comentarios" Then MsgBox _
"Seleccione el comando Guardar Comentarios para cerrar esta hoja",
vbCritical: Exit Sub
If MsgBox("¿Desea salir de la aplicación?", vbYesNo) = vbNo Then Exit Sub
With ActiveWorkbook: .Unprotect
If Not .ReadOnly Then Sheets("inicio").Select: Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: .Close SaveChanges:=Not
.ReadOnly
End With
End Sub

si cualquier 'falla'... comentas ?
saludos,
hector.

Respuesta Responder a este mensaje
#7 Héctor Miguel
19/01/2006 - 23:09 | Informe spam
hola, Diana !

... en el modo lectura... en 3 distintas terminales... yo como usuario principal y una terminal en modo lectura por vez... 12 pruebas
... en la mayoria el cierre anduvo perfecto pero varias veces... al cerrar en modo lectura se abrio la ventana de "guardar como"
y al cancelarla se abrió el displayalert "Desea guardar los cambios?". Me resulta extra#o que a veces funcione bien y otras no...



despues de realizar algunas pruebas con el uso y reporte de la propiedad [Not] '.ReadOnly' -todas 'sin falla'- :))
me da la impresion de que el codigo [real/total/completo/...] que usas, es 'ligeramente' mas... complicado ? -?-
es probable que se necesite 'detectar/monitorear/...' otras circunstancias/eventualidades/acciones/codigos/'momentos'/... -?-
[lo anterior, debido a tu comentario de que 'a veces fuciona bien... y otras no funciona'] -?-

comentas [si sale] algun detalle adicional ?
saludos,
hector.
Respuesta Responder a este mensaje
#8 Diana
23/01/2006 - 19:15 | Informe spam
Hola Héctor,

Hoy hice más de veinte pruebas en las mismas tres terminales.
Quizá sea un problema como tú dices de que el código es mucho más complejo.
Lo que me llamó la atención hoy es que (siempre en modo lectura) dos
terminales no fallaron nunca. La que siempre falló es la mía con los errores
que te describí en el mail anterior (se abre la ventana "guardar como" y al
cancelar se abre el displayalert "Desea guardar los cambios?").
Antes de pensar en el resto del código, puede ser que falte configurar algo
en mi PC (desde Herramientas - Opciones por ejemplo) o es mera casualidad?
Gracias Héctor.



"Héctor Miguel" escribió en el mensaje
news:
hola, Diana !

... en el modo lectura... en 3 distintas terminales... yo como usuario
principal y una terminal en modo lectura por vez... 12 pruebas
... en la mayoria el cierre anduvo perfecto pero varias veces... al
cerrar en modo lectura se abrio la ventana de "guardar como"
y al cancelarla se abrió el displayalert "Desea guardar los cambios?". Me
resulta extra#o que a veces funcione bien y otras no...



despues de realizar algunas pruebas con el uso y reporte de la propiedad
[Not] '.ReadOnly' -todas 'sin falla'- :))
me da la impresion de que el codigo [real/total/completo/...] que usas, es
'ligeramente' mas... complicado ? -?-
es probable que se necesite 'detectar/monitorear/...' otras
circunstancias/eventualidades/acciones/codigos/'momentos'/... -?-
[lo anterior, debido a tu comentario de que 'a veces fuciona bien... y
otras no funciona'] -?-

comentas [si sale] algun detalle adicional ?
saludos,
hector.

Respuesta Responder a este mensaje
#9 Héctor Miguel
24/01/2006 - 06:20 | Informe spam
hola, Diana !

... encontre el motivo de la falla... analizando por que fallaba solo en mi PC
... yo no tenia abierto otro archivo de excel y los otros dos usuarios si. Por lo tanto en el codigo...
If LCase(ActiveSheet.Name) = "comentarios" Then MsgBox _
"Seleccione el comando Guardar Comentarios para cerrar esta hoja", vbCritical: Exit Sub
If MsgBox("¿Desea salir de la aplicación?", vbYesNo) = vbNo Then Exit Sub
With ActiveWorkbook: .Unprotect
If Not .ReadOnly Then Sheets("inicio").Select: Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: .Close SaveChanges:=Not .ReadOnly
End With
... la instruccion... viene despues de "Application.quit", no se cumplia
... que me digas primero si mi razonamiento es valido y segundo: como se modifica para que la instruccion
... se cumpla antes de 'If Workbooks.Count=1 Then Application.Quit.
Adivino que se puede lograr solo escribiendo esa instruccion antes de 'If workbooks.Count..'



1) tu razonamiento es correcto ;) y el 'comportamiento' [cuando SOLO esta abierto 'ese' libro] se debe a:
a) la instruccion 'Application.Quit'... [todavia] NO 'sabe' cual es el metodo/modo/... como quieres [o no] 'guardar cambios' :))
b) por lo tanto... [primero] 'busca' que cambios ha/n 'sufrido' el [o los] libro/s abierto/s -> QUE NO HAN SIDO 'salvados' ;)
c) y [en 'consecuencia']... lanza el 'temido' mensaje de alerta [y la alternativa de guardar bajo otro nombre el libro '.ReadOnly'] :\

2) una alternativa es usando una instruccion [efectivamente] ANTES del -> If Workbooks.Count...
para 'truquear' su busqueda por 'cambios NO salvados' y -medio- 'enga#arlo' diciendole que los cambios YA se han 'salvados' :))

3) cambia las instrucciones +/- como en el ejemplo siguiente...
If LCase(ActiveSheet.Name) = "comentarios" Then MsgBox _
"Seleccione el comando Guardar Comentarios para cerrar esta hoja", vbCritical: Exit Sub
If MsgBox("¿Desea salir de la aplicación?", vbYesNo) = vbNo Then Exit Sub
With ActiveWorkbook: .Unprotect: .Saved = .ReadOnly
If Not .ReadOnly Then Sheets("inicio").Select: Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: .Close SaveChanges:=Not .Saved
End With

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#10 Diana
25/01/2006 - 16:02 | Informe spam
Gracias Héctor!
Ya incorporé tu última versión del código.
Con tu nueva modificación ahora el cierre de la aplicación funciona perfecto
sin importar si el usuario está o no en modo lectura y si tiene abiertos o
no otros archivos de excel. Muchas gracias de nuevo.
Si no te incomoda, te hago la última pregunta sobre las fallas que tiene la
aplicación. Con ésta creo que ya doy el tema fallas por concluído.
Esta pregunta creo que sí debe tener que ver con la configuración de las PC
de los usuarios y no con el código.
Cuando se abre la aplicación, en la hoja de inicio se cargan dos objetos
Shockwave flash que son los logos de la empresa.
Yo los configuré para que se carguen de la siguiente manera:
Con la barra de herramientas "Cuadro de controles", en modo diseño, botón
derecho - propiedades - movie: acá figura la ruta de donde se cargan.
Siempre funcionó bien cuando éramos tres usuarios los que utilizábamos la
aplicación, o sea, cualquiera de nosotros abríamos la aplicación y los logos
se cargaban y se veían girando.
Hace un mes, cuando se agregaron tres nuevos usuarios en el uso de la
aplicación, detecté que dos de ellos, cuando la abren,
"borran" los objetos shockwaveflash, 'literalmente' borran los logos y ya no
aparecen más. Sus excel borran la ruta que estaba cargada en movie de
propiedades del objeto.
Yo miré la configuración de los excel de estos usuarios y "aparentemente"
están igual que los demás. Además la aplicación tiene el cargado el
complemento de flash en visual.
Qué tengo que revisar en el excel de estos dos usuarios para ver por qué no
cargan estos objetos y borran la ruta que ya está establecida?
Muchas gracias y saludos,
Diana

"Héctor Miguel" escribió en el mensaje
news:
hola, Diana !

... encontre el motivo de la falla... analizando por que fallaba solo en
mi PC
... yo no tenia abierto otro archivo de excel y los otros dos usuarios
si. Por lo tanto en el codigo...
If LCase(ActiveSheet.Name) = "comentarios" Then MsgBox _
"Seleccione el comando Guardar Comentarios para cerrar esta hoja",
vbCritical: Exit Sub
If MsgBox("¿Desea salir de la aplicación?", vbYesNo) = vbNo Then Exit
Sub
With ActiveWorkbook: .Unprotect
If Not .ReadOnly Then Sheets("inicio").Select: Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: .Close SaveChanges:=Not
.ReadOnly
End With
... la instruccion... viene despues de "Application.quit", no se cumplia
... que me digas primero si mi razonamiento es valido y segundo: como se
modifica para que la instruccion
... se cumpla antes de 'If Workbooks.Count=1 Then Application.Quit.
Adivino que se puede lograr solo escribiendo esa instruccion antes de 'If
workbooks.Count..'



1) tu razonamiento es correcto ;) y el 'comportamiento' [cuando SOLO
esta abierto 'ese' libro] se debe a:
a) la instruccion 'Application.Quit'... [todavia] NO 'sabe' cual es el
metodo/modo/... como quieres [o no] 'guardar cambios' :))
b) por lo tanto... [primero] 'busca' que cambios ha/n 'sufrido' el [o
los] libro/s abierto/s -> QUE NO HAN SIDO 'salvados' ;)
c) y [en 'consecuencia']... lanza el 'temido' mensaje de alerta [y la
alternativa de guardar bajo otro nombre el libro '.ReadOnly'] :\

2) una alternativa es usando una instruccion [efectivamente] ANTES del ->
If Workbooks.Count...
para 'truquear' su busqueda por 'cambios NO salvados' y -medio-
'enga#arlo' diciendole que los cambios YA se han 'salvados' :))

3) cambia las instrucciones +/- como en el ejemplo siguiente...
If LCase(ActiveSheet.Name) = "comentarios" Then MsgBox _
"Seleccione el comando Guardar Comentarios para cerrar esta hoja",
vbCritical: Exit Sub
If MsgBox("¿Desea salir de la aplicación?", vbYesNo) = vbNo Then Exit Sub
With ActiveWorkbook: .Unprotect: .Saved = .ReadOnly
If Not .ReadOnly Then Sheets("inicio").Select: Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: .Close SaveChanges:=Not .Saved
End With

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida