martes, 18 de enero de 2011

VBA: macro para acumular cantidades.

Contestaré hoy a una petición curiosa que me ha llegado a través del mail. Un usuario quería que en una tabla definida en un rango concreto (A2:C5) se fueran acumulando cantidades según introducía entradas de datos:

...Quiero que en cada fila de concepto, pueda meter una cantidad y que se sume en acumulado, luego, en una 2ª entrada meter en otra cantidad y que acumule la de la 1ª entrada y la de la 2ª y as'ísucesivamentre. Y todo esto que se pueda hacer en cada fila de conceptos. Como puedes ver en el siguiente ejemplo en la fila leche en la primera entrada meto 20 y acumula 20. En la segunda entrada en la misma casilla borro 20 y meto 30 y en acumulado debe quedar 50. En la tercera entrada en el concepto leche, en la misma casilla borro 30 y meto 40, acumulándose en lqa misma fila de acumulado 90. Así con el resto de filas: pan, tomate...
entrada 1
concepto cantidad acumulado
leche 20 20
pan 10 10
tomate 40 40

entrada 2
concepto cantidad acumulado
leche 30 50
pan 15 25
tomate 25 65

entrada 3
concepto cantidad acumulado
leche 40 90
pan 25 50
tomate 5 70


Veamos cuál es la plantilla sobre la que volcaremos nuestra programación:

VBA: macro para  acumular cantidades.


La idea es que cada vez que el usuario introduzca los nuevos valores para la Leche, Pan y Tomate, podamos ejecutar nuestra macro, para que automáticamente genere la suma acumulada de esta entrada con todas las anteriores.
Para ello he construido una macro muy sencilla, que ejecutaremos tras la introducción de los nuevos datos para los distintos conceptos de cada entrada.
Abrimos el Editor de VBA (Alt+F11) e insertamos un nuevo Módulo, en el cuál incluiremos el siguiente código:

'macro que calcula el acumulado de todas las entradas de datos.

Sub acumular()
Dim iAs Integer
x = 1
For i = 3 to 5
'realiza la suma acumulada del valor anterior mas el nuevo
'para cada concepto (Leche, Pan, Tomate).

Cells(i, 3).Formula = Cells(i, 3).Value + Cells(i, 2).Value
'limpia los campos para poder introducir los nuevos valores
'para cada concepto (Leche, Pan, Tomate).

Cells(i, 2).ClearContents
Next i
'Da formato personalizado, añadiendo el texto Entrada
Range("A1").NumberFormat = """Entrada ""0"
'genera un autonumérico en la celda A1
'que nos indicará qué entrada es la última introducida.

Range("A1").Value = Range("A1").Value + x

End Sub


Para ejecutar de manera cómoda nuestra macro, la asignaremos a un botón.
Al ejecutar nuestra macro acumular conseguimos identificar la última entrada editada (celda A1), así como el último valor acumulado (rango C3:C5).

VBA: macro para  acumular cantidades.


Tras 5 entradas de valores hemos obtenido un acumulado de Leche 50, Pan 100 y Tomate 150, quedando lista la tabla para la edición de los valores de la siguiente entrada.

2 comentarios:

  1. Me sirvió de mucho la solución que propones. Para una situación similar, pero con 17 columnas hice lo siguiente.

    For c = 8 To 17
    For f = 6 To 100

    Hoja4.Cells(f, c) = Hoja4.Cells(f, c) + Hoja3.Cells(f, c)

    Next f

    Next c

    Pero tengo el problema de que el contador de f (filas) no se detiene hasta que hace la iteración 100 aunque, por ejemplo, a partir de la fila 10 ya no hayan más celdas que contengan datos.

    Me podrías ayudar a que la operación se detenga en el momento en que llegue a una fila en blanco o sin datos.

    Saludos,

    Roberto

    ResponderSuprimir
  2. Hola Roberto,
    entiendo que tus registros empiezan en la fila 6 pero no sabes hasta qué fila llegan (no que tengas saltos entres esas 94 filas que has marcado).
    Si es así, entonces yo cambiaría el 100 por una variable definida por ti...
    echa un vistazo a
    http://excelforo.blogspot.com/2010/05/macro-para-convertir-en-numero-valores.html
    en este post puedes ver un ejemplo de cómo definir la variable que necesitarías.
    Basicamente con la variable localizamos la última fila con datos de tu hoja de trabajo.
    Espero te sirva.
    Un saludo

    ResponderSuprimir