TL;DR — Un tipo de dato es la forma y el tamaño de la caja de una variable. Elige una demasiado pequeña y el valor se desborda; echa mano de la caja perezosa para todo (
Variant) y lo pagas en velocidad y errores ocultos. Dos reglas cubren el 90 % del código real: usaLongpara todo número entero (Integerse desborda en 32.767, y una hoja tiene 1.048.576 filas) y usaDoublepara las matemáticas, yCurrencyo el redondeo para el dinero (Doubleno puede guardar0.1 + 0.2de forma exacta). Todo lo demás —String,Boolean,Date— lo eliges para que encaje con el valor, y reservasVariantpara los pocos casos que de verdad lo necesitan.
Dim rowCount As Long ' números enteros — SIEMPRE Long, nunca Integer
Dim price As Double ' medidas y matemáticas
Dim total As Currency ' dinero — exacto a 4 decimales
Dim name As String ' texto
Dim isPaid As Boolean ' True / False
Dim dueDate As Date ' una fecha/hora
Elegir un tipo parece una formalidad, pero en realidad es una decisión sobre a qué modos de fallo te expones. El tipo equivocado no siempre da error: a veces se limita a devolver, en silencio, el número equivocado. Esta guía está organizada en torno a las trampas, porque es lo que de verdad decide qué caja usar.
Lo que aprenderás
- Por qué
Integeres una trampa yLongdebería ser tu opción por defecto para los números enteros - Qué es
Varianten realidad, y los pocos casos en que es la elección correcta - Por qué
Doublecorrompe el dinero y qué usar en su lugar - Cómo leer los dos errores de tipo: Desbordamiento (6) y No coinciden los tipos (13)
- Una regla de una línea para elegir tipo cuando dudes
El modelo mental: el tipo es la forma de la caja
Si una variable es una caja, el tipo es su forma y su capacidad. Long es una
caja hecha para números enteros de hasta unos dos mil millones. String se estira
para dar cabida al texto. Boolean es una caja con sitio para exactamente dos
estados. Double guarda números fraccionarios, pero en una aproximación binaria.
Variant es una caja mutable que se amolda a lo que sea que le eches dentro.
Todo tipo es un intercambio. Un tipo ajustado y específico caza los errores pronto
y corre rápido; un tipo laxo (Variant) acepta cualquier cosa y aplaza el error a
más tarde, a algún sitio más difícil de encontrar. Así que «¿qué tipo?» es la
misma pregunta que «¿qué estoy dispuesto a que salga mal?».
La regla que evita el Desbordamiento: usa Long, nunca Integer
VBA tiene dos tipos de número entero, y uno de ellos es una reliquia. Integer es
de 16 bits: su techo es 32.767. Long es de 32 bits: pasa de los dos mil
millones. En cuanto se le pide a un Integer que sostenga 32.768, VBA lanza
«Desbordamiento» (error 6) y se detiene.
La víctima clásica es un contador de filas:
' FRÁGIL — se desborda en cuanto la hoja tiene > 32,767 filas
Dim r As Integer
For r = 1 To lastRow ' error 6 en la fila 32,768
' ...
Next r
' CORRECTO — Long maneja las 1,048,576 filas
Dim r As Long
For r = 1 To lastRow
' ...
Next r
Una hoja moderna tiene 1.048.576 filas: treinta y dos veces por encima del
límite de Integer. Cualquier variable que cuente filas, guarde un número .Row
o acumule una suma grande tiene que ser Long. Y aquí viene lo mejor: en el
hardware de hoy Integer no aporta ninguna ventaja de velocidad; VBA lo
convierte de todos modos a un valor de 32 bits por dentro. Así que la regla no
tiene inconveniente: usa Long para todo número entero y olvida que Integer
existe.
La regla sobre Variant: es una elección deliberada, nunca un valor por defecto
Cualquier variable que declares sin tipo —Dim x— es un Variant, igual que toda
variable sin declarar. Un Variant guarda cualquier cosa: un número ahora, texto
después, un array, un objeto. Suena cómodo, y por eso los principiantes se apoyan
en él. También por eso se les esconden los errores.
Los costes son reales. Un Variant gasta más memoria, corre más despacio y —lo
más importante— no caza los errores de tipo. Un número que llega como texto sigue
siendo texto dentro de un Variant y falla en silencio en un cálculo posterior,
allí donde un Long habría dado error de inmediato, en el punto mismo del error.
Pero Variant tiene un uso genuinamente estupendo, y vale la pena conocerlo porque
es rápido: leer un Range entero en memoria de una sola vez.
' El ÚNICO gran uso de Variant: cargar un rango en un array 2-D de una sola vez
Dim data As Variant
data = ThisWorkbook.Worksheets("Data").Range("A1:C1000").Value
Dim i As Long
For i = 1 To UBound(data, 1)
data(i, 2) = data(i, 2) * 1.1 ' trabaja en memoria — sin idas y venidas celda a celda
Next i
Range("A1:C1000").Value = data ' vuélvelo a escribir de una sola vez
Ese patrón es muchísimo más rápido que tocar las celdas de una en una, y exige
un Variant porque Excel te entrega un array Variant. Usa Variant aquí, y para
valores que de verdad sean mixtos. En todo lo demás, declara el tipo real.
La regla sobre el dinero: Double miente en el último céntimo
Double es coma flotante binaria, así que no puede representar todos los decimales
de forma exacta: el resultado famoso es que 0.1 + 0.2 no es exactamente 0.3.
Para un gráfico o un cálculo de física eso es invisible. Para el dinero, esos
errores minúsculos se acumulan y tus totales se desvían un céntimo, que es justo la
clase de cosa que un auditor detecta.
Dim a As Double
a = 0.1 + 0.2
Debug.Print (a = 0.3) ' -> False (a vale 0.30000000000000004)
Dim m As Currency
m = 0.1 + 0.2
Debug.Print (m = 0.3) ' -> True (Currency es exacto a 4 decimales)
Usa Currency para el dinero: es un tipo de coma fija, exacto a cuatro
decimales y hecho precisamente para esto. Si tienes que usar Double (pongamos que
necesitas más de cuatro decimales), redondea a conciencia con Round() o
Format() antes de comparar o guardar. Nunca compruebes la igualdad exacta de dos
valores Double; compara dentro de una tolerancia en su lugar.
Un recorrido rápido por los tipos de cada día
String— texto. De longitud variable por defecto; rara vez necesitas longitud fija.Boolean—True/False. Perfecto para banderas (isPaid,found).Date— una fecha o una hora, o ambas. Por dentro es un número (el mismo número de serie que usa Excel), y por eso puedes hacer aritmética de fechas.Long— tu número entero por defecto, como se ha visto.Double— tu número fraccionario por defecto para matemáticas y medidas.Currency— dinero.Variant— solo uso deliberado.
Una trampa más que encaja aquí: Dim i, j As Long deja como Long solo a j;
i es un Variant. Cada variable necesita su propio As Type. Esa mecánica de la
declaración está cubierta al completo en VBA Dim.
Cómo ayuda ExcelMaster
Los errores de tipo —un desbordamiento en una hoja grande, un Double que se
desvía un céntimo, un Variant que enmascara un error de texto frente a número—
son de los de combustión lenta: la macro se ejecuta y la respuesta equivocada
aparece más adelante. Acertar con los tipos es auténtica disciplina de ingeniería,
y es disciplina que tienes que repetir en cada macro.
ExcelMaster
toma la tarea en lenguaje natural —«suma la columna D como moneda, cuenta las
filas, marca todo lo que pase del presupuesto»— y se encarga de las decisiones de
tipo por ti: Long para los recuentos, aritmética exacta para el dinero, sin
desbordamientos silenciosos en una hoja de un millón de filas. Tú sigues
escribiendo macros tipadas donde necesites control fino; para el trabajo de cada
día, describes el resultado y te saltas la clase de errores que los tipos están ahí
para evitar.
Preguntas frecuentes
¿Cuál es la diferencia entre Integer y Long en VBA?
Integer es un número entero de 16 bits limitado a 32.767; Long es de 32
bits y pasa de los dos mil millones. Como una hoja tiene 1.048.576 filas e
Integer no ofrece ninguna ventaja de velocidad en el Excel moderno, deberías
usar Long para todo número entero y evitar Integer por completo. Superar el
límite de Integer provoca «Desbordamiento» (error 6).
¿Debería usar Variant en VBA?
Solo de forma deliberada. Variant guarda cualquier valor, pero gasta más memoria,
corre más despacio y esconde errores de tipo (un número guardado como texto no dará
error hasta más tarde). Su único uso excelente es leer un Range entero en un
array 2-D (data = Range("A1:C1000").Value), que es muy rápido. En todo lo demás,
declara el tipo específico.
¿Qué tipo de dato debo usar para el dinero en VBA?
Usa Currency. Es un tipo de coma fija exacto a cuatro decimales, así que
evita la deriva de redondeo de Double (que no puede guardar 0.1 + 0.2 de forma
exacta). Si usas Double para el dinero, redondea explícitamente con Round()
antes de comparar o guardar, y nunca compruebes la igualdad exacta de dos valores
Double.
¿Cuál es el tipo de dato por defecto en VBA?
Variant. Cualquier variable declarada sin As Type —o usada sin declararse
siquiera— es un Variant. Es cómodo pero propenso a errores, y por eso la
disciplina recomendada es Option Explicit más tipos explícitos.
¿Por qué me sale «No coinciden los tipos» (error 13)?
Asignaste un valor que no encaja en el tipo de la variable; por ejemplo, meter el
texto "abc" en un Long, o una celda con un valor de error en un Double.
Comprueba qué hay de verdad en la celda o la variable (el texto con aspecto
numérico es un culpable habitual) y conviértelo explícitamente con CLng, CDbl
o CStr antes de asignar.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 31/07/2026.
Guías relacionadas: VBA Dim · VBA Const · VBA CStr · VBA Array · VBA For Loop
