TL;DR —
ActiveWindow.FreezePanes = Trueinmoviliza 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 (seleccionaA2para inmovilizar la fila 1,B2para inmovilizar la fila 1 y la columna A); y vive en la ventana, no en la hoja, por eso esActiveWindow.FreezePanesy 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.FreezePanesy cada Nueva ventana tiene su propia inmovilización - Desactivarla, y por qué debes quitar la inmovilización antes de volver a inmovilizar
FreezePanesfrente aSplit, y una vía sin selección a través deSplitRow- 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
