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

#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
Respuesta Responder a este mensaje
#2 Diana
18/01/2006 - 02:27 | Informe spam
Hola Héctor!
Gracias por responderme y ayudarme.
1) Tienes razón!! No me había percatado que las estaba colocando después de
cerrar y por eso no me se ejecutaba el Displayalerts= True.

2) Nuevamente tienes mucha razón! tampoco me había percatado que no
necesitaba manipular los displayalerts. Como tú dices sólo insertando la
instrucción ActiveWorkbook.Close SaveChanges:=True me evito que aparezca la
pregunta de excel
que estaba tratando de esquivar "Desea guardar los cambios ?"

3)Con respecto al guión bajo, no lo llames confusión, llámalo desprolijidad.
En realidad cuando armé el código, por ganar tiempo copié y pegué de otros
que había hecho y me despreocupé de emprolijarlo. Grave error y pido perdón
por eso!
El ActiveWorkbook. Readonly no tiene ninguna relación con el
ActiveWorkbook.Unprotect pues los uso para dos cosas distintas y te explico
por qué.
Por qué ActiveWorkbook.Unprotect: La intención era que mi aplicación
ocultara todas las barras de menú de excel y que el usuario se vea obligado
a usar únicamente el menú personalizado que contiene todos los botones
necesarios para manejar la aplicación. Tampoco quería meterme con funciones
API a las que les tengo mucho temor.
Para lograr ésto me basé en el libro " Microsoft Excel 97 Desarrollo de
soluciones" de Eric Wells y Steve Harshbarger .
Allí encontré que para eliminar el menú de control de la ventana del libro
de trabajo bastaba con dar la instrucción:
ActiveWorkbook.Protect Windows:= True
Luego, para eliminar la barra de menú de excel pongo la instrucción
Application. DisplayFullScreen = True
Cuando se cierra la aplicación, para que todo vuelva a su estado normal,
tengo que dar la instrucción ActiveWorkbook.Unprotect y
Application.DisplayFullScreen = False

Por qué If ActiveWorkbook.ReadOnly = True: La aplicación puede estar siendo
usada por varios usuarios a la vez. Como el segundo usuario que la abre y
los siguientes estarán en modo lectura, obligatoriamente necesito que
cierren sin guardar los cambios. De no ser así, (ya que me pasó al no tener
ésto en cuenta), cuando se vuelve a abrir la aplicación se abre toda
"deformada " por los métodos protect y displayfullscreen que te comenté
antes.

4) y 5) Probé el código que según tu muy acertada intuición me sugieres y
funciona de maravillas, de hecho ya estoy reemplazando el mío por éste. Sólo
le agregué ActiveWorkbook.Unprotect, pues cuando lo probé sin esta
instrucción, cuando volví a abrir la aplicación se abría "deformada". Lo
único que quisiera que me asesores es cómo incluir en tu código el If
ActiveWorkbook. ReadOnly = True then y que se ejecute la rutina
guardarcambios() ya que la necesito por las razones que te expliqué antes.

Otra cosa que me gustaría preguntarte. Yo noto que mis conocimentos de VBA
son muy básicos y además que la forma en que aprendí a escribir códigos es
muy elemental. Cuando tú me aportas sugerencias, y no es la primera vez que
lo haces, tu código siempre está escrito en forma más profesional y ágil.
Por ejemplo nunca había visto cláusulas IF sin End If como la tuya. Dónde
puedo aprender ésto?
Como siempre muchísimas gracias. Espero tus respuestas y cuando tenga
solucionada por completo esta falla te consulto por la segunda, sí?

Diana



"Héctor Miguel" escribió en el mensaje
news:
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




Respuesta Responder a este mensaje
#3 Héctor Miguel
18/01/2006 - 04:40 | Informe spam
hola, Diana !

... para eliminar el menu de control de la ventana del libro de trabajo... la instruccion: ActiveWorkbook.Protect Windows:= True
... para eliminar la barra de menu de excel... la instruccion Application. DisplayFullScreen = True
Cuando se cierra... para que todo vuelva a su estado normal... ActiveWorkbook.Unprotect y Application.DisplayFullScreen = False
... como incluir en tu codigo el If ActiveWorkbook.ReadOnly = True... que se ejecute la rutina guardarcambios() [...]



1) [segun yo] la unica diferencia entre la rutina 'guardarcambios()' y el proceso 'normal' de cerrar la aplicacion...
es que cuando la aplicacion NO esta en modo de solo lectura -> seleccionas la hoja 'inicio' y el rango 'd10' -?-
si lo anterior es correcto -?- prueba con la siguiente modificacion al codigo anterior propuesto...
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
ActiveWorkbook.Unprotect
If Not ActiveWorkbook.ReadOnly Then Sheets("inicio").Select: Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: ActiveWorkbook.Close True
End Sub

... nunca habia visto clausulas IF sin End If como la tuya. Donde puedo aprender esto?



2) [en realidad]... puedes obtener varios ejemplos de 'uso' de las instrucciones if... desde la ayuda en linea de vba :)) [p.e.]
a) en una sola linea y SOLO si se cumple la condicion... -> If <condicion> Then <instrucciones>
b) en una sola linea con la alternativa a si/no se cumple: -> If <condicion> Then <instrucciones> Else <otras_instrucciones>
-> tambien encontraras 'tips' en relacion con los caracteres 'finales' [vba] de salto y/o continuacion de linea
=> _<= un espacio con un guion bajo = la linea de abajo es continuacion de 'esta' linea
=>: <= dos puntos con un espacio = la siguiente instruccion es -como- 'linea aparte' ;)

saludos,
hector.
Respuesta Responder a este mensaje
#4 Diana
18/01/2006 - 14:11 | Informe spam
Hola Héctor,
Muchas gracias por todas las explicaciones. Siempre aprendo mucho de tus
mails.
La diferencia entre la forma de cerrar del usuario que abrió primero y los
demás que están en modo lectura (además de volver al página "Inicio" y
seleccionar la celda D10) es que el primero guarda los cambios y los demás
no . Cuando tú pones
ActiveWorkbook.Close True, que hace 'Close True'? Guarda los cambios? Si no
los guarda por qué no simplemente 'Close'?(Perdona mi ignorancia).
Mi objetivo es que el usuario que abrió primero cuando cierre el código
guarde los cambios y los demás cierren sin guardar cambios.
Gracias y saludos,
Diana

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

... para eliminar el menu de control de la ventana del libro de
trabajo... la instruccion: ActiveWorkbook.Protect Windows:= True
... para eliminar la barra de menu de excel... la instruccion
Application. DisplayFullScreen = True
Cuando se cierra... para que todo vuelva a su estado normal...
ActiveWorkbook.Unprotect y Application.DisplayFullScreen = False
... como incluir en tu codigo el If ActiveWorkbook.ReadOnly = True... que
se ejecute la rutina guardarcambios() [...]



1) [segun yo] la unica diferencia entre la rutina 'guardarcambios()' y el
proceso 'normal' de cerrar la aplicacion...
es que cuando la aplicacion NO esta en modo de solo lectura ->
seleccionas la hoja 'inicio' y el rango 'd10' -?-
si lo anterior es correcto -?- prueba con la siguiente modificacion
al codigo anterior propuesto...
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
ActiveWorkbook.Unprotect
If Not ActiveWorkbook.ReadOnly Then Sheets("inicio").Select:
Range("d10").Select
If Workbooks.Count = 1 Then Application.Quit
Application.DisplayFullScreen = False: ActiveWorkbook.Close True
End Sub

... nunca habia visto clausulas IF sin End If como la tuya. Donde puedo
aprender esto?



2) [en realidad]... puedes obtener varios ejemplos de 'uso' de las
instrucciones if... desde la ayuda en linea de vba :)) [p.e.]
a) en una sola linea y SOLO si se cumple la condicion... -> If
<condicion> Then <instrucciones>
b) en una sola linea con la alternativa a si/no se cumple: -> If
<condicion> Then <instrucciones> Else <otras_instrucciones>
-> tambien encontraras 'tips' en relacion con los caracteres 'finales'
[vba] de salto y/o continuacion de linea
=> _<= un espacio con un guion bajo = la linea de abajo es continuacion
de 'esta' linea
=>: <= dos puntos con un espacio = la siguiente instruccion es -como-
'linea aparte' ;)

saludos,
hector.

Respuesta Responder a este mensaje
#5 Héctor Miguel
19/01/2006 - 02:05 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida