Un par de años atrás escribí una entrada en el blog explicando algo más sobre las fórmulas tridimensionales (fórmulas 3D) en Excel (ver).
En particular, era interesante conocer las limitaciones en cuanto a operaciones a realizar sobre diferentes hojas: SUMA, PROMEDIO, PROMEDIOA, CONTARA, MAXA,MIN, MINA, PRODUCTO, DESVEST, DESVESTA, DESVESTP, DESVESTPA, VAR, VARA, VARP y VARPA.
La cuestión entonces es ¿qué ocurre si pretendo realizar una suma condicionada sobre varias hojas de un mismo libro?. La respuesta es clara, tendremos que crear nuestra UDF o función VBA personalizada.
Planteemos un ejemplo sencillo. Queremos sumar el valor de la celda A1 de diferentes hojas sólo cuando este valor sea mayor que 2014.
Tenemos un Libro con 5 hojas con datos en la celda A1 (valdría valores en un rango de celdas...):
Y en una última hoja 'Total' queremos 'consolidar' los datos, pero sólo los mayores a 2014.
Es decir, sabemos que debemos consolidar las Hojas 1 a 5, que están seguidas/consecutivas en orden de disposición.
Añadiremos nuestro código asociándolo a un Módulo; para ello accederemos a la ventana de código del explorador del editor de VBA, donde insertaremos el siguiente código VBA:
Listos para probarla, en alguna celda de la hoja de cálculo, por ejemplo en la celda C1 de la hoja Total escribimos:
=Suma3Dmayor2014(A1)
el resultado será de 4.031 (es decir, 0+0+0+2015+2016 0 4.031), esto es, sólo ha sumado los importes de las diferentes hojas, en la celda informada en nuestra función A1, que cumplen la condición definida (valores mayores a 2014).
En particular, era interesante conocer las limitaciones en cuanto a operaciones a realizar sobre diferentes hojas: SUMA, PROMEDIO, PROMEDIOA, CONTARA, MAXA,MIN, MINA, PRODUCTO, DESVEST, DESVESTA, DESVESTP, DESVESTPA, VAR, VARA, VARP y VARPA.
La cuestión entonces es ¿qué ocurre si pretendo realizar una suma condicionada sobre varias hojas de un mismo libro?. La respuesta es clara, tendremos que crear nuestra UDF o función VBA personalizada.
Planteemos un ejemplo sencillo. Queremos sumar el valor de la celda A1 de diferentes hojas sólo cuando este valor sea mayor que 2014.
Tenemos un Libro con 5 hojas con datos en la celda A1 (valdría valores en un rango de celdas...):
Y en una última hoja 'Total' queremos 'consolidar' los datos, pero sólo los mayores a 2014.
Es decir, sabemos que debemos consolidar las Hojas 1 a 5, que están seguidas/consecutivas en orden de disposición.
Añadiremos nuestro código asociándolo a un Módulo; para ello accederemos a la ventana de código del explorador del editor de VBA, donde insertaremos el siguiente código VBA:
Function Suma3Dmayor2014(celdas As Range) As Variant
Dim primerahoja As String, ultimahoja As String
'definimos cuáles son nuestras hojas límites...
primerahoja = Hoja1.Name
ultimahoja = Hoja5.Name
Dim HjInicio As Long, HjFin As Long
Dim HjActual As Long
Dim Addr As String
Dim rng As Range
Dim SumaAcum As Double
Dim SheetDataRange As Range
Application.Volatile
With ThisWorkbook.Worksheets
' Si se produce un error, construir el mensaje de error
' Inicializa el controlador de error.
On Error Resume Next
Err.Clear
'controlamos el tipo posible de error
'si no existiera la Hoja1
HjInicio = .Item(primerahoja).Index
If Err.Number <> 0 Then
Suma3Dmayor2014 = CVErr(xlErrRef)
Exit Function
End If
'si no existiera la Hoja5
HjFin = .Item(ultimahoja).Index
If Err.Number <> 0 Then
Suma3Dmayor2014 = CVErr(xlErrRef)
Exit Function
End If
'si por alguna causa la Hoja Inicial (Hoja1) no está situada a la izquierda de la Hoja final (Hoja5)
If HjInicio > HjFin Then
Suma3Dmayor2014 = CVErr(xlErrRef)
Exit Function
End If
'si no hemos identificado qué celda/s sumar en nuestra función
If celdas Is Nothing Then
Suma3Dmayor2014 = CVErr(xlErrRef)
Exit Function
End If
' Addr es la dirección del rango indicado en nuestra función UDF para sumar.
Addr = celdas.Address
'recorremos las diferentes hojas desde la Hoja1 a la Hoja5
For HjActual = HjInicio To HjFin
'Usamos Addr para construir un rango de valores.
Set SheetDataRange = .Item(HjActual).Range(Addr)
'recorremos el rango de celdas por las hojas de estudio
For Each rng In SheetDataRange.Cells
If Len(rng.Value) > 0 Then
If rng.Value > 2014 Then
'acumulamos los valores que cumplan nuestra condición >2014
SumaAcum = SumaAcum + rng.Value
End If
End If
Next rng
Next HjActual
End With
'Suma final llevada a la Hoja de cálculo.
Suma3Dmayor2014 = SumaAcum
End FunctionListos para probarla, en alguna celda de la hoja de cálculo, por ejemplo en la celda C1 de la hoja Total escribimos:
=Suma3Dmayor2014(A1)
el resultado será de 4.031 (es decir, 0+0+0+2015+2016 0 4.031), esto es, sólo ha sumado los importes de las diferentes hojas, en la celda informada en nuestra función A1, que cumplen la condición definida (valores mayores a 2014).



No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.