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

VBA Borders en Excel — dibuja bordes de celda desde código (y por qué se encuadró todo el bloque)

|

VBA Borders en Excel — dibuja bordes de celda desde código (y por qué se encuadró todo el bloque)

TL;DR — Un borde es una propiedad de una arista, no de una celda. Un rango tiene ocho bordes direccionables: las cuatro aristas exteriores (xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlEdgeBottom), los dos juegos de líneas de cuadrícula interiores (xlInsideVertical, xlInsideHorizontal) y dos diagonales. La colección Range("A1:D10").Borders a secas significa todas ellas, así que .Borders.LineStyle = xlContinuous encuadra cada celda del bloque, no solo el contorno. Usa Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlThin cuando quieras solo el marco exterior.

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")
' Contornea el bloque, luego una linea fina bajo la fila de encabezado - dos tareas distintas.
ws.Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlMedium
ws.Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous

Añadir bordes es una de las primeras cosas que la gente automatiza, y es también donde un pequeño malentendido produce el resultado más desconcertante de todo el kit de formato: pediste «un borde» y Excel dibujó una cuadrícula alrededor de cada celda. Esta guía se construye sobre una sola idea que vuelve predecible todo lo demás: Borders es una colección de aristas, y tocar la colección toca cada arista. En cuanto ves los bordes como algo por-arista, la confusión entre contorno y cuadrícula desaparece.

Lo que aprenderás

  • El modelo mental — un borde pertenece a una arista, y Borders es el conjunto entero de ellas
  • La regla más importante — .Borders encuadra cada celda, .BorderAround dibuja solo el marco
  • Las tres propiedades que hacen visible una línea — LineStyle, Weight y Color
  • Dirigir una arista cada vez con xlEdgeBottom, xlInsideVertical y las demás
  • Borrar los bordes limpiamente con xlLineStyleNone
  • Por qué los bordes son decoración, no estructura — y a qué echar mano en su lugar

El modelo mental: un borde es una propiedad de una arista

Este es el hermano del grupo de apariencia — Font da estilo al texto, Interior rellena por detrás, y los bordes dibujan las líneas alrededor. Pero los bordes se diferencian de esos en algo importante: una celda no tiene «un borde», tiene hasta ocho, y VBA alcanza cada uno a través de la colección Borders indexada por una constante XlBordersIndex:

' Las ocho aristas direccionables de cualquier rango:
'   xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlEdgeBottom   - los cuatro lados exteriores
'   xlInsideVertical, xlInsideHorizontal              - lineas de cuadricula ENTRE celdas
'   xlDiagonalDown, xlDiagonalUp                       - de esquina a esquina
ws.Range("B2").Borders(xlEdgeBottom).LineStyle = xlContinuous   ' solo el borde inferior de B2

Quédate con esa imagen — ocho aristas, cada una direccionable de forma independiente — y cada regla posterior es una consecuencia de ella. Los bordes interiores solo existen cuando el rango abarca más de una celda (una sola celda no tiene «entre medias»), que es exactamente por qué la misma línea de código se comporta distinto en B2 que en B2:E20.

La regla más importante: .Borders es cada arista, .BorderAround es solo el marco

Aquí está la línea que pilla a todo el mundo. En un rango de varias celdas, fijar la colección se aplica a todas las aristas a la vez — los lados exteriores y las líneas de cuadrícula entre celdas:

' Encuadra CADA celda del bloque - contorno mas todas las lineas interiores.
ws.Range("A1:D10").Borders.LineStyle = xlContinuous

Eso rara vez es lo que la gente quiere decir cuando dice «ponle un borde». Si quieres un solo rectángulo alrededor de todo el bloque y nada dentro, usa el método BorderAround, que solo toca las cuatro aristas exteriores:

' Solo el marco exterior - sin lineas interiores.
ws.Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlThick

La distinción es el meollo del tema: .Borders = la cuadrícula, .BorderAround = el contorno. Si de verdad quieres ambas cosas — un bloque encuadrado con líneas interiores más suaves — hazlo en dos pasadas: fija .Borders.LineStyle para el interior, y luego BorderAround para un marco más grueso encima. Echar mano de .Borders cuando querías .BorderAround es la razón número uno de que un «borde único» salga como una jaula completa.

Las tres propiedades que hacen una línea: LineStyle, Weight, Color

Una arista de borde es invisible hasta que tiene un LineStyle. Esa es la propiedad que enciende la línea; las otras dos la refinan. Como normalmente fijas las tres a la vez, With lo mantiene legible:

With ws.Range("A1:D10").Borders(xlEdgeBottom)
    .LineStyle = xlContinuous   ' ENCIENDE la linea - sin esto no se ve nada
    .Weight = xlMedium          ' xlHairline, xlThin, xlMedium, xlThick
    .Color = RGB(0, 32, 96)     ' RGB de 24 bits, igual que Font.Color
End With

Tres cosas que conviene saber. LineStyle es el interruptor de encendido/apagado — xlContinuous, xlDash, xlDot, xlDashDot, xlDouble, xlSlantDashDot, etc. — y fijarlo es lo que hace aparecer el borde. Weight es una de cuatro constantes (xlHairline, xlThin, xlMedium, xlThick), no un número de puntos. Y no toda pareja LineStyle/Weight es legal: xlHairline implica una línea continua y fina, y xlDouble ignora Weight por completo — así que si un grosor parece no tener efecto, es el estilo de línea el que lo anula. Para el color, usa .Color = RGB(r, g, b) (el mismo espacio de 24 bits que Font.Color, tratado en VBA Font); evita .ColorIndex salvo que estés igualando una paleta heredada.

Una arista cada vez

La mayoría de los bordes reales no son de «todo o nada». Una línea bajo un encabezado, un divisor entre dos secciones, un margen izquierdo grueso — cada uno es una sola arista:

' Una linea gruesa bajo el encabezado, un divisor ligero entre las columnas B y C.
ws.Range("A1:D1").Borders(xlEdgeBottom).Weight = xlThick
ws.Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous
ws.Range("C2:C20").Borders(xlEdgeLeft).LineStyle = xlDot

xlInsideVertical y xlInsideHorizontal te dan las líneas de cuadrícula entre celdas sin el marco exterior — lo inverso de BorderAround. Dirige las aristas que quieras y deja el resto intactas; cada Borders(index) es independiente, así que fijar la de abajo nunca altera la de arriba.

Borrar los bordes

Para quitar bordes, pon el estilo de línea a ninguno. En la colección lo borra todo; en un índice borra solo esa arista:

ws.Range("A1:D10").Borders.LineStyle = xlLineStyleNone   ' quita todos los bordes del bloque
ws.Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone   ' quita solo la linea del encabezado

xlLineStyleNone y xlNone son intercambiables aquí. Ojo: borrar los bordes de un rango no toca los bordes que Excel dibuja como parte de un estilo de Tabla o del Formato condicional — esos pertenecen al objeto que los creó, no a la celda, así que si una línea se niega a desaparecer, busca una Tabla o una regla de formato en vez de una llamada perdida a Borders.

Los bordes son decoración, no estructura

Vale la pena decirlo con claridad, porque ahorra rehacer trabajo: un borde es puramente visual. No agrupa filas, no define un rango y es invisible para toda fórmula. Si dibujas bordes para que un bloque parezca una tabla y poder referirte a él más tarde, conviértelo mejor en una Tabla de Excel de verdad (ListObject) — obtienes el aspecto encuadrado y además un rango con nombre, referencias estructuradas y bandas automáticas. Usa bordes dibujados a mano para los toques finales de un informe que estás a punto de imprimir o exportar, no como forma de dar a los datos una figura que tu código pueda leer. La figura tiene que vivir en los datos, como ocurre en VBA Range; el borde es solo la pintura de encima.

Cómo ayuda ExcelMaster

Los bordes esconden más decisiones de las que parece: colección frente a BorderAround, cuál de las ocho aristas querías de verdad, un Weight que un LineStyle anula sin avisar, y una línea que no se borra porque una Tabla es su dueña. Cada giro equivocado es silencioso — una cuadrícula donde querías un contorno, o ningún cambio en absoluto.

ExcelMaster te deja describir el resultado en su lugar. Di «encuadra el bloque de resumen con un contorno grueso y una línea fina bajo el encabezado», y usa BorderAround para el marco y Borders(xlEdgeBottom) para la línea — fijando LineStyle primero para que la línea se vea de verdad, y eligiendo Weight y Color a juego. Te quedas con el libro y con el código; te ahorras la pasada en la que .Borders enjauló cada celda que solo querías contornear.

Preguntas frecuentes

¿Cómo añado un borde a un rango en Excel VBA?

Para un solo contorno alrededor de todo el rango, usa Range("A1:D10").BorderAround LineStyle:=xlContinuous, Weight:=xlThin — dibuja solo el marco exterior. Para una arista concreta, fíjala en el índice de la colección, por ejemplo Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlContinuous. Fija siempre LineStyle (no solo Weight), porque el estilo de línea es lo que hace visible un borde.

¿Por qué Range.Borders.LineStyle encuadra cada celda en vez de dibujar un solo contorno?

Porque Range.Borders es la colección entera de aristas — los cuatro lados exteriores y las líneas de cuadrícula interiores entre celdas. Fijar LineStyle en la colección se aplica a todas ellas, así que un rango de varias celdas recibe un borde alrededor de cada celda. Usa BorderAround para tocar solo el marco exterior, o dirige aristas individuales como Borders(xlEdgeTop) para un lado cada vez.

¿Cuál es la diferencia entre Borders y BorderAround en VBA?

Borders(index) es una colección que indexas por arista (xlEdgeLeft, xlInsideVertical, etc.), y fijar la colección a secas afecta a cada arista. BorderAround es un método que dibuja solo las cuatro aristas exteriores del rango en una sola llamada, dejando en paz las líneas de cuadrícula interiores. Usa BorderAround para un contorno y la colección Borders cuando necesites líneas interiores o una sola arista.

¿Cómo quito los bordes de un rango en VBA?

Pon el estilo de línea a ninguno: Range("A1:D10").Borders.LineStyle = xlLineStyleNone borra cada borde del bloque, y Range("A1:D1").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone borra solo una arista. Si un borde se niega a desaparecer, probablemente lo dibuja un estilo de Tabla de Excel o una regla de Formato condicional, que son dueñas de sus propios bordes.

¿Qué valores de LineStyle y Weight puedo usar para los bordes en VBA?

LineStyle acepta xlContinuous, xlDash, xlDot, xlDashDot, xlDashDotDot, xlDouble, xlSlantDashDot y xlLineStyleNone. Weight es una de cuatro constantes — xlHairline, xlThin, xlMedium, xlThick — no un tamaño en puntos. Algunas combinaciones están restringidas: xlDouble ignora Weight, así que si un grosor parece no tener efecto, el estilo de línea es la razón.

Probado en

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

Guías relacionadas: VBA Merge Cells · VBA Color de celda · VBA Font · VBA With · VBA Range