2012-04-20 37 views
6

Potrzebuję zastosować kolor do tekstu komórki, jeśli wartość nie jest taka sama jak wartość w innej kolumnie. Jakie byłoby dla niego najlepsze podejście? Sposób, w jaki mogę myśleć, jest dość drogi.Formatowanie warunkowe w programie Excel z 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); 
         } 
        } 

Próbowano formatowania warunkowego jak poniżej, ale na próżno.

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

ja pomocą VSTO C#

+0

formatowania warunkowego? – mellamokb

+0

Tak. Trzeba zastosować kolor do tekstu komórki przez porównanie z wartością innej kolumny. ale jeśli przejdę, jak wspomniano w moim kodzie, będzie to dość kosztowne, biorąc pod uwagę duże dane z większą ilością wierszy i kolumn. – Cannon

Odpowiedz

7

Następujący kod dodaje formatowania warunkowego zakresie komórki D1 do E10

Porównuje się wartości D1 = E1 lub D2 = E2 odpowiednio. możesz ustawić kolor czcionki lub kolor wypełnienia obiektu 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

Ale jak obsługiwać zakresy dynamiczne? – Cannon

+0

@buffer_overflow sprawdź [link] (http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.get_range (v = vs.80) .aspx) dla deklaracji Metoda get_range, możesz podać komórkę 1 n 2 przy użyciu odpowiednio targetSheet.Cells [1,2] i targetSheet.Cells [3,4]. Mam nadzieję, że u gt to – Akanksha

+0

Co, jeśli tylko jedna kolumna się powiela? Zaznacz na przykład 'D1' ... jeśli istnieją dwa duplikaty, zaznacz je. – Si8

1

Spróbuj

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

Powiedzmy chcesz pokolorować komórkom B1:B10 jeśli ich wartości nie są równe tym z A1:A10, tj

B1<>A1 wyników w B1 są kolorowe, B2<>A2 wyniki B2 jest kolorowy itp.

Następnie c wykonać następujące

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 

Zauważ, że poprzedzenie "=" do ColumnARange.Address[false,true] jest wymagane, ponieważ w przeciwnym razie metoda Add używa Address jako dosłownego łańcucha zamiast odwołania do komórki.

Jeśli przyjrzeć się warunkowej regule formatowania zastosowanej do komórek B1:B10 w arkuszu Excela, będzie ona oznaczać Cell Value <> B1 dla każdej komórki w zakresie, który jest nieco mylący, ale formatowanie jest jednak poprawnie stosowane.

Dla kompletności: Używam opcjonalnych przedmiotów Range.Address własności jak tak Range.Address[isRowAbsolute,isColumnAbsolute]

Powiązane problemy