2009-02-03 13 views
57

Estoy tratando de hacer un formato condicional para que el color de la celda cambie si el valor es diferente del valor en la celda que queda (cada columna es un mes, en cada fila son los gastos en un objeto determinado. Quiero supervisar fácilmente los cambios en los precios durante meses)Fórmula de Excel para hacer referencia a "CELDA A LA IZQUIERDA"

Lo puedo hacer por célula y formato-arrastrarlo, pero me gustaría una fórmula general para aplicar a toda la hoja de trabajo .

Gracias!

+3

... y en caso de que alguien lo esté buscando ... para obtener la columna a la derecha: '= INDIRECTO (" RC [1] ", 0)' – prograhammer

+0

Esta es una gran pregunta. Desafortunadamente, no estoy seguro si estoy entendiendo esto correctamente, el póster original quería que sus celdas cambiaran sin tener que hacer un formateo condicional y luego pegar el pintor de formato en cada celda. Digamos que tenemos meses en las filas, y plátanos, manzanas y naranjas en las columnas. En la matriz están los precios. ¿Cómo podríamos hacer algo que automáticamente COLOREARÍA UNA CELDA ROJA si hubo un cambio de precio desde el mes anterior al mes actual? Si también hay una manera automática de colorear las celdas en verde si el precio baja y en rojo si – Bryan

Respuesta

63
=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) 
+0

Bien, gracias. La respuesta de Michael funcionó, pero me gustan las fórmulas explícitas ... – mik

+6

Utilizando CINCO funciones de uso poco frecuente que se necesitan para buscar el uso, en lugar de una simple referencia relativa A1 o RC [-1]? ¡Es como viajar de Brooklyn al Bronx con una escala en Walla Walla WA! –

+1

Además, recuerde que esto va a ser volátil ... –

11

Al crear su formato condicional, establecer la distancia a la que se aplica a lo que quiere (toda la hoja), a continuación, introduzca un pariente fórmula (quitar las $ signos) como si sólo estuviera formateando la parte superior izquierda esquina.

Excel aplicará correctamente el formato al resto de las celdas en consecuencia.

En este ejemplo, comenzando en B1, dejó celda sería A1. Solo use eso; no se requiere una fórmula avanzada.


Si lo que buscas es algo más avanzado, se puede jugar con column(), row(), y indirect(...).

1

Se puede usar un script de VBA que cambia el formato condicional de una selección (es posible que tenga que ajustar la condición & formateo en consecuencia):

For Each i In Selection 
i.FormatConditions.Delete 
i.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, Formula1:="=" & i.Offset(0, -1).Address 
With i.FormatConditions(1).Font 
    .Bold = True 
End With 
Next i 
7

Si cambia de celda de referencia a utilizar R1C1 notación (Herramientas | Opciones, pestaña General), luego puede usar una notación simple y pegarla en cualquier celda.

Ahora su fórmula es simplemente:

=RC[-1] 
54

La versión más compatible más corta es:

=INDIRECT("RC[-1]",0) 

"RC [-1]" significa una columna a la izquierda. "R [1] C [-1]" está abajo a la izquierda.

El segundo parámetro 0 significa que el primer parámetro se interpreta utilizando la notación R1C1.

Las otras opciones:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) 

demasiado tiempo en mi opinión. Pero es útil si el valor relativo es dinámico/derivado de otra celda. ej .:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0, A1) 

La opción más sencilla:

= RC[-1] 

tiene el inconveniente de que necesita para encender la notación R1C1 utilizando opciones, que es un no-go cuando otras personas tienen que usar el Excel.

2

llenar la celda A1, con la siguiente fórmula:

=IF(COLUMN(A1)=1;"";OFFSET(A20;0;-1))&"1" 

Entonces autoextend a derecha, se obtiene

1| A | B | C | ect ect 
2| 1| 11| 111| ect ect 

Si el desplazamiento es fuera del rango de la célula disponible, se obtiene ¡La referencia! error.

Espero que lo disfrutes.

0

aún más simple:

=indirect(address(row(), column() - 1)) 

OFFSET devuelve una referencia en relación con la referencia de corriente, por lo que si los retornos indirectos la referencia correcta, que no lo necesita.

+0

Nunca haga esto. INDIRECT rompe el árbol de la dependencia: es un desastre. – Ollie2893

2

En lugar de escribir el muy largo:

=OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) 

simplemente hay que escribir:

=OFFSET(*Name of your Cell*,0,-1) 

Así, por ejemplo, usted puede escribir en la celda B2:

=OFFSET(B2,0,-1) 

a referencia a la celda B1

Aún gracias Jason Young !! ¡Nunca hubiera llegado a esta solución sin tu respuesta!

+2

Esto no es útil. Si ya sabe que su celda es B2, puede escribir B1 para la celda de la izquierda y no usar ningún tipo de compensación. El punto es hacer algo completamente genérico. –

1

Al crear una función definida por el usuario , descubrí que las otras respuestas que implican las funciones OFFSET y INDIRECT no se pueden aplicar.

En su lugar, tienen que utilizar Application.Caller para referirse a la celda de la función definida por el usuario (UDF) se ha utilizado en. En una segunda etapa, a convertir el índice de la columna para el nombre de la columna correspondiente.
Finalmente, puede hacer referencia a la celda izquierda utilizando la hoja de cálculo activa Range function.

Function my_user_defined_function(argument1, argument2) 
    ' Way to convert a column number to its name copied from StackOverflow 
    ' http://stackoverflow.com/a/10107264 
    ' Answer by Siddarth Rout (http://stackoverflow.com/users/1140579/siddharth-rout) 
    ' License (if applicable due to the small amount of code): CC BY-SA 3.0 
    colName = Split(Cells(, (Application.Caller(1).Column - 1)).Address, "$")(1) 

    rowNumber = Application.Caller(1).Row 

    left_cell_value = ActiveSheet.Range(colName & rowNumber).Value 

    ' Now do something with left_cell_value 
0

me encontré con este hilo porque quería hacer referencia siempre la "celda a la izquierda", pero crucialmente de una manera no volátil (no hay offset, desastres indirecta y similares). Mirando hacia arriba y hacia abajo, sin respuestas. (Este hilo tampoco proporciona ninguna respuesta.) Después de algunos retoques, me encontré con el método más asombroso, que me gusta compartir con esta comunidad:

Supongamos un valor inicial de 100 en E6. Supongamos que ingreso un delta a este valor en F5, digamos 5. Entonces, calcularíamos el valor de continuación (105) en F6 = E6 + F5. Si desea agregar otro paso, simplemente: simplemente copie la columna F en la columna G e ingrese un nuevo delta en G5.

Esto es lo que hacemos, periódicamente. Cada columna tiene una fecha y estas fechas DEBEN estar en orden cronológico (para ayudar con MATCH, etc.). De vez en cuando sucede que olvidamos entrar en un paso. Ahora suponga que desea insertar una columna entre F y G (para ponerse al día con su omisión) y copie F en la nueva G (para volver a llenar la fórmula de continuación). Esto no es NADA BREVE de un desastre total.Pruébalo: H6 ahora dirá = F6 + H5 y NO (como lo necesitamos) = G6 + H5. (El nuevo G6 será correcto.)

Para que esto funcione, podemos ofuscar este cálculo banal de la manera más sorprendente F6 = índice ($ E6: F6; 1; columnas ($ E1: F1) -1) + F5. Copie a la derecha y obtendrá G6 = índice ($ E6: G6; 1; columnas ($ E1: G1) -1) + G5.

Esto nunca debería funcionar, ¿verdad? Referencia circular, ¡claro! Pruébalo y sorpréndete. Parece que Excel se da cuenta de que, aunque el rango INDEX abarca la celda que estamos recalculando, el ÍNDICE no aborda esa celda en sí misma y, por lo tanto, NO crea una referencia circular.

Así que ahora estoy en casa y seco. Insertar una columna entre F y G y conseguimos exactamente lo que necesitamos: El valor de la continuación de la antigua H se referirá de nuevo al valor continuación insertamos en la nueva G.

0

Por qué no utilizar:

=ADDRESS(ROW(),COLUMN()-1) 
Cuestiones relacionadas