2012-03-06 9 views
1

Excel 2010では、列Aに値リストがあり、ビンサイズはB1に指定されています。これは私がこの式を使用してN個のビンでヒストグラムを作成することができます:Excel FREQUENCY関数を使用したヒストグラム

{=FREQUENCY(A:A,(ROW(INDIRECT("1:"&CEILING((MAX(A:A)-MIN(A:A))/B1,1)))-1)*B1+MIN(A:A))}

唯一の問題は、私は Nのセルを選択して、N個のビンがのデータソースとして使用されるように取得するには、この式を適用する必要があるということです私の棒グラフ。このステップをスキップすることは可能ですか?例えば。この式を1つのセルで使用することは可能ですか?データソースとして使用するとN個のセルとして解釈され、N個の値を持つ素敵なヒストグラムが生成されます。

ありがとうございました。

Here's the answer that led me to the formula above.

答えて

6

(これはマクロ駆動型のダイナミックレンジ、リサイズ事へのアプローチではかなり異なっているので、私は別の答えを使用しています...)

ダイナミックヒストグラムチャートがあることを思い出しによって構築することができます「名前付き範囲」は実際にはの式と名前が付けられているため、値が動的である場合もあります。

まず、行Aから列1に任意の値を設定し、ヒストグラムに必要なビンの数を含む別のセルがあることを前提にして説明します。私のワークブックではE2になります。だから我々は、(「数式」タブの)名前マネージャを起動し、私はので、(私たちは、後に定義します)ビンの数ではなく、ビンサイズを定義するために行ってきた

num_bins    =Sheet1!$E$2 

を作成します後者はビン境界を設定する方法を正確に知ることが難しくなります。最初と最後のビンが値の範囲の異なる部分をカバーできるという考えに満足していますか?例えば

data_count   =COUNT(Sheet1!$A:$A) 
data_vals   =OFFSET(Sheet1!$A$1,0,0,data_count,1) 
max_val    =MAX(data_vals) 
min_val    =MIN(data_vals) 

定義されているものを使用すると、空想を得る。各ビンはどれくらいの大きさでなければなりません別の命名式ください:

bin_size    =(max_val-min_val)/(num_bins) 

をそしてここで科学が来る:これらの式は、動的配列を作る:

bin_array   =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins-1,1))*bin_size 
bin_labels   =min_val+ROW(OFFSET(Sheet1!$A$1,0,0,num_bins,1))*bin_size   
data_vals   =FREQUENCY(data_vals,bin_array) 

最初のものはトリッキーです:それはnum_bins minus one -size範囲の行番号を使用していますbin_sizeの倍数を生成します。配列min_valは、FREQUENCY()関数が各ビン値まで項目数をカウントするため、配列を開始しません。関数は1つ大きい配列を生成するので、必要なビンの数よりも1つ小さいです。最後のエントリは、の上にの最高ビン番号を持ちます。そこで、プレゼンテーション用に別のbin_labels配列を作成します。

ここでグラフを作成できます。 2-D縦棒グラフを挿入して(「リボンから」またはチャートを右クリックして)「データ選択」ダイアログを開きます。シリーズの値を=Sheet1!freq_arrayに設定して新しいシリーズを追加します。これを機能させるには、シート名またはブック名を含める必要があります。必要に応じてシリーズ名を追加し、「OK」をクリックします。 「横(カテゴリ)軸ラベル」の「編集」をクリックし、範囲を=Sheet1!bin_labelsに設定します。

はここ=RAND()*5と5ビン(私は彼らが配列を生成しない値で、名前とその数式を記載)10にnum_binsを変更した後

2000 <code>=RAND()*5</code> results into 5 bins

と同じシートで2000個の細胞です。 (ビンがまったく同じ値にならない場合がありますので、RAND()式は、再計算)

After changing num_bins to 10

  • (ユーザー定義のビンの大きさを持っている必要がある場合、あなたはbin_sizeシートの参照を作成し、命名式でnum_binsを計算する必要があります)
+0

これは素晴らしい答えです。ありがとう! :) – l33t

+1

小規模な修正:名前の衝突を避けるために、2番目の 'data_vals'の名前を変更する必要があります。 – l33t

0

私は考えることができる唯一の答えはあなたの式の出力範囲のサイズを変更するマクロを使用することです。

ここに、そのアイデアを示す簡単なスニペットがあります。

Dim result As Variant 
Dim targetCols As Long 

result = Evaluate(fmla) 
With rng 
    targetCols = UBound(result, 1) - LBound(result, 1) + 1 
    .Resize(1, targetCols).FormulaArray = fmla 
End With 

私は去年およそa more complete implementationを書いた - より多くのエラートレラント、2次元の出力を、など

EDIT:しかし...あなたが使用している式は、このアプローチでは動作しません:それを入力時にその出力レンジのサイズが分かっていることに依存します。

我々はこのような何かを実行可能なビンのセットを作成することができます:ここでは自動的にリサイズすることができ、代替の提案です

={(ROW(OFFSET(A1,0,0,CEILING((MAX(A:A)-MIN(A:A))/B1,1)+1,1))-1)*B1} 

場所として、これはビンの数は、前

CEILING((MAX(A:A)-MIN(A:A))/B1,1)+1 

OFFSET()を使用して範囲を作成するために使用します(値を使用していないため、ターゲットは問題になりません)。次に、範囲内の各セルのROW()(1から1を引いてゼロから始まる値を得る)を取り、ビンサイズを掛けます。値の範囲をシフトすることができます(例えば、MIN(A:A)を追加するなど)。

大きな違いは、Evaluate() VBA関数が範囲出力を生成できる範囲内でこの式を入力する必要がないことです。

ヒストグラムを取得するには、ビンの式の出力をFREQUENCY()に接続するか、数式全体をドロップします。自動サイズ変更はどちらの方法でも動作します。

マクロを実行することに特に反対の場合(カスタムリボンボタンとホットキーの組み合わせで利用可能)、Worksheet_Changeイベントを使用して、適用する機会を監視できます。それが不快な副作用を持っているかどうかはっきりとは言えません。

+0

私は簡単にすることができ、動的ヒストグラムを作成したいです単一の定数(ビンサイズ)を変更することによって変更されました。 UIインタラクションを無効にすることもできます(私はExcelオートメーションを使ってヒストグラムを作成しています)。 – l33t

+0

"ヒストグラム"とは、ワークシート上のチャートまたは配列の出力ですか?グラフの場合、名前付きの数式ですべてを行うことができます。それ以外の場合は、説明されているようにレンジリサイズ関数が必要になるか、レンジの最大サイズを設定して配列を大きくします。 –

+0

ビンサイズが変更されたときにチャートが更新されている限り、チャートは問題ありません。私は指定された数式で試してみましたが、エラーが発生しています...前にこのようなことをしたことはありません:P – l33t

関連する問題