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

VBA Clear en Excel — ClearContents vs Clear vs Delete, y la trampa de la cadena vacía

|

VBA Clear en Excel — ClearContents vs Clear vs Delete, y la trampa de la cadena vacía

TL;DR — No existe un único «borrar una celda». .ClearContents limpia el valor y la fórmula pero conserva el formato — el que quieres el noventa por ciento de las veces. .Clear limpia todo, formatos y bordes incluidos, así que úsalo solo para devolver una celda al blanco de fábrica. .ClearFormats limpia el formato y conserva los valores. Poner cell.Value = "" no deja la celda en blanco — deja una cadena de longitud cero que ISBLANK lee como no vacía. Y .Clear no es .Delete: Clear vacía la celda en su sitio, Delete la elimina y desplaza a sus vecinas.

Range("A2:Z1000").ClearContents   ' datos fuera, plantilla (bordes/colores/formatos) conservada
Range("A2:Z1000").Clear           ' TODO fuera - ahora reconstruyes el formato
Range("A2:Z1000").ClearFormats    ' formato fuera, valores conservados

Range("A2").Value = ""            ' NO en blanco - una cadena vacia; ISBLANK es False
Range("A2").ClearContents         ' de verdad en blanco

Todo el mundo aprende primero .ClearContents y luego se pregunta por qué .Clear «me borró los bordes», por qué una celda «en blanco» aún hace saltar un COUNTA, o por qué borrar un rango rompió fórmulas tres columnas más allá. Todo viene de una sola idea que vale la pena retener: una celda es una pila de capas independientes, y borrar es elegir qué capas limpiar. Elige la goma que corresponde a la capa que quieres, y las sorpresas desaparecen.

Lo que aprenderás

  • El modelo mental — una celda es capas, y borrar elige qué capas limpiar
  • .ClearContents frente a .Clear frente a .ClearFormats
  • Por qué cell.Value = "" es un falso blanco, y qué vacía de verdad una celda
  • Por qué .Clear y .Delete son operaciones distintas, no sinónimos
  • Borrar toda una hoja o un rango usado en una sola llamada rápida

El modelo mental: una celda es capas, borrar elige cuáles limpiar

Una celda no es una sola cosa. Contiene un valor o fórmula, un formato de número, una fuente y un relleno, bordes, formato condicional, validación de datos, y comentarios — capas independientes apiladas en la misma celda. No hay ningún método llamado «clear»; hay una familia de métodos, y cada uno elimina un subconjunto elegido:

Range("A1").ClearContents   ' quita: valor/formula          conserva: todo lo demas
Range("A1").ClearFormats    ' quita: formato de numero, fuente, relleno, bordes   conserva: valor
Range("A1").Clear           ' quita: TODO lo anterior

En cuanto ves las capas, los nombres de los métodos se leen como exactamente lo que hacen. La pregunta nunca es «cómo borro esta celda» — es «qué capas quiero que desaparezcan», y la respuesta elige el método.

ClearContents vs Clear vs ClearFormats

.ClearContents es el caballo de batalla: limpia los datos, conserva la plantilla. Quita los valores y las fórmulas y deja intactos los bordes, los colores, los formatos de número y la validación — que es exactamente lo que significa «borrar los números del mes pasado para poder meter los de este»:

Range("B2:B50").ClearContents   ' numeros fuera, la tabla con formato sigue pareciendo una tabla

.Clear es el mazo: quita el contenido y todas las capas de formato — bordes, rellenos, formato condicional, validación de datos, comentarios. Este es el daño accidental número uno en VBA: echar mano de .Clear para «vaciar» un rango con formato y descubrir que los bordes y los colores que construiste también desaparecieron.

Range("B2:B50").Clear           ' ahora B2:B50 esta en blanco Y sin formato - toca reconstruir

Usa .Clear solo cuando de verdad quieres decir «devuelve estas celdas a un estado nuevo y sin formato». .ClearFormats es la herramienta quirúrgica opuesta — quita el formato, conserva los valores — y tiene hermanos específicos para una sola capa: .ClearComments, .ClearHyperlinks, .ClearNotes, .ClearOutline. Elige la capa, elige el método.

La trampa de la cadena vacía: una cadena vacía no está en blanco

Esta es la silenciosa. Asignar una cadena vacía no vacía una celda — guarda una cadena de longitud cero, que es un valor, no una ausencia de valor:

Range("A1").Value = ""          ' A1 ahora contiene una CADENA de longitud cero
' ISBLANK(A1) es False; COUNTA cuenta A1; IsEmpty(Range("A1")) es False
Range("A1").ClearContents       ' A1 ahora esta de verdad vacia
' ISBLANK(A1) es True; COUNTA ignora A1; IsEmpty(Range("A1")) es True

Una celda puesta a "" parece en blanco en pantalla pero se comporta como llena: COUNTA la cuenta, ISBLANK e IsEmpty la reportan como no vacía, Range.End(xlUp) se detiene en ella, y los gráficos y las tablas dinámicas la tratan como datos. Esto produce bugs enloquecedores del tipo «la celda está vacía pero Excel no opina lo mismo». Para vaciar una celda, usa .ClearContents (o asigna Empty: Range("A1").Value = Empty), nunca = "". La distinción entre una celda de verdad vacía y una cadena vacía es una de las cosas más útiles que interiorizar; consulta VBA Cell Value para saber cómo se leen de vuelta los valores.

Clear no es Delete: el desplazamiento que rompe las direcciones

.Clear y .Delete suenan a sinónimos y no lo son. .Clear vacía la celda pero la deja donde está. .Delete elimina la celda por completo y desplaza a sus vecinas hacia arriba o hacia la izquierda para llenar el hueco — así que cada dirección por debajo o a la derecha del borrado cambia, y las fórmulas que apuntan a las celdas movidas pueden romperse o devolver #REF!.

Range("A5").ClearContents   ' A5 esta vacia; A6, A7, ... se quedan quietas
Range("A5").Delete Shift:=xlUp   ' A5 DESAPARECE; A6 pasa a A5, A7 pasa a A6, las direcciones se desplazan

Si tu objetivo es «dejar esta celda vacía», siempre es .ClearContents — nunca .Delete. Echa mano de .Delete solo cuando de verdad quieres la celda, la fila o la columna fuera y el desplazamiento es el objetivo, como al quitar filas en blanco. Borrar filas con seguridad (recorriendo de abajo arriba, usando EntireRow) es un tema aparte; consulta VBA Delete Rows. Confundir las dos es como una macro de «limpieza» revuelve una hoja en silencio.

Borrar toda una hoja o un rango usado en una sola llamada

Borrar es una operación de rango, así que hazlo en una sola llamada, no en un bucle celda por celda. Recorrer en bucle cruza de VBA a Excel en cada celda y se arrastra en rangos grandes; una sola llamada sobre todo el rango es una única operación (el mismo principio del viaje de ida y vuelta que al leer valores — consulta VBA Cell Value):

ws.UsedRange.ClearContents               ' borra todos los datos de la hoja, conserva los formatos
ws.Cells.Clear                           ' limpia toda la hoja, contenido y formatos
Range("A2", Range("A2").End(xlDown)).ClearContents  ' borra una columna de datos bajo un encabezado

UsedRange y CurrentRegion apuntan a «todo lo que tiene datos» sin codificar a mano una altura de rango; consulta VBA UsedRange. Mi regla general: por defecto, .ClearContents. .Clear es un reinicio de fábrica, no una goma; .Delete es cirugía estructural, no una goma; = "" es un bug de falso blanco. Nueve de cada diez veces el verbo que quieres es .ClearContents, y la décima es .ClearFormats.

Cómo ayuda ExcelMaster

Los errores de borrado que cuestan tiempo de verdad son los silenciosos: el .Clear que se llevó por delante los bordes de la plantilla, el «blanco» de = "" que un COUNTA aguas abajo siguió contando, el .Delete que desplazó una columna y rompió fórmulas a dos hojas de distancia. Cada uno hace algo — solo que no el algo que querías.

ExcelMaster echa mano de la goma que corresponde a tu intención. Pídele «borra los datos pero conserva el diseño» y usa .ClearContents sobre el rango usado; pídele «reinicia esta hoja por completo» y usa .Clear. Vacía las celdas con .ClearContents en lugar de = "", así que tus blancos son de verdad blancos, y reserva .Delete para cuando de verdad quieres quitar filas — hecho de abajo arriba para que nada se desplace por debajo. Tú dices qué debe desaparecer; él elige el método que deja intacto el resto de la celda.

Preguntas frecuentes

¿Cuál es la diferencia entre Clear y ClearContents en VBA?

.ClearContents quita solo los valores y las fórmulas, conservando el formato, los bordes, los formatos de número y la validación. .Clear quita todo — el contenido y todas las capas de formato. Usa .ClearContents para limpiar los datos manteniendo intacta una plantilla, y .Clear solo cuando quieres las celdas reiniciadas a un estado completamente en blanco y sin formato.

¿Cómo borro el contenido de una celda pero conservo el formato en VBA?

Usa .ClearContents: Range("B2:B50").ClearContents quita los valores y las fórmulas dejando en su sitio los bordes, los colores, los formatos de número y la validación de datos. Evita .Clear, que también arranca todo ese formato, y evita = "", que deja una cadena de longitud cero en lugar de una celda de verdad vacía.

¿Es lo mismo poner una celda a una cadena vacía que borrarla en VBA?

No. Range("A1").Value = "" guarda una cadena de longitud cero, que es un valor: ISBLANK devuelve False, COUNTA cuenta la celda, e IsEmpty la reporta como no vacía. Para dejar una celda de verdad en blanco, usa Range("A1").ClearContents o Range("A1").Value = Empty. La celda con cadena vacía parece en blanco pero se comporta como llena.

¿Cuál es la diferencia entre Clear y Delete en VBA?

.Clear (y .ClearContents) vacía una celda pero la deja en su sitio, así que las direcciones de alrededor no cambian. .Delete elimina la celda por completo y desplaza las celdas vecinas hacia arriba o hacia la izquierda para llenar el hueco, lo que cambia cada dirección por debajo o a la derecha de ella y puede romper fórmulas con #REF!. Usa .ClearContents para vaciar una celda y .Delete solo cuando la quieres fuera.

¿Cómo borro toda una hoja o un rango usado en VBA?

Para borrar todos los datos pero conservar el formato, usa ws.UsedRange.ClearContents. Para limpiar toda la hoja incluidos los formatos, usa ws.Cells.Clear. Las dos actúan en una sola llamada, que es mucho más rápido que recorrer celda por celda, y UsedRange apunta exactamente a la región que contiene datos sin codificar a mano un tamaño de rango.

Probado en

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

Guías relacionadas: VBA Cell Value · VBA Delete Rows · VBA Copy Paste · VBA UsedRange · VBA Number Format