TL;DR —
source.AutoFill Destination, Typeextiende un patrón; no es una copia. Dos reglas te salvan: elDestinationdebe incluir el origen —Range("A1").AutoFill Destination:=Range("A1:A10")(A1 está dentro de A1:A10); excluir la semilla lanza el error 1004 de tiempo de ejecución. Y elTypedecide si obtienes una serie (xlFillSeries→ 1, 2, 3) o una copia (xlFillCopy→ 1, 1, 1); elxlFillDefaultpor defecto adivina. Si solo quieres copiar una celda hacia abajo por una columna,Range("B2:B1000").FillDownes más sencillo que pelearte con AutoFill.
' Serie: siembra el primer valor (o dos), luego extiende
Range("A1").Value = 1
Range("A1").AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries ' 1..10
' Formula hacia abajo por una columna: las refs relativas se ajustan por fila
Range("B2").Formula = "=A2*1.2"
Range("B2").AutoFill Destination:=Range("B2:B1000")
' Solo copia la celda de arriba hacia abajo - sin gimnasia de Destination
Range("B2:B1000").FillDown
AutoFill es la versión en código de arrastrar el controlador de relleno, y la gente espera que se comporte
como una copia — así que se sorprende cuando convierte 1 en 1, 2, 3, 4, y se queda perpleja cuando un
fragmento lanza 1004 sin motivo aparente. Las dos cosas cobran sentido en cuanto tienes clara la idea
central: AutoFill continúa un patrón a partir de una semilla por un destino que debe contener esa
semilla. Copiar repite; AutoFill genera. Acierta con el destino y el tipo y es la forma más limpia de
estampar una serie o empujar una fórmula hacia abajo por una columna.
Lo que aprenderás
- El modelo mental — AutoFill extiende un patrón, no copia
- La regla del destino — el origen debe estar dentro del destino, o 1004
Type— serie frente a copia, y por qué la suposición por defecto no es fiable- Rellenar una fórmula hacia abajo para que sus referencias se ajusten por fila
- Cuándo
FillDown/FillRight(o una matriz) le ganan a AutoFill
El modelo mental: AutoFill extiende un patrón
Copiar toma un valor y lo repite. AutoFill toma una semilla — la primera celda o las dos primeras — y
continúa el patrón que detecte: un número se convierte en una secuencia, 1, 2 se convierte en una serie
aritmética, Jan se convierte en los meses, una fecha se convierte en días consecutivos. Por eso existe
como algo aparte de Copy:
Range("A1").Value = 5
Range("A1").AutoFill Destination:=Range("A1:A5"), Type:=xlFillCopy ' 5, 5, 5, 5, 5
Range("C1").Value = 5
Range("C1").AutoFill Destination:=Range("C1:C5"), Type:=xlFillSeries ' 5, 6, 7, 8, 9
La misma semilla, el mismo destino — un Type distinto, un resultado completamente distinto. En cuanto ves
AutoFill como un generador que lee una semilla y produce un patrón, las dos reglas de abajo dejan de ser
arbitrarias: la semilla tiene que formar parte de lo que rellenas, y tienes que decirle qué patrón quieres.
La regla del destino: el origen debe estar dentro del destino
Este es el bug de AutoFill que frena a todo principiante: el rango Destination debe contener el rango de
origen. El origen es la semilla, y la semilla es la primera parte del relleno.
' MAL - el destino excluye la semilla -> error 1004 de tiempo de ejecucion
Range("A1").AutoFill Destination:=Range("A2:A10")
' BIEN - el destino incluye A1, la semilla
Range("A1").AutoFill Destination:=Range("A1:A10")
Piénsalo como «rellena A1 hasta A10», no «rellena A1 dentro de A2:A10». La fila de la semilla es donde
empieza el patrón, así que vive en la parte de arriba del destino. Las semillas de varias celdas funcionan
igual — siembra A1:A2 con 1 y 2, luego AutoFill Destination:=Range("A1:A100") y Excel lee el paso a
partir de las dos celdas semilla. Casi toda pregunta del tipo «AutoFill lanza 1004» es un destino que se
olvidó de incluir el origen.
Type: serie frente a copia, y la suposición por defecto poco fiable
Omite Type y obtienes xlFillDefault, que deja que Excel adivine a partir de la semilla — un número
solo se copia, 1, 2 hace una serie, Mon hace días laborables. Cómodo en la interfaz, arriesgado en
código, porque tu intención no queda por escrito y la suposición puede darse la vuelta. Nombra el tipo:
| Quieres | Type |
|---|---|
| 1, 2, 3, … | xlFillSeries |
| 1, 1, 1, … | xlFillCopy |
| Mon, Tue, Wed (salta fines de semana) | xlFillWeekdays |
| Días / meses / años consecutivos | xlFillDays / xlFillMonths / xlFillYears |
| Solo formato | xlFillFormats |
| Valores sin formato | xlFillValues |
Range("A1").Value = Date
Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillMonths ' mes a mes
La regla es sencilla: si el patrón importa, decláralo. Apoyarte en xlFillDefault es como acabas con un
1, 1, 1 copiado donde querías 1, 2, 3, o una serie escalonada donde querías una repetición.
Rellenar una fórmula hacia abajo por una columna
El AutoFill más útil del día a día es empujar una fórmula hacia abajo por una columna. Rellena una fórmula y sus referencias relativas se ajustan por fila, exactamente como arrastrar el controlador de relleno:
Range("B2").Formula = "=A2*C2"
Range("B2").AutoFill Destination:=Range("B2:B1000") ' B3 pasa a ser =A3*C3, B4 =A4*C4, ...
xlFillDefault gestiona esto correctamente con las fórmulas, así que rara vez necesitas especificar Type
aquí. Es el idiomático «aplica esta fórmula a toda la columna», y es la razón por la que AutoFill se gana su
sitio aunque exista FillDown — AutoFill puede sembrar y extender una serie real, cosa que una copia
simple no puede. Si prefieres escribir la fórmula una vez y dejar que se ajuste sin el modelo del controlador
de relleno, .FormulaR1C1 hace el mismo trabajo; consulta VBA Formula.
Cuándo FillDown, FillRight, o una matriz le ganan a AutoFill
AutoFill es un motor de patrones. Cuando no estás generando un patrón — solo quieres la celda de arriba repetida hacia abajo o a lo ancho — las herramientas más sencillas son más claras y se saltan la ceremonia de que el destino incluya el origen:
Range("B2:B1000").FillDown ' copia B2 hacia abajo por todo el rango
Range("B2:Z2").FillRight ' copia B2 a lo ancho de toda la fila
FillDown y FillRight no llevan Type ni un Destination aparte — el rango sobre el que los llamas es
el relleno, con la celda de arriba como semilla. Para una serie puramente numérica sin fórmulas, escribir una
matriz Variant al rango en una sola asignación es aún más rápido y evita del todo
la operación sobre la hoja. Mi regla: echa mano de AutoFill solo cuando necesitas el motor de patrones de
Excel — una serie real, días laborables, listas personalizadas — y usa FillDown / FillRight o una matriz
para una copia simple. Para rellenos grandes, desactiva primero el recálculo y la actualización de pantalla;
consulta VBA Calculation y VBA ScreenUpdating.
Cómo ayuda ExcelMaster
Los errores de AutoFill que hacen perder tiempo son predecibles: el destino que excluye la semilla y lanza
1004, el Type que falta y copió cuando querías una serie, y la pelea con AutoFill para un trabajo que en
realidad era un FillDown de una línea. Ninguno es difícil una vez que los conoces — solo que es fácil
equivocarse de memoria.
ExcelMaster elige la herramienta
adecuada para la forma del trabajo. Pídele «numera estas filas del 1 al 500» y siembra y extiende una serie
con el destino incluyendo la semilla; pídele «copia esta fórmula hacia abajo hasta la última fila» y usa
FillDown contra el rango usado en lugar de una altura frágil codificada a mano. Declara el Type para que
la intención esté sobre el papel, y baja a una escritura de matriz simple cuando solo necesitas valores. Tú
describes el patrón; él lo estampa sin el 1004.
Preguntas frecuentes
¿Cómo uso AutoFill en VBA?
Llama a AutoFill sobre el rango semilla y pasa un Destination que incluya la semilla:
Range("A1").AutoFill Destination:=Range("A1:A10"), Type:=xlFillSeries. La semilla es el primer valor o los
dos primeros, el Destination es todo el rango a rellenar (semilla incluida), y Type dice si extender una
serie o copiar. Fija primero la celda semilla, luego llama a AutoFill.
¿Por qué me da el error 1004 de tiempo de ejecución con AutoFill?
Casi siempre porque el Destination no contiene el origen. Range("A1").AutoFill Destination:=Range("A2:A10")
excluye la semilla A1 y lanza 1004; usa Range("A1:A10") en su lugar para que la semilla quede en la parte
de arriba del destino. Léelo como «rellena A1 hasta A10», no «rellena A1 dentro de A2:A10».
¿Cuál es la diferencia entre AutoFill y FillDown en VBA?
FillDown copia la celda de arriba de un rango hacia abajo por todo el rango — sin Type, sin un
Destination aparte, solo Range("B2:B1000").FillDown. AutoFill extiende un patrón a partir de una
semilla y necesita un Destination que incluya la semilla. Usa FillDown (o FillRight) para una copia
simple, y AutoFill cuando necesitas una serie real como 1, 2, 3 o los meses.
¿Cómo relleno una fórmula hacia abajo por una columna con AutoFill en VBA?
Escribe la fórmula en la celda semilla, luego rellénala hacia abajo con AutoFill:
Range("B2").Formula = "=A2*C2" seguido de Range("B2").AutoFill Destination:=Range("B2:B1000"). Las
referencias relativas se ajustan por fila, así que B3 pasa a ser =A3*C3. Puedes omitir Type con las
fórmulas. Range("B2:B1000").FillDown hace lo mismo de forma más sencilla.
¿Cómo relleno una serie de fechas o meses con AutoFill?
Siembra la primera fecha y pasa un Type de fecha: Range("A1").Value = Date y luego
Range("A1").AutoFill Destination:=Range("A1:A31"), Type:=xlFillDays para días consecutivos, o
xlFillMonths / xlFillWeekdays / xlFillYears para esos pasos. Nombrar el tipo evita depender de que
xlFillDefault adivine el patrón a partir de la semilla.
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 Formula · VBA Copy Paste · VBA Range · VBA ScreenUpdating
