2016-11-08 4 views
0

私は、Excelで出力列に私の値を返すために、この機能を取得することはできません。エクセル/ VBA:(些細でなければなりません)を返すようにバリアント/ブールを取得できません

いくつかの強烈なルックアップテーブルを克服し、計算を高速化するために、私はフィルタリングから行番号を出力するためにスライサーを備えたピボットテーブルを使用しています。これらの行は、大きなテーブルに対して真/偽のセルの列に変換する必要があります。そこから、より多くの計算を実行します。ルックアップやマッチングを避けるためには、単に行のリストを調べ、そのセルを出力ベクトルで "true"にするだけです。

Function IncludedinSlicer(input_range As Variant) As Variant 

Dim n As Long, j As Long, r As Long 
n = input_range.Height ' Height of the column of reference values 
' every row in the input_range contains a row number which in the output should be TRUE 
' all other rows should be false 

Dim output_range As Variant 
ReDim output_range(1 To 300000) 
' This covers the maximum number of rows 

' Initialise all rows to FALSE 
For j = 1 To 300000 
    output_range(j) = False 
Next j 

' Set only those rows listed in the reference to TRUE 
For j = 1 To n 
    r = input_range(j).Value 
    If r = 0 Then ' If r=0 then we are beyond the end of the reference table and have captured some blank rows 
     Exit For ' Exit, to avoid outside-of-array errors 
    Else 
     output_range(r) = True 
    End If 
    'End If 
Next j 

' Return results to Excel 
' THIS LAST BIT DOES NOT RETURN VALUES TO EXCEL 
IncludedinSlicer = output_range 
End Function 

これはわかりやすいはずですが、どういうわけか文字通り数時間私を困らせました。助けてください!前もって感謝します!

EDIT:問題が見つかりました!

まず、高さと行の差を指摘していただきありがとうございます。これは私が気づいていなかったためです。

残念ながら、それでも最終的なセル出力(#Value)に同じエラーが表示されました。幸運なことに、その間にMatlab経由で処理しようとしましたが、結果を戻すときに同じエラーが発生しました。これにより、私は問題を絞り込むことができ、エラーを追跡しました...(ドラムロール)... VBAの2^16の配列サイズの制限です。 テーブルが2^18行に近いため、エラーが発生します。

+0

コードエラー(もしあれば)や予期しない結果が返ってきますか? – SJR

答えて

1

input_range.Heightは、範囲のピクセル単位のリテラルの高さを指します。代わりにinput_range.Rows.Countを試して、範囲内の行数を取得してください。

0

関数の場合、あいまいなVariant型の代わりにRange型を渡す必要があります。

これにより、範囲タイプ(行、列、セルなど)のすべてのプロパティに直接アクセスできるようになり、おそらくbobajobが指摘した問題を把握しやすくなります。

関連する問題