合計を作成するための組み合わせの決定(Microsoft Excel)
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トレーニングのソースです。
このヒント(12234)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。
Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります:
link合計を作成するための組み合わせの決定。