5

这就是发生的事情:

在此处输入图像描述

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 工作表中的特定单元格重新着色,我通过使用两个循环找到了解决方案,但这太慢了。运行一列 30 000 个单元格需要几分钟。

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

此解决方案使用 bool 数组,其中单元格的颜色设置为 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有这样间隙的对象,我可以在这个上使用一些帮助。

4

5 回答 5

2

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

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

然后,您可以使用以下方法重新着色选择:

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

这将摆脱您遇到问题的着色循环。

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

更新

这是一段代码,可以帮助您查明问题。我在我的加载项中添加了一个功能区,并在功能区中添加了一个简单的按钮。在这个按钮的点击事件后面,我添加了如下代码:

    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);
        }
    }

就我而言,此代码成功运行并选择了不连续的单元格范围。试试这个,让我知道你看到了什么。

更新 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);
        }
    }
于 2013-05-02T09:46:13.750 回答
1

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

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

对于单元格文本,使用

[RangeObject].Font.Color
于 2013-05-02T09:41:00.370 回答
1

我遇到了同样的问题,结果证明这是一个错误的列表分隔符——在我的例子中,应该有一个分号而不是逗号。

所以而不是

.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"];
于 2014-02-17T12:02:55.100 回答
1

这个问题我也纠结了很久。但是今天我相信我终于找到了解决方案(和原因)。

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

无论如何,在我的计算机上,我设置了捷克语区域设置,因此要使用的分隔符是分号,而不是逗号!如果我在Range方法的参数中使用它,它会完美运行。

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

System.Globalization.CultureInfo.InstalledUICulture.TextInfo.ListSeparator

希望这可以帮助!

于 2016-05-12T13:56:05.207 回答
0

范围地址字符串的最大长度为 255。因此,您需要对列表进行分块,以使每个部分的组合范围地址长度小于 255。

于 2015-08-07T21:10:30.673 回答