🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Freeze Panes en Excel — inmoviliza las filas de encabezado sin inmovilizar las equivocadas

|

VBA Freeze Panes en Excel — inmoviliza las filas de encabezado sin inmovilizar las equivocadas

TL;DRActiveWindow.FreezePanes = True inmoviliza todo lo que está arriba y a la izquierda de la celda activa para que se quede fijo mientras el resto se desplaza. Dos cosas sorprenden: inmoviliza en relación a la celda que esté seleccionada, así que debes posicionar la celda activa primero (selecciona A2 para inmovilizar la fila 1, B2 para inmovilizar la fila 1 y la columna A); y vive en la ventana, no en la hoja, por eso es ActiveWindow.FreezePanes y por eso una segunda ventana sobre el mismo archivo tiene su propia inmovilización. Desactívala con = False, y quita la inmovilización antes de volver a inmovilizar en un sitio nuevo.

' FreezePanes inmoviliza todo lo que esta arriba y a la izquierda de la celda ACTIVA.
Application.Goto Range("A2"), Scroll:=True  ' inmoviliza la fila superior: pon la celda activa DEBAJO
ActiveWindow.FreezePanes = True

' Inmoviliza la fila superior Y la primera columna: celda activa en B2
Worksheets("Report").Activate
Range("B2").Select
ActiveWindow.FreezePanes = True

' Movilizar los paneles:
ActiveWindow.FreezePanes = False

FreezePanes es la versión en código de Vista > Inmovilizar paneles — el ajuste que mantiene tu fila de encabezado en pantalla cuando te desplazas mil filas de datos hacia abajo. Es el único retoque de vista que merece la pena programar en cada macro de informe, porque convierte un muro de números en algo que alguien puede leer de verdad. Es también una de las pocas propiedades de VBA donde legítimamente tienes que tocar la celda activa y la ventana activa, que es exactamente por lo que se comporta de formas que pillan a la gente.

Lo que aprenderás

  • El modelo mental — inmovilizar bloquea una esquina de la vista, y vive en la ventana
  • La regla que más importa — inmoviliza en relación a la celda activa, así que posiciónala primero
  • Por qué es ActiveWindow.FreezePanes y cada Nueva ventana tiene su propia inmovilización
  • Desactivarla, y por qué debes quitar la inmovilización antes de volver a inmovilizar
  • FreezePanes frente a Split, y una vía sin selección a través de SplitRow
  • Dónde encaja la inmovilización en una macro de informe — la última, sobre la hoja que acabas de construir

El modelo mental: bloquear una esquina de la vista

Inmovilizar paneles no cambia los datos, la hoja, ni una sola celda — cambia la ventana a través de la que miras. Imagina la cuadrícula partida en cuatro cuadrantes por una línea horizontal y una vertical. El cuadrante de arriba a la izquierda queda clavado; los otros tres se desplazan por debajo. FreezePanes dibuja esas líneas y clava la esquina. Esa es toda la idea, y arrastra dos consecuencias que explican todo lo demás: la división tiene que posicionarse en algún sitio, y pertenece a la ventana, porque una ventana es lo que hace el desplazamiento.

Quédate con «es un ajuste de vista sobre la ventana», y las dos sorpresas clásicas — inmovilizar las filas equivocadas y que la inmovilización no se quede fija — dejan de ser misterios.

La regla que más importa: inmoviliza en la celda activa

Aquí está el error detrás de casi todos los fallos de «inmovilizó las filas equivocadas». FreezePanes no toma un número de fila ni un rango. Inmoviliza todo lo que está arriba y a la izquierda de la celda que esté activa en el momento en que lo fijas. Así que la celda activa es el mando, y si no la posicionas, inmovilizas dondequiera que estuviera el cursor:

ActiveWindow.FreezePanes = True   ' inmoviliza en la seleccion actual - este donde este

La regla es colocar la celda activa justo debajo y a la derecha de lo que quieres inmovilizar, y luego fijar la propiedad:

  • Inmovilizar la fila superior → selecciona A2 (todo lo que está sobre la fila 2 queda inmovilizado).
  • Inmovilizar la primera columna → selecciona B1.
  • Inmovilizar ambas, la fila superior y la primera columna → selecciona B2.

Por eso la macro grabada siempre muestra un Range(...).Select justo antes de ActiveWindow.FreezePanes = True. Inmovilizar es uno de los raros casos donde seleccionar una celda no es un mal olor de código — la selección es el argumento. Acierta con la celda activa y la inmovilización aterriza exactamente donde la quieres.

Vive en la ventana, no en la hoja

Fíjate en el objeto: ActiveWindow.FreezePanes, nunca Worksheet.FreezePanes. Inmovilizar es una propiedad de la ventana a través de la que ves una hoja — y una hoja puede mostrarse en más de una ventana. Abre Vista > Nueva ventana sobre el mismo libro y obtienes una segunda ventana con su propio estado de inmovilización; una puede tener la fila superior inmovilizada y la otra no. Por esto una inmovilización puede parecer que «no se queda fija»: la fijas en una ventana y estás mirando otra.

Para una macro, la consecuencia práctica es que la hoja que quieres inmovilizar debe estar activa en la ventana que estás configurando — no puedes inmovilizar de forma fiable los paneles de una hoja que el usuario no está mirando. Eso hace de FreezePanes uno de los pocos sitios donde echar mano de ActiveWindow y Activate es correcto y no perezoso: la ventana es genuinamente lo que estás configurando. Activa la hoja, posiciona la celda activa, fija la propiedad.

Desactivarla y volver a inmovilizar

Quitar la inmovilización es una asignación simple:

ActiveWindow.FreezePanes = False

La sutileza está en volver a inmovilizar. Fijar FreezePanes = True cuando los paneles ya están inmovilizados no hace nada — Excel no mueve una inmovilización existente a la nueva celda activa. Así que para mover una inmovilización, debes limpiarla primero, reposicionar la celda activa, y luego fijarla de nuevo:

ActiveWindow.FreezePanes = False   ' limpia la inmovilizacion anterior
Range("C3").Select                 ' reposiciona
ActiveWindow.FreezePanes = True    ' inmoviliza en la nueva esquina

Sáltate la línea = False y tu «nueva» inmovilización se ignora mientras la vieja se queda en silencio. Haz de quitar la inmovilización el primer paso siempre que una macro vuelva a aplicar una inmovilización que pueda haber fijado en una ejecución anterior.

FreezePanes frente a Split, y una vía sin selección

FreezePanes bloquea los paneles en firme. ActiveWindow.Split (con SplitRow y SplitColumn) crea en su lugar barras de división arrastrables — los paneles quedan separados pero el usuario puede redimensionarlos, y no se bloquean. La mayoría de las macros de informe quieren una inmovilización, no una división. Pero las propiedades de división te dan una forma pulcra de inmovilizar sin seleccionar una celda, que algunos prefieren por legibilidad:

ActiveWindow.SplitRow = 1        ' divide debajo de la fila 1
ActiveWindow.SplitColumn = 1     ' divide despues de la columna A
ActiveWindow.FreezePanes = True  ' convierte la division en inmovilizacion - sin Select

Fijar SplitRow/SplitColumn y luego FreezePanes = True inmoviliza en la posición de la división, así que nunca tocas la celda activa. Cualquiera de los dos estilos vale; usa el que se te lea con más claridad. La versión sin selección evita dejar al usuario en una celda sorpresa después de que la macro se ejecute.

Dónde encaja la inmovilización en una macro de informe

La inmovilización es un toque final, así que va la última — después de haber escrito los datos, aplicado los formatos de número, y ejecutado AutoFit. Inmovilizar pronto y luego insertar o eliminar filas puede desplazar dónde aterriza la inmovilización. El patrón fiable es: construye la hoja, dimensiónala, activa la hoja que construiste, posiciona la celda activa (o fija la división), y luego ActiveWindow.FreezePanes = True. No te fíes del Range("A2").Select incrustado que una grabadora escribió sobre un diseño de hoja distinto — decide la esquina de inmovilización a partir del informe que de verdad generaste, y coloca ahí la celda activa a propósito.

Cómo ayuda ExcelMaster

Inmovilizar paneles es el ajuste que hace un informe generado utilizable de un vistazo y también el que en silencio inmoviliza de la fila 1 a la 40 porque la celda activa estaba en un sitio inesperado, o parece no funcionar porque se fijó en la ventana equivocada, o se niega a moverse porque la inmovilización vieja nunca se limpió.

ExcelMaster te deja decir qué quieres mantener en pantalla — «inmoviliza la fila de encabezado», «bloquea las dos primeras columnas y la fila superior» — y escribe la inmovilización como el último paso de la rutina: activa la hoja correcta, posiciona la celda activa (o fija SplitRow/SplitColumn para una inmovilización sin selección) de modo que la división aterrice exactamente donde querías, y limpia cualquier inmovilización vieja antes de aplicar una nueva. Tú conservas el libro y el código.

Preguntas frecuentes

¿Por qué VBA inmoviliza las filas equivocadas?

Porque FreezePanes inmoviliza en relación a la celda activa, no a un número de fila, y la celda activa no estaba donde pensabas. Bloquea todo lo que está arriba y a la izquierda de la selección. Posiciona la celda activa primero — selecciona A2 para inmovilizar la fila superior, B2 para inmovilizar la fila superior y la primera columna — y luego fija ActiveWindow.FreezePanes = True.

¿Cómo inmovilizo la fila superior en VBA?

Haz que la celda activa sea A2 (una fila por debajo del encabezado), luego inmoviliza: Range("A2").Select seguido de ActiveWindow.FreezePanes = True. O sáltate la selección por completo con ActiveWindow.SplitRow = 1 y luego ActiveWindow.FreezePanes = True. La hoja debe estar activa en la ventana que estás configurando.

¿Cómo quito la inmovilización de paneles en VBA?

Fija la propiedad a False: ActiveWindow.FreezePanes = False. Ten en cuenta que para mover una inmovilización debes quitarla primero — fijar FreezePanes = True mientras los paneles ya están inmovilizados no hace nada, así que limpia la inmovilización vieja, reposiciona la celda activa, y luego fíjala de nuevo.

¿Por qué no funciona ActiveWindow.FreezePanes?

Normalmente una de tres cosas. La hoja que quieres inmovilizar no está activa en la ventana actual — actívala primero. O los paneles ya están inmovilizados, así que fijar True de nuevo se ignora — fija False, reposiciona, luego True. O estás mirando una ventana distinta de la que fijaste: la inmovilización es una propiedad por ventana, y Nueva ventana crea una segunda ventana con su propio estado.

¿FreezePanes está en la hoja o en la ventana?

En la ventana. Es ActiveWindow.FreezePanes, no una propiedad de la hoja, porque inmovilizar configura cómo una ventana se desplaza sobre una hoja. La misma hoja mostrada en dos ventanas (vía Vista > Nueva ventana) puede tener estados de inmovilización distintos. Por eso también la hoja debe estar activa en la ventana que estás configurando.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 10/09/2026.

Guías relacionadas: VBA AutoFit · VBA Ajustar texto · VBA Worksheets · VBA Ancho de columna · VBA Range