Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Uso de Funciones Integradas | Fundamentos de VBA
Excel VBA para Automatización Empresarial

Uso de Funciones Integradas

Desliza para mostrar el menú

VBA incluye varios cientos de funciones integradas, y la mayoría de ellas nunca las utilizarás. Las siguientes aparecen con frecuencia en la automatización empresarial: limpieza de texto, manejo de fechas y conversión de tipos.

Funciones de fecha

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() y Date parecen similares pero responden a preguntas diferentes: Now() incluye la hora actual hasta el segundo (útil para registrar cuándo se ejecutó una macro), mientras que Date solo proporciona el día del calendario, que es lo que se necesita para todo lo relacionado con fechas de vencimiento o edades. DateAdd y DateDiff son imágenes opuestas: DateAdd proyecta hacia adelante o hacia atrás desde una fecha por una unidad dada ("d" para días, pero también funcionan "m" para meses y "yyyy" para años), mientras que DateDiff mide la diferencia entre dos fechas existentes.

Note
Nota

Los literales de fecha en VBA — cualquier cosa escrita entre símbolos #, como #01/09/2023# — siempre usan el orden MM/DD/YYYY internamente, sin importar la configuración regional de Windows o el idioma del sistema. Así que #01/09/2023# significa January 9, 2023, no el 1 de septiembre, incluso para quienes usan el formato DD/MM/YYYY en su día a día. Esto es diferente a cómo se escriben las fechas en una celda de hoja de cálculo, donde sí aplican las configuraciones regionales; el formato literal #...# es una regla específica de VBA que permanece fija sin importar dónde se ejecute el código.

Funciones de texto

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase y LCase son útiles para hacer comparaciones sin distinguir mayúsculas y minúsculas; por ejemplo, If UCase(category) = UCase("electronics") Then funciona sin importar cómo se escribió originalmente la categoría. Left, Right y Mid extraen una parte de una cadena, diferenciándose solo en el punto de inicio: Left y Right cuentan desde los extremos, mientras que Mid toma una posición inicial y una longitud, por lo que Mid("P001", 2, 3) y Right("P001", 3) devuelven lo mismo aquí — "P001" solo tiene un carácter de prefijo, así que "empezando desde la posición 2" y "los últimos 3 caracteres" llegan a la misma subcadena. Trim elimina silenciosamente los espacios al principio y al final — una función poco llamativa que resulta muy útil cuando los datos se han copiado y pegado desde lugares con espaciado inconsistente. InStr busca una cadena dentro de otra y devuelve la posición donde se encuentra (o 0 si no está), lo que permite comprobar si un nombre de producto contiene la palabra Mouse sin requerir coincidencia exacta.

Funciones numéricas

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round e Int ambos reducen un número, pero no de la misma manera: Round(24.996, 2) redondea al valor más cercano con 2 decimales (25.00, que se muestra como 25), mientras que Int(7.9) siempre trunca hacia cero sin importar cuán cerca esté el decimal de redondear hacia arriba, dando 7 en lugar de 8. Confundirlos es una fuente común de errores en precios: redondear un precio al centavo más cercano casi siempre debe hacerse con Round, no con Int, o se cobrará sistemáticamente de menos por una fracción de centavo en cada transacción.

Conversión de tipos

Crucial al extraer valores de una hoja, ya que los valores de celda suelen llegar como Variant:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl convierte a Double, CInt a Integer, CStr convierte a String y CDate convierte a un valor de tipo Date.

¿Por qué no dejar que VBA convierta automáticamente cuando sea necesario? Normalmente lo hará, pero depender de eso es frágil: una celda que parece un número pero en realidad fue escrita o importada como texto puede hacer que una comparación If o una operación aritmética falle o se comporte de manera inesperada, y la conversión explícita permite detectar ese error justo en la línea donde está el dato incorrecto, en lugar de tres pasos después.

Tarea

  1. Escribir una línea que extraiga solo la parte numérica de "P003" usando Mid (sugerencia: comenzar en la posición 2).
  2. Escribir una línea que convierta ese texto extraído en un número real con CInt o CLng.
  3. Usar DateDiff para calcular cuántos días han pasado desde que Emma Davis fue contratada (15/03/2020) hasta hoy.
Pista
expand arrow

1. Extracción de la parte numérica

  • Mid requiere tres elementos: la cadena de texto, la posición de inicio y cuántos caracteres tomar.
  • "P003" tiene una letra seguida de tres dígitos — se debe omitir la "P" y tomar todo lo que sigue.
  • La posición de inicio 2 significa "comenzar en el segundo carácter" — cuenta "P003" con los dedos para confirmar que la posición 2 es el primer "0".

2. Conversión a un número real

  • Lo que devuelve Mid sigue siendo texto, aunque parezca un número.
  • Encierra toda la expresión Mid(...) dentro de CInt(...) o CLng(...) — se convierte el resultado de una función usando otra.
  • Recordatorio de antes en el capítulo: CInt/CLng convierten texto a número entero; usa CLng si no estás seguro de que el número pueda ser grande.

3. Días desde la fecha de contratación

  • DateDiff necesita tres elementos: la unidad de medida ("d" para días), una fecha de inicio y una fecha de fin.
  • El detalle está en cómo escribir una fecha literal en VBA — encierra la fecha entre símbolos #, como #03/15/2020#. Dentro de #...#, VBA siempre espera el formato mes/día/año, sin importar la configuración regional — así que 15 de marzo es #03/15/2020#, no #15/03/2020#.
  • Para "hoy", no es necesario escribir una fecha — hay una palabra clave de la sección 2.3 que siempre devuelve la fecha actual.
  • Coloca esas dos fechas en DateDiff en el orden correcto — primero la fecha anterior — o el resultado será un número negativo.
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 3

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Uso de Funciones Integradas

VBA incluye varios cientos de funciones integradas, y la mayoría de ellas nunca las utilizarás. Las siguientes aparecen con frecuencia en la automatización empresarial: limpieza de texto, manejo de fechas y conversión de tipos.

Funciones de fecha

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() y Date parecen similares pero responden a preguntas diferentes: Now() incluye la hora actual hasta el segundo (útil para registrar cuándo se ejecutó una macro), mientras que Date solo proporciona el día del calendario, que es lo que se necesita para todo lo relacionado con fechas de vencimiento o edades. DateAdd y DateDiff son imágenes opuestas: DateAdd proyecta hacia adelante o hacia atrás desde una fecha por una unidad dada ("d" para días, pero también funcionan "m" para meses y "yyyy" para años), mientras que DateDiff mide la diferencia entre dos fechas existentes.

Note
Nota

Los literales de fecha en VBA — cualquier cosa escrita entre símbolos #, como #01/09/2023# — siempre usan el orden MM/DD/YYYY internamente, sin importar la configuración regional de Windows o el idioma del sistema. Así que #01/09/2023# significa January 9, 2023, no el 1 de septiembre, incluso para quienes usan el formato DD/MM/YYYY en su día a día. Esto es diferente a cómo se escriben las fechas en una celda de hoja de cálculo, donde sí aplican las configuraciones regionales; el formato literal #...# es una regla específica de VBA que permanece fija sin importar dónde se ejecute el código.

Funciones de texto

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase y LCase son útiles para hacer comparaciones sin distinguir mayúsculas y minúsculas; por ejemplo, If UCase(category) = UCase("electronics") Then funciona sin importar cómo se escribió originalmente la categoría. Left, Right y Mid extraen una parte de una cadena, diferenciándose solo en el punto de inicio: Left y Right cuentan desde los extremos, mientras que Mid toma una posición inicial y una longitud, por lo que Mid("P001", 2, 3) y Right("P001", 3) devuelven lo mismo aquí — "P001" solo tiene un carácter de prefijo, así que "empezando desde la posición 2" y "los últimos 3 caracteres" llegan a la misma subcadena. Trim elimina silenciosamente los espacios al principio y al final — una función poco llamativa que resulta muy útil cuando los datos se han copiado y pegado desde lugares con espaciado inconsistente. InStr busca una cadena dentro de otra y devuelve la posición donde se encuentra (o 0 si no está), lo que permite comprobar si un nombre de producto contiene la palabra Mouse sin requerir coincidencia exacta.

Funciones numéricas

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round e Int ambos reducen un número, pero no de la misma manera: Round(24.996, 2) redondea al valor más cercano con 2 decimales (25.00, que se muestra como 25), mientras que Int(7.9) siempre trunca hacia cero sin importar cuán cerca esté el decimal de redondear hacia arriba, dando 7 en lugar de 8. Confundirlos es una fuente común de errores en precios: redondear un precio al centavo más cercano casi siempre debe hacerse con Round, no con Int, o se cobrará sistemáticamente de menos por una fracción de centavo en cada transacción.

Conversión de tipos

Crucial al extraer valores de una hoja, ya que los valores de celda suelen llegar como Variant:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl convierte a Double, CInt a Integer, CStr convierte a String y CDate convierte a un valor de tipo Date.

¿Por qué no dejar que VBA convierta automáticamente cuando sea necesario? Normalmente lo hará, pero depender de eso es frágil: una celda que parece un número pero en realidad fue escrita o importada como texto puede hacer que una comparación If o una operación aritmética falle o se comporte de manera inesperada, y la conversión explícita permite detectar ese error justo en la línea donde está el dato incorrecto, en lugar de tres pasos después.

Tarea

  1. Escribir una línea que extraiga solo la parte numérica de "P003" usando Mid (sugerencia: comenzar en la posición 2).
  2. Escribir una línea que convierta ese texto extraído en un número real con CInt o CLng.
  3. Usar DateDiff para calcular cuántos días han pasado desde que Emma Davis fue contratada (15/03/2020) hasta hoy.
Pista
expand arrow

1. Extracción de la parte numérica

  • Mid requiere tres elementos: la cadena de texto, la posición de inicio y cuántos caracteres tomar.
  • "P003" tiene una letra seguida de tres dígitos — se debe omitir la "P" y tomar todo lo que sigue.
  • La posición de inicio 2 significa "comenzar en el segundo carácter" — cuenta "P003" con los dedos para confirmar que la posición 2 es el primer "0".

2. Conversión a un número real

  • Lo que devuelve Mid sigue siendo texto, aunque parezca un número.
  • Encierra toda la expresión Mid(...) dentro de CInt(...) o CLng(...) — se convierte el resultado de una función usando otra.
  • Recordatorio de antes en el capítulo: CInt/CLng convierten texto a número entero; usa CLng si no estás seguro de que el número pueda ser grande.

3. Días desde la fecha de contratación

  • DateDiff necesita tres elementos: la unidad de medida ("d" para días), una fecha de inicio y una fecha de fin.
  • El detalle está en cómo escribir una fecha literal en VBA — encierra la fecha entre símbolos #, como #03/15/2020#. Dentro de #...#, VBA siempre espera el formato mes/día/año, sin importar la configuración regional — así que 15 de marzo es #03/15/2020#, no #15/03/2020#.
  • Para "hoy", no es necesario escribir una fecha — hay una palabra clave de la sección 2.3 que siempre devuelve la fecha actual.
  • Coloca esas dos fechas en DateDiff en el orden correcto — primero la fecha anterior — o el resultado será un número negativo.
¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 3
some-alt