Pregunta:
Más sobre autoreferencias a una celda (Excel)?
davidk
2007-11-16 12:37:30 UTC
En una columna con una lista de números (precios, por ejemplo) quiero que cambien automáticamente al modificar un número que aparece en otra celda fuera de esa columna (un porcentaje): al cambiar el porcentaje, automáticamente toda la columna se incrementará en dicho porcentaje.

NO puedo utilizar datos externos a la propia columna, excepto la celda del porcentaje. Es decir, NO puedo utilizar una columna para los precios originales y otra columna para almacenar los nuevos precios incrementados: necesito que la columna cambie su propio valor inicial... y que vuelva a funcionar cuando vuelva a cambiar el porcentaje.

¿Hay que utilizar referencias circulares, o macros, o alguna función que sustituya el valor de una celda por otro nuevo que sea resultado de una operación que haya utilizado el valor original de esa celda?

NOTA: la segunda vez que cambie el %, debería incrementarse el resultado de la primera vez: el resultado debe SUSTITUIR al dato sobre el que se hace el incremento.
Tres respuestas:
ElCacho
2007-11-16 13:17:59 UTC
Imagina que debes cambiar los valores del rango [A2:A10] modificando la celda [B2].

Puedes utilizar una macro sencilla del siguiente modo:

1º) Haz click con el botón derecho en la solapa de la hoja y selecciona la opción "Ver código".



2º) Te aparecerá:

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

End Sub



que reemplazarás TOTALMENTE por el siguiente código:



Private Sub Worksheet_Change(ByVal Target As Excel.Range)

If Target.Address <> "$B$2" Then Exit Sub

Application.EnableEvents = False

For Each Celda In [A2:A10]

Celda.Value = CDbl(Celda * (1 + [B2] / 100))

Next Celda

Application.EnableEvents = True

End Sub



3º) Cierra todas las ventanas que tengan que ver con el Visual Basic y retorna a tu planilla.



A partir de ese momento, cada vez que modifiques el valor de la celda [B2] (por ejemplo: B2 = 10), todas las celdas del rango [A2:A10] verán aumentado su valor en un 10%.



Si el valor que incorporas es negativo (por ejemplo B2 = -5), tendrás un decrecimiento de los valores en un 5%.



Saludos

...
Robertoroque
2007-11-17 04:10:50 UTC
Hola Davidk, muchas gracias por formular de nuevo la pregunta.



Me pareció muy interesante el planteamiento y nada fácil de resolver, por eso le he dedicado bastante tiempo.



Como bien tu dices en tu formulación, no se puede usar otra columna para hacer los cálculos y cuando se ingrese un nuevo porcentaje, los valores actuales son los que se deben modificar y no los que originalmente se ingresaron.



Bajo estas premisas, estuve revisando alternativas y la vía que encontré fue a través de una Macro. Te digo de antemano que no soy experto en Macros, sin embargo he trabajado algo en esto y he aprendido un poco con tutoriales y por ensayo y error.



A continuación la respuesta:



Premisas:

1. Para esta solución se ha elegido la columna B para el ingreso de los datos, desde la posición B1 en adelante. Cuando aparezca una celda de la columna B en blanco la Macro se detendrá

2. En la celda C1 se ingresará el valor del porcentaje.



Procedimiento



1. Abrir el programa Excel



2. Ahora vamos a "Herramientas" "Macro" "Grabar nueva Macro..." y en el cuadro de diálogo que se abre donde dice "Nombre de la Macro" escribimos Porcentaje y luego "Aceptar"



3. Cuando se cierra el cuadro de diálogo mencionado en el punto 2, aparece en la hoja una barra pequeña que es la barra de grabación de Macros. Entonces le das con el mouse al botón azul que dice detener grabación.



Comentario: lo que hemos hecho hasta ahora es crear una Macro con el nombre "Porcentaje" la cual no contiene instrucciones. Lo que haremos a continuación es copiar en el Editor de Macros las instrucciones listadas en el siguiente punto



4. Ahora vamos de nuevo a "Herramientas" "Macro" "Macros" y en el cuadro de diálogo que se abre seleccionas en "Nombre de la Macro" Porcentaje y luego le das a "Modificar", abriéndose el Editor de Visual Basic que es donde se programan las Macros



Entonces ubicas el cursor debajo de la línea donde dice Macro grabada el **/YY/2007 por Nombre y copias las siguientes instrucciones (utiliza Ctrl C y Ctrl V):



Range("C1").Select

Selection.NumberFormat = "0.00%"

Range("C1").Select

Selection.Copy

Range("C2").Select

Range(Selection, Selection.End(xlDown)).Select

ActiveSheet.Paste

Range("C2").Select

Range(Selection, Selection.End(xlDown)).Select

Selection.Font.ColorIndex = 2

Range("B1").Select

Do Until ActiveCell = ""

ActiveCell.Offset(0, 200).Activate

ActiveCell.FormulaR1C1 = "=RC[-200]"

ActiveCell.Offset(0, 1).Activate

ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-200]"

Selection.Copy

ActiveCell.Offset(0, 1).Activate

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

ActiveCell.Offset(0, -202).Activate

Application.CutCopyMode = False

ActiveCell.FormulaR1C1 = "=RC[202]"

ActiveCell.Offset(1, 0).Activate

Loop



Luego cierras el Editor de Visual Basic



5. Ahora le damos formato a la Celda C1 que es donde vamos a ingresar el Porcentaje: nos ubicamos en dicha celda y vamos a "Formato" "Celdas" y en la pestaña "Número" seleccionamos Porcentaje y dos decimales y le damos Aceptar



6. Ahora vamos a asignar una tecla para ejecutar la Macro desde el Teclado: "Herramientas" "Macro" "Macros" y en el cuadro que aparece seleccionamos el nombre de la Macro que en nuestro caso es Porcentaje y luedo seleccionamos Opciones, abriéndose otra ventana, donde dice "Tecla de método abreviado CTRL+, colocamos en el recuadro una u y le damos Aceptar. Esto quiere decir que cuando estemos en la hoja de Excel y le demos a Ctrl+u se ejecutará automáticamente la Macro con nombre Porcentaje.



Es hora de hacer una prueba. Sigamos los siguientes pasos:



1. En la celda C1 escribimos 100 y luego Enter. Si está bien el formato aparecerá 100%



2. Ahora nos ubicamos en la celda B1 e ingresamos 100, en la B2 200 y en la B3 300 y luego Enter



3. Ahora le damos Ctrl+u y verás como se ejecutan un serie de pasos automáticamente observándose hasta parpadeos en el monitor. Cuando se detiene la Macro, verás que los valores se mantienen o sea que hasta aquí todo va bien



4. Ahora ingresamos 200 en la Celda C1 y Enter. Ahora Ctrl+u, ejecutándose la Macro. Entonces verás que en B1, B2 y B3 se transforman en 200, 400 y 600. Si ahora asignas 100 a la celda C1 y luego Ctrl+u, verás que los valores se mantienen, cumpliéndose con tu condición de que el nuevo porcentaje afectará a los valores actuales y no a los originales. Puedes continuar ingresando nuevos porcentajes y éstos se aplicarán siempre a los valores en pantalla y no a los originales, que es una de tus condiciones.



Explicación:



La Macro desarrollada lo que hace es tomar los valores de la columna B y los lleva a otra columna muy hacia la derecha la cual no se puede ver directamente. Luego estos valores los afecta con el porcentaje en la celda C1 y los resultados los coloca a la derecha de esa columna. Luego esos resultados son de nuevo llevados a la Columna B que es la que usamos originalmente para ingresar los datos y la que siempre vemos en pantalla.



Aquí si se quiere no se cumple con tu condición de no poder utilizarse otra u otras columnas para lograr el resultado, pero no encontré otra forma. De todas formas esto es transparente para el usuario, ya que quien ingresa los datos solo usa la Columna B y la Celda C, lo demás lo hace la Macro.



Disculpa lo largo de esta respuesta, pero no encontré otra forma.



Entiendo que esta solución, Yo mismo la encuentro bastante pobre desde el punto de vista de Programación en Visual Basic, ya que obviamente yo no sé programar, pero lo importante es que hace el trabajo. Sería cuestión de buscar ayuda con un programador y pulir esta solución para hecrla mas práctica y versátil.



Espero que hayas podido seguir todos los pasos y que te haya funcionado el ejemplo y además que te sirva como solución a tu requerimiento.



Si lo consideras necesario ubícame por: robertrosa57@yahoo.es



Saludos!
Kybalion
2007-11-16 23:10:30 UTC
Porque no consideras simplemente utilizar una funcion de pegado especial, es decir si la celda donde vas a poner la variación (10 % por ejemplo) lo pones como 110 % y seleccionas EDICION COPIAR, y luego EDICION PEGADO ESPECIAL, seleccionas VALORES y MULTIPLICAR , lo cual también pudieras hacer a traves de una Macro para no hacerlo "manual".



SUERTE.


Este contenido se publicó originalmente en Y! Answers, un sitio web de preguntas y respuestas que se cerró en 2021.
Loading...