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 シートの特定のセルの色を変更しようとしています。2 つのループを使用して解決策を見つけましたが、遅すぎます。30,000 セルの列を通過するには数分かかります。

私はこれまでにこのようなことをしたことがなく、このチュートリアルを使用して始めました.

このソリューションでは、色付きのセルを true に設定した bool 配列を使用します。(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);

これにより、問題を抱えている着色ループが解消されます。

new Excel.Application()また、VSTO アドインでは、通常、コードで行う必要はありません。this.Applicationアドイン クラスで、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

同じコードが、Excel 14.0 を参照して WinForms アプリケーションで機能します (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

私は同じ問題を抱えていて、それが悪いリスト区切りであることが判明しました.私の場合、コンマの代わりにセミコロンが必要です.

だから代わりに

.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 に答える
0

範囲アドレス文字列の最大長は 255 です。したがって、各セクションの範囲アドレスを組み合わせた長さが 255 未満になるように、リストを分割する必要があります。

于 2015-08-07T21:10:30.673 に答える