3列のデータを含むワークシートがあるとします。最初の列には、アルファベットの各文字AからZが順番に並んでいます。

2番目の列には、アルファベットの文字に関連する出現回数が含まれています。 3番目の列には、アルファベットの文字に関連する時間数が含まれています。

アルファベットの組み合わせを3番目の列(時間)に基づいて4つのグループにできるだけ均等に分配したい場合はどうなりますか?

たとえば、アルファベットの各文字のすべての時間の合計が4,000時間である場合、4つのグループのそれぞれがグループあたり約1,000時間になるように、アルファベットを分離する組み合わせを考え出す必要があります。

これは実際、離散数学の分野でよく知られている問題です。ソリューションを提供するためにさまざまなアルゴリズムが開発されており、特定のプログラミング言語(LISPなど)があります

これにより、最適なソリューションを「検索」できるツリー構造の作成が大幅に容易になります。

ただし、この場合は、マクロを使用する単純なアプローチが最適です。列AからCにデータがあると仮定します。次のマクロは、指定した範囲を分析し、要件を満たす値の組み合わせを返します。

Function DoDist(sRaw As Range, _   iTCol As Integer, _   iBuckets As Integer, _   iWanted As Integer, _   iRetCol As Integer) As String

Dim lGTotal As Long     Dim lPerBucket As Long     Dim lCells() As Long     Dim sRet() As String     Dim lBk() As Long     Dim sBk() As String     Dim lTemp As Long     Dim sTemp As String     Dim J As Integer     Dim K As Integer     Dim L As Integer

Application.Volatile     ReDim lCells(sRaw.Rows.Count)

ReDim sRet(sRaw.Rows.Count)

ReDim lBk(iBuckets)

ReDim sBk(iBuckets)



lGTotal = 0     For J = 1 To sRaw.Rows.Count         lCells(J) = sRaw(J, iTCol)

lGTotal = lGTotal + lCells(J)

sRet(J) = sRaw(J, iRetCol)

Next J

For J = 1 To sRaw.Rows.Count - 1         For K = J + 1 To sRaw.Rows.Count             If lCells(J) < lCells(K) Then                 lTemp = lCells(J)

lCells(J) = lCells(K)

lCells(K) = lTemp                 sTemp = sRet(J)

sRet(J) = sRet(K)

sRet(K) = sTemp             End If         Next K     Next J

lPerBucket = lGTotal / iBuckets     For J = 1 To sRaw.Rows.Count         L = iBuckets         For K = iBuckets To 1 Step -1             If lBk(K) <= lBk(L) Then L = K         Next K         lBk(L) = lBk(L) + lCells(J)

sBk(L) = sBk(L) & sRet(J) & ", "

Next J

For J = 1 To iBuckets         If Right(sBk(J), 2) = ", " Then             sBk(J) = Left(sBk(J), Len(sBk(J)) - 2)

End If         sBk(J) = sBk(J) & " (" & lBk(J) & ")"

Next J

DoDist = sBk(iWanted)

End Function

この関数には5つのパラメーターが渡されることに注意してください。 1つ目は評価する範囲、2つ目は合計する必要があるその範囲内の列のオフセット、3つ目は評価に使用する「バケット」の数、4つ目は評価に使用する「バケット」の数です。返すバケット。5番目は、返す値を含む(指定された範囲内の)列のオフセットです。

マクロが行うことは、合計したい列のすべての値を取得し、それらを降順でソートすることです。これらの値は、最大から最小まで、いくつもの「バケット」に分散されます

あなたはあるべきだと指定しました。番号は常に、合計が最小のバケットに追加されます。関数によって返される文字列は、戻り値(5番目のパラメーターで指定された列の各セルにあるもの)とバケットの合計を表します。

たとえば、範囲A1:C:26を評価する場合、分布を範囲の3番目の列(列C)の値に基づいて配置し、分析に4つのバケットを含める必要があります。 3番目のバケットを返したい場合、および範囲の列Aにあるものを関数に返すようにしたい場合は、次を使用して関数を呼び出します。

=DoDist(A1:C26,3,4,3,1)

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(2408)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。