No funcionan las las siguientes aplicaciones en VBA: Application.ScreenUpdating = FalseActiveSheet.DisplayPageBreaks = False

Estoy usando el siguiente código

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
ActiveSheet.DisplayPageBreaks = False
If TextBox1 = Empty Then
MsgBox "Para Iniciar, ingrese la fecha solicitada"
Else
Sheets("hoja2").Select
Range("B2").Value = TextBox1
Range("B2") = CDate(TextBox1)
If TextBox2 = Empty Then
Range("F3").Value = ""
Range("F4").Value = ""
Range("F5").Value = ""
Sheets("hoja1").Select
Else
Range("F3").Value = TextBox2
Range("F3") = CDate(TextBox2)
If TextBox3 = Empty Then
Range("F4").Value = ""
Range("F5").Value = ""
Sheets("hoja1").Select
Else
Range("F4").Value = TextBox3
Range("F4") = CDate(TextBox3)
If TextBox4 = Empty Then
Range("F5").Value = ""
Sheets("hoja1").Select
End
Else
Range("F5").Value = TextBox4
Range("F5") = CDate(TextBox4)
End If
End If
End If
Sheets("hoja1").Select
End
End If
Application.ScreenUpdating = False
ActiveSheet.DisplayPageBreaks = False
End Sub

Pero las aplicaciones mencionadas en el título del tema no funcionan, ¿qué debo corregir?

2 respuestas

Respuesta
2

Pero qué funcionamiento esperas.

Si quieres ver los cambios en la pantalla entonces debes poner primero True y al final del código False

Private Sub CommandButton1_Click()
    Application.ScreenUpdating = True
    ActiveSheet.DisplayPageBreaks = True
    '
    'el código
    '
    Application.ScreenUpdating = False
    ActiveSheet.DisplayPageBreaks = False
End Sub

Pero si quieres desactivar la actualización en pantalla, primero debes apagar con False y después prender con True

Private Sub CommandButton1_Click()
    Application.ScreenUpdating = False
    ActiveSheet.DisplayPageBreaks = False
    '
    'el código
    '
    Application.ScreenUpdating = True
    ActiveSheet.DisplayPageBreaks = True
End Sub
'S aludos. Dante Amor. Si es lo que necesitas, r ecuerda valorar la respuesta. G racias

Gracias nuevamente

Lo que espero es que al ejecutar la macro no se vea la actualización, simplemente que me arroje el resultado sin mostrar el procedimiento que ejecuta, ahora, he usado las opciones que ustedes me están aportando pero no funcionan.

Será que por tener éste código en un userfrom, es que no funcionan estas dos lineas?

Prueba con lo siguiente. No importa si estás en el userform. No verás la actualización en pantalla. Es decir, si estás en la hoja1, no verás que se selecciona la hoja2 y que luego regresa a la hoja1.

Private Sub CommandButton1_Click()
    Application.ScreenUpdating = False
    'ActiveSheet.DisplayPageBreaks = False
    If TextBox1 = Empty Then
        MsgBox "Para Iniciar, ingrese la fecha solicitada"
    Else
        Sheets("hoja2").Select
        Range("B2").Value = TextBox1
        Range("B2") = CDate(TextBox1)
        If TextBox2 = Empty Then
            Range("F3").Value = ""
            Range("F4").Value = ""
            Range("F5").Value = ""
            Sheets("hoja1").Select
        Else
            Range("F3").Value = TextBox2
            Range("F3") = CDate(TextBox2)
            If TextBox3 = Empty Then
                Range("F4").Value = ""
                Range("F5").Value = ""
                Sheets("hoja1").Select
            Else
                Range("F4").Value = TextBox3
                Range("F4") = CDate(TextBox3)
                If TextBox4 = Empty Then
                    Range("F5").Value = ""
                    Sheets("hoja1").Select
                    'End
                Else
                    Range("F5").Value = TextBox4
                    Range("F5") = CDate(TextBox4)
                End If
            End If
        End If
        Sheets("hoja1").Select
        'End
    End If
    MsgBox "Se actualizaron los datos"
    Application.ScreenUpdating = True
    'ActiveSheet.DisplayPageBreaks = True
End Sub

Por otra parte, las condiciones que tienes en tu código no se cumplen todas, por ejemplo, si el textbox3 está vacío, pero el textbox4 tiene dato, la macro nunca reflejará el valor del textbox4 en la hoja. Si lo anterior es correcto, entonces no dije nada.


Prueba nuevamente y me comentas.

Efectivamente, el procedimiento que describe es el que estoy esperando.

Estoy copiando y pegando los nuevos valores que ustedes me aportan pero sigo con la misma novedad

Pero puedes describir qué es lo que hace y qué es lo que esperas que haga.

ok, perfecto

El código lo tengo en un userfrom desde donde se solicitan máximo 4 fechas, una fecha inicial donde el usuario la elige a partir de un calendario (textbox1) y otras fechas correspondientes al mismo mes de la fecha inicial que equivaldrían a días festivos de ese mes si los tuviere (textbox2, 3 y 4)

Luego al aceptar, estas fechas pasan a una hoja 2 donde se asignan a las celdas que se nombran en el código con el fin de identificar los días que son domingos y festivos para posteriormente calcular (con otros códigos que están en un módulo como funciones) un número de horas a laborar en ese mes y programar unos turnos. 

Pero sigo sin entender qué pasa cuando presionas el botón; ¿Y qué esperas de resultado?

El formulario del userform está en un botón ubicado en la hoja1 y lo que espero es no ver el procedimiento de asignación de fechas a los rangos que se hace en la hoja 2 para luego pasar a la hoja uno. Resumidamente lo que espero es no ver ese salto de hoja entre la 1 y la 2 y hasta ahora las lineas que venimos discutiendo no me han funcionado 

Prueba con la siguiente opción

De la manera en que está programado, no es necesario cambiarse de hoja, como puedes ver he eliminado los Select a las hojas.

Private Sub CommandButton1_Click()
    Application.ScreenUpdating = False
    If TextBox1 = Empty Then
        MsgBox "Para Iniciar, ingrese la fecha solicitada"
    Else
        Set h2 = Sheets("hoja2")
        h2.Range("B2").Value = TextBox1
        h2.Range("B2") = CDate(TextBox1)
        If TextBox2 = Empty Then
            h2.Range("F3").Value = ""
            h2.Range("F4").Value = ""
            h2.Range("F5").Value = ""
        Else
            h2.Range("F3").Value = TextBox2
            h2.Range("F3") = CDate(TextBox2)
            If TextBox3 = Empty Then
                h2.Range("F4").Value = ""
                h2.Range("F5").Value = ""
            Else
                h2.Range("F4").Value = TextBox3
                h2.Range("F4") = CDate(TextBox3)
                If TextBox4 = Empty Then
                    h2.Range("F5").Value = ""
                Else
                    h2.Range("F5").Value = TextBox4
                    h2.Range("F5") = CDate(TextBox4)
                End If
            End If
        End If
    End If
    MsgBox "Se actualizaron los datos"
    Application.ScreenUpdating = True
End Sub

Si tienes problemas, envíame tu archivo parra revisarlo.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Gracias, el código ha servido pues ya no veo ese salto de hoja entre la 1 y la 2, tienes toda la razón, eliminado los Select a funcionado

Ahora,que no hay salto entre las hojas lo que si se logra a observar es un leve parpadeo, este sería otro tema a discutir?

Muchas gracias, donde lo puedo calificar?

Quita las líneas

Application.ScreenUpdating = False
Application.ScreenUpdating = True

El parpadeo debe desaparecer.


Para valorar, al final de mi respuesta hay unos botones: "Votar" y "Excelente" presiona el botón que consideres.

Sal u dos

Dante, tengo que ser honesto al decirte que la necesidad que tenía se resolvió pero las líneas que nuevamente me pides que use no funcionan dentro del código,

Lo que dije es que las quitaras.

Te pongo el código completo:

Private Sub CommandButton1_Click()
    If TextBox1 = Empty Then
        MsgBox "Para Iniciar, ingrese la fecha solicitada"
    Else
        Set h2 = Sheets("hoja2")
        h2.Range("B2").Value = TextBox1
        h2.Range("B2") = CDate(TextBox1)
        If TextBox2 = Empty Then
            h2.Range("F3").Value = ""
            h2.Range("F4").Value = ""
            h2.Range("F5").Value = ""
        Else
            h2.Range("F3").Value = TextBox2
            h2.Range("F3") = CDate(TextBox2)
            If TextBox3 = Empty Then
                h2.Range("F4").Value = ""
                h2.Range("F5").Value = ""
            Else
                h2.Range("F4").Value = TextBox3
                h2.Range("F4") = CDate(TextBox3)
                If TextBox4 = Empty Then
                    h2.Range("F5").Value = ""
                Else
                    h2.Range("F5").Value = TextBox4
                    h2.Range("F5") = CDate(TextBox4)
                End If
            End If
        End If
    End If
    MsgBox "Se actualizaron los datos"
End Sub

Revisa que no las tengas en otra parte del código del userform

Ya las he quitado, no están en ninguna parte del userform y se sigue observando un leve parpadeo luego de aceptar la operación

Quiero destacar que el último mensaje MsgBox lo he puesto entre los últimos end if, debido a un efecto que no era correcto (Al dar aceptar con todos los textbox vacíos se activan los dos mensajes del código)

End If
    MsgBox "Se actualizaron los datos"
End If
End Sub

Lo del msgbox, solamente era un plus para mostrar que ya había terminado la operación, quita el mensaje si no es necesario

Yo probé el código y no tengo ningún parpadeo, tal vez sea la versión de office, o el procesador, o la memoria.

Lo importante es que ya no ves los cambios de hoja. R ecuerda valorar la respuesta, para que sigas contando con nuestro apoyo para futuras preguntas. Sal u dos

Lo del mensaje es un buen plus y aplica perfectamente para este procesos, simplemente es hacer ese pequeño cambio para que tenga un buen funcionamiento

Voy a ensayar el código en otro equipo y claramente la necesidad fue resuelta pero no el tema que inscribí en este foro, aún seguimos sin saber porqué no funcionan éstas aplicaciones. Mañana les estaré contando como funcionó en otro pc

Las aplicaciones funcionan correctamente, esa es su funcionalidad, apagar y prender la actualización de la pantalla.

Tendría que revisar tu archivo completo.

Envíame tu archivo para revisarlo.

También dime la versión de office que manejas, la versión de excel y si tienes actualizadas todos los componentes.

Si las aplicaciones no funciona puede ser por las versiones o por el procesador de tu equipo o por otros factores que no podemos revisar, porque no podemos recrear el ambiente completo con el que estás trabajando. Pero más allá de si resolvimos el tema que pusiste, buscamos alternativas para resolver tu problema; y si eso no merece tu valoración, no te preocupes, me quedo con la satisfacción de seguir ayudando.

Sal u dos y que tengas buen día.

Respuesta
1

.16.01.17

Buenas tardes,

Me parece que al programar que muestre un msgbox, las instruciones para que no refresque pantalla y no muestre los saltos de página deberían ser posteriores.

Esa son las dos instrucciones por las que estás consultando. A menos que lo que buscas sea otra cosa.

Prueba con esta variante de tu rutina:

Private Sub CommandButton1_Click()
If TextBox1 = Empty Then
    MsgBox "Para Iniciar, ingrese la fecha solicitada"
Else
    Application.ScreenUpdating = False
    ActiveSheet.DisplayPageBreaks = False
    Sheets("hoja2").Select
    Range("B2").Value = TextBox1
    Range("B2") = CDate(TextBox1)
    If TextBox2 = Empty Then
        Range("F3").Value = ""
        Range("F4").Value = ""
        Range("F5").Value = ""
        Sheets("hoja1").Select
    Else
        Range("F3").Value = TextBox2
        Range("F3") = CDate(TextBox2)
        If TextBox3 = Empty Then
            Range("F4").Value = ""
            Range("F5").Value = ""
            Sheets("hoja1").Select
        Else
            Range("F4").Value = TextBox3
            Range("F4") = CDate(TextBox3)
            If TextBox4 = Empty Then
                Range("F5").Value = ""
                Sheets("hoja1").Select
                End
            Else
                Range("F5").Value = TextBox4
                Range("F5") = CDate(TextBox4)
            End If
        End If
    End If
    Sheets("hoja1").Select
    End
End If
Application.ScreenUpdating = True
ActiveSheet.DisplayPageBreaks = True
End Sub

También la indenté para ver la lógica de los IFs.

Espero que sea lo que buscabas.

Saludos

Fernando

.

Gracias por su pronta respuesta

Esas son las dos lineas por las que estoy consultando y he usado ya la opción que me aporta e incluso he ubicado estas dos lineas en diferentes lugares pero aún así no se ejecutan, pues el salto de hoja se sigue viendo al correr la macro. 

Conclusión, aún no me funcionan las siguientes lineas:

Application.ScreenUpdating = False
ActiveSheet.DisplayPageBreaks = False

que debo corregir o por cual código las puedo reemplazar

.

Buenas, Stevenson

Al final de la rutina que te pasé, puse

ActiveSheet.DisplayPageBreaks = True

Deberías cambiarlo a

ActiveSheet.DisplayPageBreaks = False

para que no muestre los saltos de página.

Mientras que la otra instrucción 

Application.ScreenUpdating = True

es redundante, porque la actualización de pantalla se activa automáticamente al final cada rutina. Sólo sirve para que no se vea qué hace la rutina mientras se está ejecutando.

¿Son esos los efectos que buscabas?

Abrazo

Fer

.

Fer, muchas gracias por tus aportes los comparto 100% estando de acuerdo contigo, he ensayado este código en otro pc y sigue pasando lo mismo, hay varios parpadeos en milisegundos, aún usando todo lo que hasta ahora hemos mencionado pero pareciera que no sirve o no se ejecuta 

sigo atento a sus recomendaciones 

.

Efectivamente, es muy curioso el comportamiento, porque ScreenUpdating impide que se refresque la pantalla.

Me quedé pensando en tu caso y noté que no veo que descargues el formulario (Unload Me) antes de iniciar los comandos.

Tal vez necesites que sea así pero puede ser la causa del parpadeo.

Puedes intentarlo y ver si aún así persiste.

Un abrazo
Fer

.

Fer, el formulario lo estaba descargando con la propiedad end pero igualmente hice el ejercicio de cambiarlo por el unload me y persiste la novedad

.

Sí, pero END está al final del segundo if (por eso fue útil la indentación del código para que entendiéramos mejor su estructura).

Si no va a ser utilizado nuevamente, descargaría el formulario apenas comienza el 1º "else":

Private Sub CommandButton1_Click()
If TextBox1 = Empty Then
    MsgBox "Para Iniciar, ingrese la fecha solicitada"
Else
End ' o Unload Me -- AQUI, ANTES DE CONGELAR LA PANTALLA
    Application.ScreenUpdating = False
    ActiveSheet.DisplayPageBreaks = False
    Sheets("hoja2").Select
    Range("B2").Value = TextBox1

Tal vez valgala pena intentarlo.

Saludos

Fer

.

con end en esa posición se termina el proceso sin ejecutarse el resto del código y con unload me en esa posición el código si se ejecuta pero el proceso sigue presentando la misma novedad 

.

Claro, por eso yo uso unload me, cuando no necesito el formulario activo. Es más prolijo programar así, independientemente de ese parpadeo.

No veo nada extraño en tu código que lo provoque...

Saludos

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas