在Excel工作表中颜色不连续的单元格

这是发生了什么事情:

在这里输入图像描述

xlValues被设置为一个Excel.Range对象。

我也尝试了以下,所有给我同样的错误:

 //xlValueRange = xlSheet... .get_Range("A1:A5,A15:A25,A50:A65"); .UsedRange.Range["A1:A5,A15:A25,A50:A65"]; .Range["A1:A5,A15:A25,A50:A65"]; xlApp.ActiveWorkbook.ActiveSheet.Range["A1:A5,A15:A25,A50:A65"]; //I have also tried these alternatives with ".Select()" after the brackets and //", Type.Missing" inside the brackets //This works though... xlSheet.Range["A1:A5"]; 

我试图在Excel表单中重新着色特定的单元格,我已经find了使用两个循环的解决scheme,但它太慢了。 通过一个30 000个单元的列需要几分钟的时间。

我从来没有做过这样的事情,我用这个教程让我开始。

这个解决scheme使用一个布尔型数组,将单元格的颜色设置为true。 (recolored)

 //using Excel = Microsoft.Office.Interop.Excel; xlApp = new Excel.Application(); xlApp.Visible = true; xlBook = xlApp.Workbooks.Add(Type.Missing); xlSheet = (Excel.Worksheet)xlBook.Sheets[1]; for (int i = 1; i < columns + 1; i++) { for (int j = 1; j < rows + 1; j++) { if (recolored[j, i]) xlSheet.Cells[j+1, i+1].Interior.Color = Excel.XlRgbColor.rgbRed; } } } 

我想要做的是这样的:

 Excel.XlRgbColor[,] color; //Loop to fill color with Excel.XlRgbColor.rgbRed at desired cells. var startCell = (Excel.Range)xlSheet.Cells[1, 1]; var endCell = (Excel.Range)xlSheet.Cells[rows, columns]; var xlRange = xlSheet.Range[startCell, endCell]; xlRange.Interior.Color = color; 

虽然这个在最后一行给了我一个错误,

Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))


我的第一个猜测是将一个Excel.Range对象覆盖我想要红色的单元格,并使用该对象来代替xlRange,如下所示:

 RangeObject.Interior.Color = Excel.XlRgbColor.rgbRed; 

我不知道是否有可能做出这样的差距的Excel.Range对象,但我可以使用一些帮助。

我有同样的问题,事实certificate,这是一个不好的列表分隔符 – 在我的情况,而不是逗号应该有一个分号。

所以,而不是

 .Range["A1:A5,A15:A25,A50:A65"]; 

尝试:

 private string listSep = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; .Range["A1:A5" + listSep + "A15:A25" + listSep + "A50:A65"]; 

您可以使用逗号分隔的列表来select不连续的单元格,如下所示:

 this.Application.ActiveWorkbook.ActiveSheet.Range["A2:A4,B3:B16"].Select(); 

然后您可以使用以下方式重新select颜色:

 Selection.Interior.Color = ColorTranslator.ToOle(Color.Yellow); 

这将摆脱你有麻烦的着色循环。

另外,在VSTO加载项中,通常不需要在代码中执行new Excel.Application()this.Application在加载项类应该让您访问Excel的活动实例。

UPDATE

这里有一段代码可以帮助你指出你的问题。 我添加了一个function区到我的加载项和一个简单的button到function区。 在这个button的点击事件后面,我添加了下面的代码:

  private void button1_Click(object sender, RibbonControlEventArgs e) { try { var App = Globals.ThisAddIn.Application; if (App == null) System.Windows.Forms.MessageBox.Show("App is null"); else { var Sheet = App.ActiveSheet; if (Sheet == null) System.Windows.Forms.MessageBox.Show("Sheet is null"); else { var Rng = Sheet.Range["A1:A5,A15:A25,A50:A65"]; if (Rng == null) System.Windows.Forms.MessageBox.Show("Rng is null"); else { Rng.Select(); } } } } catch (Exception ee) { System.Windows.Forms.MessageBox.Show("Exception: " + ee.Message); } } 

在我的结尾这个代码运行成功,并select不连续的单元格范围。 试试这个,让我知道你看到了什么。

更新2

在WinForms应用程序中,参考Excel 14.0的相同的代码适用于我(希望可以与Excel 12.0一起使用)。 只需要一些小的改变。 这是完整的代码。

  private void button1_Click(object sender, RibbonControlEventArgs e) { try { var App = new Microsoft.Office.Interop.Excel.Application(); if (App == null) System.Windows.Forms.MessageBox.Show("App is null"); else { App.Workbooks.Add(); var Sheet = App.ActiveSheet; if (Sheet == null) System.Windows.Forms.MessageBox.Show("Sheet is null"); else { Microsoft.Office.Interop.Excel.Range Rng = Sheet.get_Range("A1"); Rng.Select(); Rng = Sheet.get_Range("A1:A5,A15:A25,A50:A65"); if (Rng == null) System.Windows.Forms.MessageBox.Show("Rng is null"); else { Rng.Select(); App.Selection.Interior.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbYellow; App.ActiveWorkbook.SaveAs("testtest.xlsx"); App.Quit(); } } } } catch (Exception ee) { System.Windows.Forms.MessageBox.Show("Exception: " + ee.Message); } } 

[RangeObject].Interior.Color更改单元格背景颜色。 用这个

 [RangeObject].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red); 

对于单元格文本,请使用

 [RangeObject].Font.Color 

我也一直在为这个问题苦苦挣扎。 但今天我相信我终于find了解决办法(和原因)。

问题是,Excel使用当前的区域设置来确定逗号运算符 ,即。 两个范围之间的分隔符(不要问我为什么 – 对我来说就像本地化函数名称一样疯狂)。

无论如何,在我的电脑上,我有捷克的语言环境设置,所以使用的分隔符是分号 ,而不是逗号 ! 如果我在Range方法的参数中使用它,它可以很好地工作。

从讨论中我得到的印象是你是瑞典人,所以你可能会设置瑞典的语言环境。 它的默认列表分隔符也是分号,所以对我来说这似乎也可以解决你的问题。 您可以随时通过调用来检查在计算机区域设置中设置的分隔符

System.Globalization.CultureInfo.InstalledUICulture.TextInfo.ListSeparator

希望这可以帮助!

范围地址string的最大长度是255.因此,您需要分块您的列表,以便每个部分的组合范围地址长度小于255。