複数の所有者のリストから、1人の所有者で製品リストを作成する方法は?


1

A2:A21に製品のリストがあります(A1:M1はタイトルバーです)。これらの製品の背後には、これらの製品を修理できる12人の所有者(B2:M21)の名前があります。しかし...すべての所有者がすべての製品を修理できるわけではありません。それが空のセルがある理由です。同じ製品リストを持つ自動セカンドシートを作成したいのですが、現在は所有者が1人だけで、使用可能な所有者から選択されています。また、選択範囲が均等に分割されるようにします。すべての所有者が同じ量の(または可能な限り近い)製品を所有できるようにします。ありがとうございました!


上記のことを次の式で試しました:<<< = INDEX( 'Sheet1'!O2:Z2、RANDBETWEEN(1,12))>>>そして、すべてのセルを引っ張りますが、空のセルを除外します。そして、分割が等しいかどうかはわかりません。
フランキー

ランダム関数を使用する場合、除算は等しくなりません。このためのワークシート関数ソリューションはありません。ただし、循環参照を使用する場合を除きますが、少し危険です。
freekvd

回答:


1

説明しているのは、単純な線形計画法(または整数計画法)の問題です。Excelにはソルバーと呼ばれるアドインがあり、デフォルトでは無効になっています。で有効にできExcel Options > Add-Ins > Manage Excel Add-Ins (Go)ます。これにより、[データ]タブの下のリボンにソルバーが追加されます。

解決する目的は、さまざまな修理工の総数を最大化することです。あなたの制約は、誰かが特定の製品を修理できるかどうか、そして各製品に少なくとも1人の修理工が必要かどうかです。

ソルバーの機能の詳細については、Googleを使用できますが、このチュートリアルは良さそうです。


1

次のことから始めましょう:

ここに画像の説明を入力してください

次のマクロは、最初に最初の列を2番目のシートにコピーします。マクロは最初の製品(携帯電話)から始まり、列Bで始まる列をスキャンして「X」を探します。「X」が見つかると、所有者は2番目のシートに移されます。

次に、マクロは2番目の製品(充電器)に移動し、列全体でスキャンを繰り返します。しかし、現在は列Bではなく列Cで始まります。これは、所有者を均等に分散させるためです。マクロは次のとおりです。

Sub Owner()
    Dim s1 As Worksheet, s2 As Worksheet
    Dim i As Long, j As Long
    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet2")
    s1.Range("A:A").Copy s2.Range("A1")
    j = 2
    For i = 2 To 21
loopit:
        If s1.Cells(i, j) = "X" Then
            s2.Cells(i, 2).Value = s1.Cells(1, j).Value
            j = j + 1
            If j = 14 Then j = 2
            GoTo exloopit
        Else
            j = j + 1
            If j = 14 Then j = 2
        End If
        GoTo loopit
exloopit:
    Next i
End Sub

出力シートの例を次に示します。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.