HOWTO · VBA

La función Sum en VBA

Usa la función de hoja de cálculo SUM de Excel desde VBA para sumar uno o varios rangos, escribir un resultado en una celda y sumar matrices o valores que cumplan una condición.

En esta página

Para usar la función SUM de Excel en VBA, llama a WorksheetFunction.Sum y pásale un rango o varios valores. SUM es una función de hoja de cálculo de Excel expuesta a VBA mediante el objeto WorksheetFunction; no es una función integrada independiente de VBA. Los procedimientos completos de VBA que aparecen a continuación se pueden copiar, pero no se ejecutaron porque el entorno de ejecución configurado no admite VBA.

Cómo usar la función SUM de Excel en VBA

La forma general es Application.WorksheetFunction.Sum(argument1, argument2, ...). Si una macro podría ejecutarse mientras otra hoja está activa, usa una referencia completa a la hoja para que el cálculo siempre lea los datos de la hoja prevista. Los ejemplos usan ThisWorkbook.Worksheets("Sales"); el libro debe contener una hoja con ese nombre.

Sumar uno o más rangos

Estos procedimientos rellenan la hoja Sales con valores de ejemplo, calculan un total y lo escriben en E2. El primero suma B2:B4 (12 + 8 + 5 = 25). El segundo pasa B2:B3 y D2:D3 como argumentos de rango independientes (12 + 8 + 5 + 10 = 35), que es la forma de sumar rangos no contiguos.

Un rango:

Sub SumOneRange()
    Dim ws As Worksheet
    Dim total As Double

    Set ws = ThisWorkbook.Worksheets("Sales")
    ws.Range("B2").Value = 12
    ws.Range("B3").Value = 8
    ws.Range("B4").Value = 5

    total = Application.WorksheetFunction.Sum(ws.Range("B2:B4"))
    ws.Range("E2").Value = total
End Sub

Dos rangos independientes:

Sub SumTwoRanges()
    Dim ws As Worksheet
    Dim total As Double

    Set ws = ThisWorkbook.Worksheets("Sales")
    ws.Range("B2").Value = 12
    ws.Range("B3").Value = 8
    ws.Range("D2").Value = 5
    ws.Range("D3").Value = 10

    total = Application.WorksheetFunction.Sum( _
        ws.Range("B2:B3"), ws.Range("D2:D3"))
    ws.Range("E2").Value = total
End Sub

Para un rango, Sum recibe un objeto Range. Para dos, recibe cada objeto Range como argumento independiente; no combines las direcciones en una sola cadena de rango. En ambos procedimientos, asignar total a ws.Range("E2").Value guarda el resultado calculado en E2.

El siguiente ejemplo ejecutable de Python ilustra la suma de los valores 12, 8 y 5; no llama a WorksheetFunction.Sum ni ejecuta Excel o VBA.

Ejecuta este ejemplo:

values = [12, 8, 5]
total = sum(values)
print(total)
25

Escribir la suma en una celda de la hoja de cálculo

Los procedimientos anteriores guardan el resultado en una variable y luego lo asignan a la propiedad Value de la celda de destino. El patrón general es total = Application.WorksheetFunction.Sum(ws.Range("B2:B10")), seguido de ws.Range("E2").Value = total. En VBA, el resultado se asigna a Value mediante =. Calificar por completo tanto el rango de origen como la celda de destino evita depender de la hoja que esté activa.

Sumar una matriz en VBA

Cuando los valores ya están en una matriz de VBA, un bucle permite controlar directamente la acumulación. Array(...) devuelve una matriz Variant, así que declara numbers As Variant; inicializa total antes del bucle y suma cada elemento desde LBound(numbers) hasta UBound(numbers). Este procedimiento completo suma 15 y lo muestra en la ventana Inmediato de VBA. Acumula los valores en VBA y no llama a la función SUM de la hoja de cálculo de Excel. El ejemplo de VBA no se ejecutó en el entorno configurado.

Sub SumArray()
    Dim numbers As Variant
    Dim total As Double
    Dim i As Long

    numbers = Array(1, 2, 3, 4, 5)
    total = 0

    For i = LBound(numbers) To UBound(numbers)
        total = total + numbers(i)
    Next i

    Debug.Print total
End Sub

Sumar valores que cumplan una condición

Este procedimiento escribe valores de ejemplo en A2:A6 de Sales, suma solo los valores mayores que 5 y muestra el total (22) en la ventana Inmediato de VBA. La instrucción If determina qué valores se agregan al total acumulado. Se trata de una suma condicional en VBA. Para sumar con una condición en una hoja de cálculo, Excel también ofrece SUMIF; puedes llamarla mediante WorksheetFunction.SumIf si se adapta mejor a la tarea. El ejemplo de VBA no se ejecutó en el entorno configurado.

Sub SumValuesGreaterThanFive()
    Dim ws As Worksheet
    Dim total As Double
    Dim i As Long

    Set ws = ThisWorkbook.Worksheets("Sales")
    ws.Range("A2").Value = 2
    ws.Range("A3").Value = 6
    ws.Range("A4").Value = 9
    ws.Range("A5").Value = 4
    ws.Range("A6").Value = 7

    total = 0
    For i = 2 To 6
        If ws.Cells(i, 1).Value > 5 Then
            total = total + ws.Cells(i, 1).Value
        End If
    Next i

    Debug.Print total
End Sub

Preguntas frecuentes

¿Qué hace WorksheetFunction.Sum? Llama desde VBA a la función SUM de la hoja de cálculo de Excel y devuelve el total de los valores numéricos o rangos proporcionados.

¿Puede sumar rangos no contiguos? Sí. Pasa cada rango como argumento independiente, como se muestra arriba.

¿Cómo se tratan las celdas no numéricas? SUM de Excel ignora el texto y las celdas vacías de los rangos referenciados; los valores proporcionados directamente como argumentos pueden tener un comportamiento de conversión distinto. Si el resultado depende del tratamiento de entradas mixtas, comprueba los datos y usa rangos de forma coherente.

¿Se pueden usar rangos de distintas hojas? Sí. Pasa referencias calificadas por separado, como Worksheets("North").Range("B2:B10") y Worksheets("South").Range("B2:B10"), como argumentos de la misma llamada a SUM.