2013-05-02 12 views
5

これは何が起こるかである:Excelシートにカラーの非連続的な細胞

enter image description here

xlValuesExcel.Range対象として設定されています。

私はすべて私に同じエラーを与えるだけでなく、次の試してみました:私は、Excelシートの特定のセルの色を変更しようとしている

//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"]; 

を、私は2つを使用して、解決策を見つけましたループはそれほど遅いです。 30,000細胞のカラムを通過するには数分かかります。

このようなことは一度もありませんでした。私はthisチュートリアルを使用して始めました。

この解決策では、着色するセルが真に設定されたブール配列を使用します。私がやりたい何(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; 

この1はしかし私の最後の行にエラーが発生します。

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

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


私の最初の推測では、私は、このようなものを赤持ち、xlRangeの代わりに、そのオブジェクトを使用したいセルをカバーExcel.Rangeオブジェクトを作成することです

ギャップがあるExcel.Rangeオブジェクトを作ることが可能かどうかは分かりませんが、私はこれについていくつかの助けをすることができます。

答えて

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"]; 
+0

最後に、この解決策を試してみました。遅く受け入れて申し訳ありませんが、これは最後に働いた解決策でした:) –

1

[RangeObject].Interior.Colorは、セルの背景色を変更します。あなたがこのような範囲をカンマで区切ったリストを使用して非連続したセルを選択することができます

[RangeObject].Font.Color 
+0

私はこの代替案を知っていますが、なぜExcel.XlRgbColor.rgbRedより優れていますか?そして、私が2番目の例でこれを使うべきだと言っているのであれば、私はすでにそれを試してみましたが、もう役に立たないように少し詳しく説明しなければなりません。 –

2

を使用して、セルのテキストの場合、この

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

を使用します。

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

あなたが再することができます選択色:

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

これはあなたが問題を抱えている色分けループを取り除きます。

また、VSTOアドインでは、コード内に通常new Excel.Application()を実行する必要はありません。 Add-inクラスのthis.Applicationは、Excelのアクティブなインスタンスへのアクセスを提供します。

UPDATE

は、ここでは、あなたの問題をピンポイント助けるべきコードの一部です。私は私のアドインにリボンを追加し、リボンには単純なボタンを追加しました。このコードが正常に実行され、細胞の非連続した範囲を選択し、私の側では

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

:このボタンのクリックイベントの後ろに、私は次のコードを追加しています。あなたの最後にこれを試してみて、私があなたが見るものを知らせてください。

UPDATE 2

同じコードがExcelの14.0を参照して、WinFormsのアプリケーションで私の作品(うまくいけば、あまりにもエクセル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); 
     } 
    } 
+0

'Excel.XlRgbColor.rgbRed'と' ColorTranslator.ToOle(Color.Yellow) 'の違いは何ですか?どちらもうまくいくようです。答えをありがとう、私はそれで何ができるかを見ていきます。 –

+0

私は最初のものを使いませんでしたが、あなたのものは普通の定数であるのに対して、私には関数呼び出しが含まれているので、私が提案したものよりも好むべきです。 – dotNET

+0

名前の代わりにセル( 'A1、D65')を見つけるには、数字(' [1,1]、[4.65] 'myのループを見てください)を使用しています。番号の付いた非連続セルを選択できますか? –

0

範囲のアドレス文字列の最大長は255だから、あなたがそのようにチャンクあなたのリストをする必要がある各の組み合わせ範囲アドレスセクションの長さが255未満です。

1

私は長い間この問題に苦しんできました。しかし、今日私は最終的に解決策(と原因)を見つけたと信じています。

問題はExcelが現在の地域設定を使用してカンマ演算子を特定することです。 2つの範囲の間の区切り記号(なぜ私に尋ねるのではなく、関数名のローカライズと同じくらい狂っている)。

とにかく、自分のコンピュータ上で、私はセットチェコ語ロケールを持っているので、使用する区切りはセミコロン、ないコンマです! Rangeメソッドのパラメータで使用すると、完全に機能します。

私はあなたがスウェーデン人であるという印象を得ましたので、あなたはおそらくスウェーデンのロケールを設定しています。そのデフォルトのリスト区切りもセミコロンですので、これもあなたの問題を解決するかもしれません。あなたは、常にこのことができます

System.Globalization.CultureInfo.InstalledUICulture.TextInfo.ListSeparator

希望を呼び出すことによって、コンピュータの地域設定で設定されたセパレータを確認することができます!

+0

私は@banatafferの回答を気付かず、基本的に同じことを示唆しています。しかし、私はあなたが 'CurrentCulture'ではなく' InstalledUICulture'をチェックすべきだと思います。なぜなら、これらの2つが異なるかもしれないし、Excelが確実にあなたのプログラムの特定の文化を使わないからです。 –

+0

これはずいぶん前のことで、私はbanantaffers答えを試して古いプロジェクトを探して気にしなかった。しかし、私は今では自由な時間を過ごしていました。 3年(ほとんどの日)、私は最終的にこの問題の解決策を得ました:)あなたの答えを受け入れることはできません。なぜなら、banantafferが最初であったからです。 –