Optimizar buscar celda en Excel con VBA

He sacado estos dos códigos, cada uno para una hoja, en el que me dirige a la celda que me interesa. Sin embargo, se aprecia un movimiento intermedio en el transcurso del cálculo de la celda donde tiene que ir. No sé si me explico. ¿Cómo puedo quitarlo?

Private Sub Worksheet_Activate()
    Application.Goto Sheets(ActiveSheet.Name).Cells(2, Columns.Count).End(xlToLeft).Offset(0, Cells(2, Columns.Count).End(xlToLeft).Column), True
    Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).Select
End Sub
Private Sub Worksheet_Activate()
    Application.Goto Sheets(ActiveSheet.Name).Cells(2, Columns.Count).End(xlToLeft).Offset(0, Cells(1, Columns.Count).End(xlToLeft).Column), True
    Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).End(xlDown).Offset(1, 0).Select
End Sub
Respuesta
1

[Hola

Ese "parpadeo" puede ser evadido:

'Al inicio esto:
Application.ScreenUpdating = False
Áquí tus códigos
'Al final esto:
Application.ScreenUpdating = True

Prueba y comentas

Abraham Valencia

PD: Obvio "inicio" es después del "Private Sub..." y "final" es antes del "End Sub"

Sí, ya lo había pensado, pero antes de Application.ScreenUpdating me iba perfecto, y ahora no me mueve la pantalla hacia la zona donde está la celda.

Solo para estar seguro, más que solo ir a la celda en cuestión, lo que quieres es que, además de eso, quede al centro de la pantalla ¿cierto?

Abraham Valencia

Sí, por eso utilizo Application.Goto, para centrar, y luego la siguiente línea es para seleccionar la celda en concreto. Pero, como te digo, al usar Application.ScreenUpdating, pues no me funciona Application.Goto. Mira, te paso el Excel para que lo veas lo que tengo hecho:

https://www.dropbox.com/s/lh8tqkyxfyu0flu/Facturaci%C3%B3n.xlsm?dl=0 

La hoja Datos funciona. La que no me funcionan son las otras dos. Te dejo en roja la celda a la que debe ir.

[Hola nuevamente

Ya vi y entendí mejor tu archivo viéndolo y tenemos un problema. Aunque no está completamente documentado en las webs de Microsoft, la propiedad "Screenupdating" no evita todos los parpadeos de la pantalla y además causa "resultados inesperados" (como el tuyo) cuando se "combina" con el método "Application.Goto" (en general siempre se recomienda no usar Application.Goto, Goto, Select...)

Entonces la alternativa es mantenerlo como ya estás haciendo o, quizá explicar cuales son las celdas que necesitas seleccionar y centrarlo de otra forma no olvidando, igual, que siempre pero siempre hay ciertos parpadeos (muy rápidos a veces, es cierto) que son imposibles de evitar al seleccionar celdas.

Abraham Valencia

Hola, Abraham. La celda que necesito seleccionar es la que puedes ver en rojo. En la hoja Resumen, que vaya a la celda con datos en la fila 2. Y en la de Clientes, a la última celda de la última columna con datos (en este caso, sería D3; pero en 2020, sería E2, si no hay datos). ¿Me explico?

Yo he probado mil formas, y la única manera que he conseguido de hacerlo funcionar es como te he puesto antes.

Hay una forma en que el gran "Chip" Pearson (QEPD) lograba un efecto parecido pero que, desde mi punto de vista, es mejor que usar solo "Application.Goto", prueba y comentas-

En un módulo "Standard":

Sub CenterOnCell(OnCell As Range)
Dim VisRows As Integer
Dim VisCols As Integer
Application.ScreenUpdating = False
OnCell.Parent.Parent.Activate
OnCell.Parent.Activate
With ActiveWindow.VisibleRange
   ' VisRows = .Rows.Count
    VisCols = .Columns.Count
End With
With Application
    .Goto reference:=OnCell.Parent.Cells( _
        .WorksheetFunction.Max(1, OnCell.Row + _
        (OnCell.Rows.Count / 2) - (VisRows / 2)), _
        .WorksheetFunction.Max(1, OnCell.Column + _
        (OnCell.Columns.Count / 2) - _
        .WorksheetFunction.RoundDown((VisCols / 2), 0))), _
     scroll:=True
End With
OnCell.Select
Application.ScreenUpdating = True
End Sub

Luego en el módulo de la hoja "Resumen":

Private Sub Worksheet_Activate()
Dim UltimaColumna As Range
Set UltimaColumna = Cells(2, Columns.Count).End(xlToLeft)
Call CenterOnCell(UltimaColumna)
End Sub

Y en el módulo de la hoja "Clientes":

Private Sub Worksheet_Activate()
Dim UltimaFila As Range
Set UltimaFila = Cells(Rows.Count, 4).End(xlUp)
Call CenterOnCell(UltimaFila)
End Sub

Comentas

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas