2010-07-12 20 views
32

Estoy buscando congelar programáticamente la fila superior de una hoja de cálculo de Excel de VBA. El objetivo final es producir el mismo efecto que el comando View > Freeze Panes > Freeze Top Row en Excel 2007, de modo que la fila superior de la hoja de trabajo esté congelada y los usuarios puedan ver la fila superior de la hoja de trabajo incluso mientras se desplazan por los datos.¿Cómo puedo congelar programáticamente la fila superior de una hoja de cálculo de Excel en Excel 2007 VBA?

Respuesta

30
Rows("2:2").Select 
ActiveWindow.FreezePanes = True 

Seleccione un rango diferente para un efecto diferente, de forma muy similar a como lo haría manualmente. El "Freeze Top Row" realmente solo es un acceso directo nuevo en Excel 2007 (y versiones posteriores), no contiene ninguna funcionalidad adicional en comparación con las versiones anteriores de Excel.

+5

Parece que la función de actualización de pantalla debe estar activada para que funcione, pero por lo demás es excelente. ¡Gracias! –

+2

No tengo claro cómo congelar la fila superior seleccionando la fila superior. Para congelar la fila superior, la selección debe ser 'Filas (2)' o 'Filas (" 2: 2 ")'. Seleccionar 'Fila (" 1: 1 ")' da como resultado una división de cuatro cuadrantes de la hoja de trabajo. – Jeeped

+0

@Jeeped m) - ¡por supuesto! Buen hallazgo, gracias! – Tomalak

12

Tomalak ya le dio una respuesta correcta, pero me gustaría agregar que la mayoría de las veces cuando le gustaría saber el código VBA necesario para realizar una determinada acción en la interfaz de usuario, es una buena idea grabar un macro.

En este caso, haga clic en Grabar macro en la pestaña del desarrollador de la cinta de opciones, congele la fila superior y luego detenga la grabación. Excel tendrá la siguiente macro grabada para usted que también hace el trabajo:

With ActiveWindow 
    .SplitColumn = 0 
    .SplitRow = 1 
End With 
ActiveWindow.FreezePanes = True 
+0

Sí. Esta es la respuesta correcta. No es necesario seleccionar ninguna parte de la hoja de trabajo. – HuckIt

+0

Buena respuesta, pero tengo curiosidad por saber por qué la última afirmación no estaba metida en la declaración Con ... Fin Con. – Jeeped

+0

@Jeeped: Esta es solo la salida sin formato de la grabadora de macros de Excel. Por supuesto, puede incluir la línea en el bloque 'With'. –

13

El problema con la macro grabada es el mismo que el problema con la acción integrada: Excel elige para congelar la parte superior visibles fila, en lugar de la fila superior real donde se puede encontrar la información del encabezado.

El objetivo de una macro en este caso es congelar la fila superior real. Cuando estoy viendo la fila # 405592 y necesito verificar el encabezado de la columna (porque olvidé congelar filas cuando abrí el archivo), tengo que desplazarme hacia la parte superior, congelar la fila superior, luego encontrar el camino de regreso a fila # 405592 nuevamente. Como creo que esto es un comportamiento estúpido, quiero una macro para corregirlo, pero, como dije, la macro grabada simplemente imita el mismo comportamiento estúpido.

estoy usando Office 2011 para Mac OS X Lion

Update (2 minutos más tarde):

he encontrado una solución aquí: http://www.ozgrid.com/forum/showthread.php?t=19692

Dim r As Range 
Set r = ActiveCell 
Range("A2").Select 
With ActiveWindow 
    .FreezePanes = False 
    .ScrollRow = 1 
    .ScrollColumn = 1 
    .FreezePanes = True 
    .ScrollRow = r.Row 
End With 
r.Select 
+2

Para cualquier otro novato como yo: pude congelar las 8 filas superiores (donde reside mi "tablero de informes") haciendo el Rango ("A9") sin cambiar nada más. – Sean

7

simplemente pulse el mismo problema .. Por alguna razón, el comando freezepanes acaba de provocar que las referencias cruzadas aparezcan en el centro de la pantalla. ¡Resulta que apagué ScreenUpdating! resuelve con el siguiente código:

Application.ScreenUpdating = True 
Cells(2, 1).Select 
ActiveWindow.FreezePanes = True 

ahora funciona bien.

2
Rows("2:2").Select 
ActiveWindow.FreezePanes = True 

Esta es la forma más fácil de congelar la fila superior. La regla para FreezePanes es que congelará el esquina superior izquierda de la celda que seleccionó. Por ejemplo, si resalta C10, se congelará entre las columnas B y C, filas 9 y 10. Por lo tanto, cuando resalta la Fila 2, en realidad se congela entre las Filas 1 y 2, que es la fila superior.

Además, .SplitColumn o .SplitRow dividirán su ventana una vez que la descongele, que no es la que yo prefiero.

3

Para ampliar esta cuestión en el ámbito de utilización fuera de Excel VBA s propia, la ActiveWindow property debe abordarse como un hijo de la Excel.Application object.

Ejemplo para la creación de un libro de Excel desde Access:

Utilizando el Excel.Application object en el proyecto de VBA de otra aplicación de Office será necesario que añadir la biblioteca de objetos de Microsoft Excel 15.0 (o equivalente para su propia versión).

Option Explicit 

Sub xls_Build__Report() 
    Dim xlApp As Excel.Application, ws As Worksheet, wb As Workbook 
    Dim fn As String 

    Set xlApp = CreateObject("Excel.Application") 
    xlApp.DisplayAlerts = False 
    xlApp.Visible = True 

    Set wb = xlApp.Workbooks.Add 
    With wb 
     .Sheets(1).Name = "Report" 
     With .Sheets("Report") 

      'report generation here 

     End With 

     'This is where the Freeze Pane is dealt with 
     'Freezes top row 
     With xlApp.ActiveWindow 
      .SplitColumn = 0 
      .SplitRow = 1 
      .FreezePanes = True 
     End With 

     fn = CurrentProject.Path & "\Reports\Report_" & Format(Date, "yyyymmdd") & ".xlsx" 
     If CBool(Len(Dir(fn, vbNormal))) Then Kill fn 
     .SaveAs FileName:=fn, FileFormat:=xlOpenXMLWorkbook 
    End With 

Close_and_Quit: 
    wb.Close False 
    xlApp.Quit 
End Sub 

El proceso básico es en realidad sólo una reiteración de las respuestas presentadas anteriormente, pero pensé que era importante demostrar cómo tratar con ActiveWindow cuando no está dentro de la propia VBA de Excel. Si bien el código aquí es VBA, debe ser directamente transcribible a otros idiomas y plataformas.

+0

También podría usar 'Establecer xlApp = New Excel.Application', o incluso' Dim xlApp As New Excel.Application'. –

Cuestiones relacionadas