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
 

Leer las respuestas

#1 Héctor Miguel
17/01/2006 - 06:58 | Informe spam
hola, Diana !

... defectos fatales que necesito corregir
... primer problema es que si algun usuario... tiene abiertos otros archivos... y cierra la aplicacion
... se perdieron los displayalerts... cuando el usuario los cierra posteriormente, ya no aparece la ventana
... preguntando si desea guardar los cambios, e inevitablemente pierde todo lo que estuvo modificando en esos archivos...
... Como hago para que los displayalerts del codigo funcionen solo para la aplicacion
... y que cuando esta se cierre, excel recobre su configuracion y pregunte si desea guardar los cambios? [...]



1) cuando una instruccion '<Workbook>.Close' -> cierra el libro que contiene el codigo 'en ejecucion'...
las lineas que 'sigan' a la instruccion del cerrado... -> YA NO SE EJECUTAN :-((
si analizas el codigo expuesto, todas las re/habilitaciones de las alertas -> van despues de la instruccion del 'cerrado' ;)
pero... una vez 'cerrado'... ya no se pueden seguir 'leyendo' las instrucciones en el codigo que... 'ya no esta disponible' :))

2) si el 'proposito' de inhibir las alertas de la aplicacion... es que -simplemente- NO 'pregunte' por guardar los cambios...
-> y forzar a que siempre se guarden [los del libro 'activo' que contiene el codigo]...
no es necesario 'manipular' los displayalerts... -> puedes 'instruir' al codigo para que los guarde con la instruccion '.Close' [p.e.]
-> ActiveWorkbook.Close True o... -> ActiveWorkbook.Close SaveChanges:=True [o False] -?-

3) no me queda muy claro el 'por que' de algunas instrucciones...
-> como el 'Workbook.ReadOnly' <versus> 'ActiveWorkbook.Unprotect'
[que poco, o nada... tiene que ver la proteccion de libro con una apertura en modo 'ReadOnly'] -?-
y [me parece que] existe alguna -ligera- 'confusion' con el uso de los caracteres [VBA]...
[p.e.] para un 'salto de linea' -> un espacio seguido de un guion bajo
que le indican a vba que la linea 'de abajo'... [en realidad] ES LA MISMA que la que contiene el ' _' ;)

4) si [efectivamente] la macro 'guradarcambios' -> tiene 'comentada' la primera instruccion -> 'If ActiveWorkbook.ReadOnly = True Then
-> 'debes' traer un 'error de compilacion'... -> sentencia If... -> SIN un 'End If' -?-

5) si +/- 'intuyo' cual es el objetivo del codigo :)) prueba con un codigo +/- como el siguiente [ya comentaras donde 'le duele'] :D
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
Sheets("inicio").Select: Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: ActiveWorkbook.Close True
End Sub

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
== el codigo 'original' de la exposicion ==> El boton de salida tiene el siguiente codigo:
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 similares