sola - cómo desagrupar una hoja de excel
¿Cómo puedo congelar programáticamente la fila superior de una hoja de cálculo de Excel en Excel 2007 VBA? (6)
El problema con la macro grabada es el mismo que el problema con la acción incorporada: Excel elige congelar la fila visible superior, 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
Actualización (2 minutos después):
Encontré 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
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 para 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 .
Para expandir esta pregunta al ámbito de uso fuera del propio VBA de Excel, la propiedad ActiveWindow debe direccionarse como elemento secundario del objeto Excel.Application .
Ejemplo para crear un libro de Excel desde Access:
El uso del objeto Excel.Application en el proyecto VBA de otra aplicación de Office requerirá que agregue 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 central es en realidad solo una reiteración de las respuestas enviadas previamente, pero pensé que era importante demostrar cómo lidiar con ActiveWindow cuando no está dentro del propio VBA de Excel. Si bien el código aquí es VBA, debe ser directamente transcribible a otros idiomas y plataformas.
Solo haga clic en el mismo problema ... Por alguna razón, el comando freezepanes acaba de causar que las crucetas aparezcan en el centro de la pantalla. ¡Resulta que apagué ScreenUpdating! Resuelto con el siguiente código:
Application.ScreenUpdating = True
Cells(2, 1).Select
ActiveWindow.FreezePanes = True
Ahora funciona bien.
Tomalak ya le dio una respuesta correcta, pero me gustaría agregar que la mayoría de las veces cuando desea conocer el código VBA necesario para realizar una determinada acción en la interfaz de usuario, es una buena idea grabar una 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á grabada la siguiente macro para usted, que también hace el trabajo:
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
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á la 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 tu ventana una vez que la descongeles, que no es la que más me gusta.
Rows("2:2").Select
ActiveWindow.FreezePanes = True
Seleccione un rango diferente para un efecto diferente, de la misma manera que 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.