(C#でエクセル)エクセルをC#で操作する

エクセルをC#で操作する場合のメモ。一部VBAもあり。



名前定義 

エクセルの名前定義はブック範囲とシート範囲と2種類ある。

条件付き書式のあるセルを一覧する

条件付き書式が設定されているセルの一覧を得る手順。SpecialCellsメソッドを使うが、このメソッドはセルが無いと例外を発生させる(!)ので注意。
Excel.Range ra = null;
try
{
      ra = sh.Cells.SpecialCells(Excel.XlCellType.xlCellTypeAllFormatConditions);
}
catch (Exception err)
{
     /// セルが無いときは例外が起きる
     /// 無視する
}

条件付き書式の削除する

条件付き書式を削除するときは、まとめて削除すると例外が発生する。原因不明。
 foreach (Excel.FormatCondition fc in ce.FormatConditions)
 {
       if (fc.Formula1.Contains("xxx"))
      {
            fc.Delete();
      }
}
最初のうちは削除できるが、途中で例外発生。


リストにつめてから削除しても同様。
foreach (Excel.FormatCondition fc in ce.FormatConditions)
{  
   if (fc.Formula1.Contains("xxx"))
   {
      lst.Add(fc);  
   }
}
foreach (Excel.FormatCondition fc in lst)
{
    fc.Delete();
}

末尾から削除してみたが、やはりだめ。


外部参照リンクを削除する

Array a = (Array)wb.LinkSources(Excel.XlLink.xlExcelLinks);
for (int i = 1; i <= a.Length; i++)
{
    wb.BreakLink((string)a.GetValue(i), Excel.XlLinkType.xlLinkTypeExcelLinks);
}
Array型で受け取るのがポイント。



条件付き書式を得るときの問題(VBA)

エクセル2007では、条件付き書式の条件式をVBAで参照すると、最初の条件式が繰り返し表示されて、2番目以降の条件式が取れない問題がある。

For Each ra In sh.UsedRange

If ra.FormatConditions.Count > 0 Then

Dim fc As FormatCondition

For Each fc In ra.FormatConditions

Debug.Print fc.Formula1, fc.Type

Next

End If

Next

解決は困難。



セルの結合を考慮してセルの一覧を得る(VBA)

エクセルでは、A1:B1をセル結合して見た目は1個のセルにしていても、Range("A1:B1").Count では2が得られる。これでは困ることがあるので、結合されたセルも考慮してセルの個数をカウントする関数。(というかセルの一覧をコレクションにいれて返す関数)

Function CountMergeCells(ra As Range) As Collection
 Dim co As Collection
 Dim c As Range
 Set co = New Collection
 For Each c In ra
 If c.Address = c.MergeArea.Item(1).Address Then
  Debug.Print "#", c.Address, c.MergeCells, c.MergeArea.Item(1).Address
 co.Add c.MergeArea
 End If
 Next
 Set CountMergeCells = co
End Function 

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。