martes, 6 de junio de 2017

VBA: Las matriciales en las macros de Excel - FormulaArray

Un lecto dejaba un comentario en el blog preguntando sobre el uso de las fórmulas matriciales desde nuestras macros en Excel.
Para dar respuesta al lector emplearemos la propiedad .FormulaArray asociado a un objeto Range.


Para evitar errores en la aplicación de esta propiedad deberemos recordar algunas limitaciones de las funciones matriciales (dentro de VBA y en la hoja de cálculo):
1-No funcionan sobre Celdas Combinadas.
2-No podemos sobrepasar, al construir nuestra matricial, los 255 caracteres!!!.
3-En nuestras macros se admiten los dos estilos de referencia: A1 y R1C1 !!! (a pesar de lo que indica la ayuda de Excel).
4-No se puede modificar/eliminar la parte de una matricial aplicada sobre un mismo rango.
5-No todas las funciones de Excel admiten su forma matricial.
6-No debemos escribir las llaves {} que delimitan nuestra fórmula matricial... aparecen al validar las fórmulas presionando Ctrl+Mayusc+Enter, o bien desde las macros al mostrarlas con la propiedad .FormulaArray.


Trabajaremos sobre nuestro rango de celdas de la siguiente imagen:

VBA: Las matriciales en las macros de Excel - FormulaArray



Abrimos la ventana de código de nuestro módulo estándar y añadimos los siguientes códigos:

Sub Matriciales1()
'matricial en una celda
Range("H3").FormulaArray = "=SUM(IF(B2:B13=G3,C2:C13,0))"
End Sub
''''''''''''''''''''''''''''''''''''
Sub Matriciales2()
'misma matricial sobre un rango
Range("D2:D13").FormulaArray = "=IF(B2:B13=""Excel"",C2:C13,0)"
End Sub
''''''''''''''''''''''''''''''''''''
Sub Matriciales3()
'matricial sobre rango corrido
With Range("H6:H9")
    'paso 1
    .Formula = "=MAX(IF($B$2:$B$13=G6,$C$2:$C$13,0))"
    'paso 2
    .FormulaArray = .FormulaR1C1
End With
End Sub



Ejecutando las tres macros vemos cómo se muestran los resultados en los rangos indicados...
Tal como se quería mostrar a modo de ejemplo.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.