2012-04-20 62 views
6

Necesito aplicar un color al texto de una celda si el valor no es el mismo que el de otra columna. ¿Cuál sería el mejor enfoque para eso? La forma en que puedo pensar es bastante costosa.Formato condicional en Excel con C#

for (int i = 0; i < ColumnARange.Cells.Count; i++) 
        { 
         if (ColumnARange.Cells[i, 1] != ColumnBRange.Cells[i, 1]) 
         { 
          Range currCell = ColumnBRange.Cells[i, 1]; 
          currCell.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); 
         } 
        } 

Se intentó formatear condicional de la siguiente manera, pero fue en vano.

FormatCondition cond = ColumnBRange.FormatConditions.Add(XlFormatConditionType.xlCellValue, XlFormatConditionOperator.xlNotEqual, ColumnARange); 
       cond.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); 

estoy usando VSTO, C#

+0

El formato condicional? – mellamokb

+0

Sí. Necesita aplicar color al texto de celda al comparar con el valor de otra columna. pero si atravieso según lo mencionado en mi código, será bastante costoso considerando datos grandes con más filas y columnas. – Cannon

Respuesta

7

El código siguiente, se agrega un formato condicional para el rango de celdas de D1 a E10

Se compara los valores D1 = E1 o D2 = E2 respectivamente. puede establecer el color de la fuente o el relleno de color en el objeto FormatCondition.

FormatCondition format =(FormatCondition)(targetSheet.get_Range("D1:E10", 
       Type.Missing).FormatConditions.Add(XlFormatConditionType.xlExpression, XlFormatConditionOperator.xlEqual, 
       "=$D1=$E1", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)); 

      format.Font.Bold = true; 
      format.Font.Color = 0x000000FF; 
+1

Pero, ¿cómo manejo los rangos dinámicos? – Cannon

+0

@buffer_overflow revise el [enlace] (http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.get_range (v = vs.80) .aspx) para la declaración de Método get_range, puede proporcionar la celda 1 n 2 utilizando targetSheet.Cells [1,2] y targetSheet.Cells [3,4], respectivamente. Espero que lo hagas – Akanksha

+0

¿Qué pasa si solo hay una columna duplicada? Compruebe todo el 'D1' por ejemplo ... si existen dos duplicados, resáltelo. – Si8

1

Prueba este

FormatCondition cond = ColumnBRange.FormatConditions.Add(XlFormatConditionType.xlCellValue, XlFormatConditionOperator.xlNotEqual, "=$B1"); 
       cond.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); 
1

Digamos que usted quiere colorear células B1:B10 si sus valores no son iguales a las de A1:A10, es decir

B1<>A1 resultados en B1 ser de colores, B2<>A2 resultados en B2 coloreado, etc.

Luego usted c un hacer lo siguiente

Range columnBRange = (Range)oSheet.Range[oSheet.Cells[1,2], oSheet.Cells[10,2]]; 

Range columnARange = (Range)oSheet.Range[oSheet.Cells[1,1], oSheet.Cells[1,1]]; 

FormatCondition cond = (FormatCondition) ColumnBRange.FormatConditions.Add(XlFormatConditionType.xlCellValue, XlFormatConditionOperator.xlNotEqual, "="+ColumnARange.Address[false,true]); 
cond.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); //Red letters 
cond.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightYellow); //Light yellow cell background 

Tenga en cuenta que anteponiendo "="-ColumnARange.Address[false,true] es necesario porque de lo contrario el método Add utiliza el Address como una cadena literal en lugar de una referencia de celda.

Si se toma vistazo a la regla de formato condicional aplicado a las células B1:B10 en la hoja de Excel se indicará Cell Value <> B1 para cada celda del rango que es un poco confuso, pero la OMI se aplica el formato correcto, no obstante.

Para completar: estoy usando objetos opcionales en Range.Address propiedad como así Range.Address[isRowAbsolute,isColumnAbsolute]

Cuestiones relacionadas