Duda sobre Fórmula "FormulaR1C1" de Visual Basic en excel
Expertos, en múltiples macros de excell encuentro la siguiente fórmula : "FormulaR1C1", quisiera que me explicaran exactamente que hace la fórmula, cuando se debe usar, cuando no se debe usar, solicito la explicación para una persona como yo que apenas está dando los primeros pasos en VBA de Excel, o sea de una manera muy Básica e igualmente solicito me lo ilustren con ejemplos prácticos.
1 respuesta
La expresión FormulaR1C1 generalmente la encontrarás en instrucciones obtenidas con la grabadora de macros, donde se hace referencia a la fila (R=Row) y columna (C=column) de los argumentos de la fórmula con respecto a la celda activa o donde vá el resultado.
Imaginemos este ejemplo: necesitas sumar el rango B1:B3, es decir que necesitas colocar en una celda esto:
=SUMA(B1:B3)
Entonces por macro vamos a colocar esa suma con los 2 métodos en 2 celdas: C7 y D7
Observa la diferencia.
Range("C7").FormulaR1C1 = "=SUM(R[-6]C[-1]:R[-4]C[-1])" Range("D7").Formula = "=SUM(B1:B3)"
R[-6] significa 6 filas por encima de la fila activa y C[-1] es 1 columna x delante de la celda activa que dijimos es C7.
En cambio la 2da instrucción no depende de la referencia fila-col de la celda activa. Este método es el más apropiado para programar cuando por ej tenés rangos no fijos sino variables. Por ejemplo cuando no el fin de rango lo tene´s en 1 variable:
filafin = 10 Range("D7").Formula = "=SUM(B1:B" & filafin & ")"
Espero te haya quedado claro y no olvides finalizar la consulta.
PD) Con mis manuales VBA se acompaña la lista completa de las funciones Excel tal como se requiere en las instrucciones de VBA .
Elsa, muchas gracias por su pronta y oportuna respuesta.
Al observar los dos ejemplos de la Suma que propones
"1. Range("C7").FormulaR1C1 = "=SUM(R[-6]C[-1]:R[-4]C[-1])"
2. Range("D7").Formula = "=SUM(B1:B3)"
Me surge una duda de la propuesta 1, pues de la segunda me es plenamente clara; en cambio de la segunda, quisiera saber entonces eso hace referencia a ubicarse en la Celda A1, porque si "R"= (Row) y "C" =(Column), ¿Por qué se especifica el "Range("C7")? y siempre deberá ir acompañada de la segunda parte = "=SUM(R[-6]C[-1]:R[-4]C[-1])"?; ¿Por qué se hace anteriormente referencia al rango "C7", por qué motivo entonces tenemos que referenciar los valores -6, -1 etc...?
Es por eso que le solicito que me aclare aún mejor, porque la verdad quedé mucho más confundido de lo que estaba.
Muchas gracias, por su paciencia.
Solo coloqué Range("C7") para que puedas observar cómo se hace referencia a partir de allí al rango B1:B3.
Podía haber colocado una instrucción así::
Activecell.FormulaR1C1 = "=SUM(R[-6]C[-1]:R[-4]C[-1])"
Y eso hubiese significado que se suma a partir de 6 filas x encima de la celda activa y 1 col a la izquierda hasta la celda 4 filas arriba de la activa y 1 col a la izquierda.
Es decir que siempre está relacionada y referenciada según la celda activa.
En cambio la 2da opción no se relaciona con la celda activa que es donde se coloca el resultado.
¿Quedó más claro?
Gracias, por tu pronta respuesta, pero aún me queda sin respuesta la otra parte de mi pregunta siempre deberá ir acompañada de la segunda parte de la Fórmula? pues en varios códigos donde lo he visto no aparece esa parte y es lo que más me enreda, además quisiera saber como lo pregunté desde un principio en que oportunidades se debe utilizar y en cuales no? y ahora con la nueva alternativa que me envías me da error ubicando los valores correspondientes en las celdas B1=25 B2=32 Y PARA B3=15; en las celdas E18 y G7 me dió cero y al ubicarme en las demás celdas de la hoja me dió un error "28" "espacio de pila insuficiente" y el código en el módulo correspondiente me quedó así al dar depurar:
Sub Macro1()
Range("G7").Select
Application.Run "Libro1!Macro1" (Resalta en amarillo)
Range("C6").Select
Application.Run "Libro1!Macro1"
Range("D9").Select
Application.Run "Libro1!Macro1"
Range("G4").Select
Application.Run "Libro1!Macro1"
Range("C7").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-6]C[-1]:R[-4]C[-1])"
End Sub
y al detener la depuración me queda así:
Sub Macro1()
Range("G7").Select
Application.Run "Libro1!Macro1"
Range("C6").Select
Application.Run "Libro1!Macro1"
Range("D9").Select
Application.Run "Libro1!Macro1"
Range("G4").Select
Application.Run "Libro1!Macro1"
Range("C7").Select
Application.Run "Libro1!Macro1"
ActiveCell.FormulaR1C1 = "=SUM(R[-6]C[-1]:R[-4]C[-1])"
End Sub
No sé por qué se me va incrementando las líneas del código del Módulo, no me imagino que podrá suceder cuando se convierta en un módulo inmanejable, acaso no saturará la capacidad de la Hoja de excel y lo volverá demasiado lento?.
Disculpa mi insistencia, pero me gusta aprender y varios de los mejores programas de los cuales e visto el código llevan esa fórmula y al observar tu blog veo ejemplos y ejercicios muy interesantes, pero esto no se trata de copiar y pegar sino de entender la mecánica de los programas y la lógica de la programación para saber cuando aplicar o cuando no aplicar los correspondientes códigos y fórmulas.
Muchas gracias por ayudarme a aprender como estoy seguro lo haces en todos tus manuales.
Salu2
Jorge Torres.
Si dentro de la Macro1 estás ejecutando otra macro también llamada Macro1 asegurate que el nombre del libro sea correcto, sino estás como en un bucle.
¿Por qué mejor no llamas a tu macro con otro nombre?
Enviame tu hoja o libro para que te lo explique con el ejemplo allí mismo porque está visto que no estás entendiendo mis ejemplos. Así como lo planteas no me queda claro si no será mejor tomar el 2do método que como ya lo dije es mucho más claro... se tiene bien a la vista los rangos... pero la diferencia:
1- Si debe estar relacionado con la ubicación de la celda donde vas a colocar el resultdo se usa el mëtodo 1
2- Si se debe colocar una fórmula en una celda (sin importar cuál sea la activa en ese momento) se usa el método 2.
Tomá el correo que aparece en mi sitio.
Muchas gracias, te acabo de enviar el correo con un archivo como estoy organizando, debo antes aclarar que no se trata de un proyecto adelantado, solo va en una hoja unos valores numéricos en el rango "B1:B3", como lo propusiste desde un principio, cuatro Módulos, uno con cada una de las partes que se han planteado y quisiera saber por qué razón, si efectivamente la fórmula debe estar acompañada de la segunda parte o sea con relación a las coordenadas, entonces por qué ésta parte de la función que encontré no la posee y funciona a las mil maravillas?:
" 'Pregunta si la celda tiene formato, si tiene formato entonces continúa
If InStr(1, celda.NumberFormat, "$") > 0 Then
signo = InStr(1, celda.FormulaR1C1, "=") "
Nuevamente muchas gracias.
Saludos
Jorge Torres.
P.D. Lo envié a: [email protected]
Más tarde revisaré tu libro pero te voy aclarando algo:
Hay muchas maneras de hacer referencia a una celda de la que luego dependerá una fórmulaR1C1.
En mi primer ejemplo se indicaba claramente:
Range("C7").FormulaR1C1 =
En un 2do ejemplo se hace referencia a la celda activa, no importa cuál sea:
ActiveCell.FormulaR1C1 =
En el 3er caso se hace uso de una variable, a la que previamente ya le han pasado las referencias de fila y col:
Celda. FormulaR1C1
Todas son TOTALMENTE VÁLIDAS... depende de lo que necesitas que realice tu código.
PD) En la sección Macros de mi sitio podés encontrar otros ejemplos de cómo llamar a una celda o rango (con Offset, con Resize, como Cells(fila, col)... etc)
Muchas gracias, eres una gran maestra, ya revisé el archivo y comprendí más las diferencias, aunque excel es una herramienta infinita me falta estudiar más las diferentes posibilidades que ella tiene.
Estuve revisando tu Web y es de recomendar, se ven muchos recursos interesantes para desarrollar.
Espero que disculpes lo terco, pero el que no pregunta es el que no quiere aprender; te agrego a mi grupo de favoritos y espero poder volver a contar con tu ayuda y asesoría.
- Compartir respuesta