2016-06-19 9 views
1

私はExcel DNAを使ってExcel用のアドインを開発しました。入力として範囲を受け入れるUDFを宣言し、ExcelReferenceRangeにキャストし、の列挙子を使用して、Listのすべてのセル値を収集し、さらに処理し、別の範囲に出力を書き出します。UDFでフルカラー範囲を処理する方法は?

テストとして、列全体を関数(A:A)に渡そうとしましたが、列挙子が最後の値の後に空のセルを列挙し続けるため、すべてが凍結しました。

完全列の範囲を検出し、空でないすべてのセルを高速に取得する方法はありますか?

今のところこのコードを使用していますが、上記のケースでは非常に遅いです。

  Dim ue = inputRange.GetEnumerator  
      Dim L As New List(Of String) 

      Do 
       If ue.MoveNext Then 
        Dim c As Range = ue.Current 
        Dim V As String = c.FormulaLocal 
        If String.IsNullOrWhiteSpace(V) Then Continue Do 
        L.Add(V) 
       Else 
        Exit Do 
       End If 
      Loop 

次の回避策を使用しますが、これを根本的に回避したいと考えています。

  Dim ue = inputRange.GetEnumerator 
      Dim counter as integer=0 
      Dim L As New List(Of String) 
      Do 
       If counter>10 Then Exit Do 
       If ue.MoveNext Then 
        Dim c As Range = ue.Current 
        Dim V As String = c.FormulaLocal 
        If String.IsNullOrWhiteSpace(V.Trim) Then 
         counter = counter + 1 
         Continue Do 
        End If 
        L.Add(V) 
       Else 
        Exit Do 
       End If 
      Loop 

答えて

1

代わりにCOM Rangeオブジェクトを取得する、ExcelReferenceから一度のすべての値を取得するためにはるかに高速になります。

どちらの引数からAllowReference=trueを削除する(そしてあなたが直接値を取得します)、またはExcelReferenceから値を取得する:

object value = inputRef.GetValue(); 

if (value is object[,]) 
{ 
    object[,] valueArr = (object[,])value; 
    int rows = valueArr.GetLength(0); 
    int cols = valueArr.GetLength(1); 
    for (int i = 0; i < rows; i++) 
    { 
     for (int j = 0; j < cols; j++) 
     {  
      object val = valueArr[i,j]; 
      // Do more here... 
     } 
    } 
} 

セルが空の場合は、あなたが得るオブジェクトの型がExcelEmptyのものであろう。空のセルには興味がないので、これを無視することができます。

もう1つの方法は、C APIを使用してシートの使用範囲を取得し、それをExcelReferenceと交差させることです。 1つの欠点は、これには機能が揮発性になるという副作用があるIsMacroType=trueAllowReference=trueと一緒に)とマークされる必要があります。これを実行する方法を示し

コードはここにある:再びhttps://gist.github.com/govert/e66c5462901405dc96aab8e77abef24c

+0

ありがとう!私はその機能をアップグレードするためにそのGistを使用しました:私はすでに 'IsMacroType'と' AllowReference'の両方を使用していたので、コードは完全に収まりました! :D – beppe9000

関連する問題