Tengo un montón de valores en varias filas y columnas. Están estructurados de modo que cada fila muestra los datos de un mes en particular y los valores más recientes están en la parte superior. En consecuencia, cuando lo actualizo con nuevos datos, inserto una nueva fila encima de los datos existentes.
¿Cómo puedo asegurarme de que las reglas de formato condicional que apliqué al rango anterior se apliquen al rango nuevo (con una fila más)? Intenté usar tablas o rangos con nombre, pero como agrego la fila encima de los datos antiguos, Excel no extiende automáticamente el rango con nombre/la tabla.
editar: Esos son los datos existentes
Y quiero agregar enero (marcado en rojo) a esto. Si cada subcategoría tuviera una fila vacía encima (como la fila 9), podría solucionarlo, pero desafortunadamente ese no es el caso (ver fila 5).
Respuesta1
Teniendo en cuenta su estructura de datos, creo que sólo puede alcanzar lo que desea utilizando VBA. Creé algo similar a su estructura de datos y escribí un script que se ejecuta cada vez que se agregan filas.
- Guarde su archivo comoLibro de trabajo habilitado para macros de Excel (.xlsm)*
- Abra el editor VBA por Ctrl+F11
- En el Editor VBA, haga doble clic en su hoja en el panel del lado izquierdo.
- Pega este código:
Hoja de trabajo secundaria privada_Cambio (objetivo por valor como rango) Atenuar iTargRowsCnt mientras sea largo Atenuar oFCond como condición de formato Dim sFCondRanges() como cadena Atenuar mientras dure Dim blnFCondRangeModificado como booleano Dim sNewAppliesTo como cadena Si Target.Address = Target.EntireRow.Address Entonces iTargRowsCnt = Destino.Rows.Count Para cada ocasión en mí.UsedRange.FormatConditions sFCondRanges() = Dividir(oFCond.AppliesTo.Address, ","") Para i = LBound(sFCondRanges) a UBound(sFCondRanges) Si no es Intersect(Me.Range(sFCondRanges(i))(1), Target(1).EntireRow.Offset(iTargRowsCnt)) no es nada, entonces sFCondRanges(i) = Rango(Rango(sFCondRanges(i)), Rango(sFCondRanges(i)).Desplazamiento(-iTargRowsCnt)).Dirección blnFCondRangeModified = Verdadero Terminara si Siguiente yo Si blnFCondRangeModified entonces Para i = LBound(sFCondRanges) a UBound(sFCondRanges) sNewAppliesTo = sNewAppliesTo & sFCondRanges(i) & "," Próximo sNewAppliesTo = Izquierda(sNewAppliesTo, Len(sNewAppliesTo) - 1) oFCond.ModifyAppliesToRange Rango(sNewAppliesTo) blnFCondRangeModified = Falso sNewAppliesTo = "" Terminara si Siguiente 'oFCond Terminara si Subtítulo final
Este código se ejecutará automáticamente cada vez que inserte filas. Pero tenga cuidado al utilizar VBA. Guarde con más frecuencia, puede ocurrir algo inesperado, aunque intenté mitigar los riesgos. Por ejemplo, es difícil diseñar un código que funcione bien con la funcionalidad Deshacer. En este caso, los formatos condicionales se distorsionarían si insertara filas y luego usara Deshacer.
Respuesta2
Yo simplemente me quedaría con los rangos. Incluya una fila adicional en la parte superior al aplicar el formato condicional, luego ocúltela o haga lo que quiera visualmente con ella (yo anotaría en algún lugar su propósito como fila de búfer personalmente, para que no se elimine por error).
Otro método sería copiar la fila superior y luego pegarla como formato sobre la nueva fila (no en una computadora en este momento, es necesario verificar si esto funciona para el formato condicional o no) . EDITAR: se confirmó que funciona para el formato condicional en O365 Business Plus: Excel 2016.
Respuesta3
use el rango 1:1000, puede cambiar al rango completo (A1:AZ1000, o algo así), pero se actualizará a medida que agregue más líneas o columnas, por lo que permanecerá en el rango completo
Respuesta4
Después de luchar con un desafío similar, descubrí que simplemente hacer referencia al nombre de la tabla en la entrada "Aplicar a:" se ajusta automáticamente a cualquier cambio en la tabla, incluida la adición de líneas :).