jueves, 8 de junio de 2017

VBA: el método .ConvertFormula

Hablaremos hoy de los estilos de referencia A1 y F1C1 / R1C1 en Excel... pero desde la perspectiva de nuestras macros.

Expondré hoy el método .ConvertFormula que con sus sintaxis:
.ConvertFormula(Formula, FromReferenceStyle, ToReferenceStyle, ToAbsolute, RelativeTo)
que nos permitirá convertir las referencias de celda en una fórmula entre los estilos de referencia A1 y F1C1/R1C1, y entre referencias relativas y absolutas, o ambas...


Veamos el siguiente ejemplo:

VBA: el método .ConvertFormula



Se observa como en el rango B7:D8 aparecen nuestras fórmulas SUMA y PROMEDIO en forma relativa:
=SUMA(B3:B6)
=PROMEDIO(B3:B6)


Aplicando el método .ConvertFormula a ese rango B7:D8 veremos el aspecto que tendrían dichas fórmulas cambiando a un estilo de referencia R1C1 y en modo absoluto.

Abrimos la ventana de código de nuestro módulo estándar y añadimos el siguiente código:

Sub ConvirtiendoEstilosReferencia()
Dim celda As Range
Dim TextoFormula As String, NuevaFormula As String

For Each celda In Range("B7:D8")
    If celda.HasFormula = True Then
        TextoFormula = celda.FormulaLocal
        'Sintaxis método:
        '.ConvertFormula(Formula, FromReferenceStyle, ToReferenceStyle, ToAbsolute, RelativeTo)
        'Convierte las referencias de celda en una fórmula entre los estilos de referencia A1 y F1C1,
        'entre referencias relativas y absolutas, o ambos.
        
        'Al aplicar el método, en este ejemplo, convertimos a referencia R1C1 y en tipo Absoluta
        NuevaFormula = Application.ConvertFormula(TextoFormula, _
          fromReferenceStyle:=xlA1, _
          toReferenceStyle:=xlR1C1, _
          ToAbsolute:=xlAbsolute)
        'mostramos la fórmula en estilo R1C1 cambiado
        MsgBox NuevaFormula
    End If
Next celda
End Sub



Al ejecutar nuestra macro vemos una ventana para cada celda del rango y cómo ha sido convertida:

VBA: el método .ConvertFormula


Por ejemplo:
=SUMA(B3:B6) queda convertido a =SUMA(R3C2:R6C2)
y
=PROMEDIO(B3:B6) queda convertido a =PROMEDIO(R3C2:R6C2)


Otro ejemplo consiste en aplicar un cambio previo, desde nuestra macro, del estilo de referencia empleado (A1 o F1C1 / R1C1).
Abrimos nuestra ventana de código de nuestro módulo estándar y añadimos el siguiente código:

Sub Convirtiendo2()
Dim TxtFormula As String
Dim originalReferenceStyle
'Para aplicar un estilo u otro de referencia...
'Application.ReferenceStyle = xlA1           'xlR1C1     'xlA1

'guardamos el estilo de referencia definido (A1 o R1C1)
EstiloReferencia = Application.ReferenceStyle

TxtFormula = "=SUM(R2C2:R6C4)"
MsgBox Application.ConvertFormula( _
    Formula:=TxtFormula, _
    fromReferenceStyle:=xlR1C1, _
    toReferenceStyle:=xlA1, _
    ToAbsolute:=xlRelative)
 
'retornarmos el estilo predefinido
Application.ReferenceStyle = EstiloReferencia
End Sub



Con este ejemplo vemos como empleamos el cambio de estilo:
Application.ReferenceStyle = xlA1
o con
Application.ReferenceStyle = xlR1C1

o como recuperamos el existente asociándolo a una variable:
EstiloReferencia = Application.ReferenceStyle

En el ejemplo pasamos una fórmula escrita en forma R1C1 y modo absoluto:
"=SUM(R2C2:R6C4)"
a estilo A1 en modo relativo!.

VBA: el método .ConvertFormula

No hay comentarios:

Publicar un comentario