jueves, febrero 12, 2015

Copiar suma de varias celdas a una única celda como valor

Cada post que publico lleva por lo menos una etiqueta que identifica el contenido. A lo largo del tiempo he creado muchas etiquetas, como puede verse en la nube de etiquetas en la columna derecha del blog (o izquierda, si es que se me da por cambiar la plantilla).
Para este post debiera haber creado una nueva etiqueta, algo así como "técnicas complicadas para resolver problemas no tan graves existiendo otras técnicas más sencillas". Pero como resulta un poco largo seguramente terminaré endosándole la lacónica etiqueta "Macros".

La situación es la siguiente: en una hoja de Excel hay datos numéricos "desparramados" en varias celdas; la misión es sumar todos los valores y poner el resultado en una única celda. Esta celda debe contener un valor constante, no una fórmula. A los efectos del ejemplo uso una única hoja; el problema real comprendía varias hojas.

¿Cuáles son las opciones?
  1. Tomar un papel y un lápiz, hacer la cuenta y teclear el resultado.
  2. Totalizar los datos en una celda, copiar el resultado y pegarlo en la celda indicada como valor.
  3. Usar una macro para agilizar el proceso.
La primera opción es una broma. El problema con la segunda opción es lo tedioso del proceso.

Nos queda así la opción de la macro, que es la que utilice al enfrentarme con el problema.

El código de la macro es la siguiente

Sub copy_and_sum()
    Dim rngCell As Range, dblTemp As Double
    Dim dblTotSum As New DataObject

    For Each rngCell In Selection
        If IsNumeric(rngCell) Then
            dblTemp = dblTemp + rngCell
        End If
    Next rngCell


    With dblTotSum
        .SetText dblTemp
        .PutInClipboard
    End With

End Sub

Para utilizar la macro comenzamos por seleccionar las celdas que queremos totalizar (clic a la primer celda y Ctrl-Clic a las restantes); luego activamos la macro (con ALT-F8 o un atajo de teclado); la macro suma los valores numéricos de las celdas y copia el total al Clipboard. Finalmente usamos Ctrl-V o Pegar para pegar el valor en la celda correspondiente.



Esta macro usa el objeto DataObject por lo que hay que activar la referencia al Microsoft Forms 2.0 Object Library.


A pesar de que este objeto está definido para copiar texto al Clipboard, podemos ver que también lo hará con valores numéricos y lo que es más importante, nos permitirá ir sumándolos.

En la primera parte del código usamos un loop For Each Next para asignar los valores numéricos a la variable dblTemp e ir sumándolos. En la segunda parte del código empezamos por asignar el valor de dblTemp al objeto dblTotSum para luego copiarlo al Clipboard con el método PutinClipboard.

3 comentarios:

  1. Pues tomatelo a broma o a risa o a lo que quieras, pero la primera opción ya la he visto hacer varias veces.

    ResponderBorrar
  2. que tal Jorge, no me funciona esta macro, me indica error en: dblTotSum As New DataObject User-Defined Type not Defined. Y a revise lo de "Forms 2.0 Object Library" y esta activo. o esto es otro tipo de erorr. Tengo excel 2016

    ResponderBorrar
  3. Hola Humberto, he probado la macro en Excel 2016 (Office 365 Home) y funciona. El único motivo que conozco para el tipo de error que señalas es que el Forms 2.0 no esté activo...

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.