2017-07-21 3 views
-4

私はランキングからのシフトをたくさんしようとしており、使用する式が分かりません。ランキングからのシフトを大きくするループまたは配列?

本質的に私たちはパフォーマンススコアとトップパフォーマーが誰であるかを見つけるランキング機能を持っています。ランキングが高いほど、最初のシフトの選択肢が得られる可能性が高くなります。

ただし、シフトには一定の量しかありません。

理解を深めるために、以下のスプレッドシートをご覧ください。私は、各人がどのようなシフトをしているかを示すために、シフト列に入力できる式を探しています。 VBAも大丈夫です。

enter image description here

+0

まで戻ってそれをバンプこれは、不足のオペレーションリサーチの問題のように思えます。あなたは本当にスケジュールの論理を綴っていません。たとえば、多数の低いランクの人々が最初の選択肢を持つことを可能にするならば、上位ランクの人に第2の選択肢を与えますか?このような潜在的なトレードオフに対処する必要があります。最適化しようとしている目的関数がありますか?単純な式は機能しません。おそらくVBAが必要です(ただし、ソルバーを呼び出せるように設定することもできます)。何を試しましたか? –

+0

合理的な経験則は、人をランク順に並べ替えることであり、先ず先着順にそのシフトを選ぶことができます。各人が最も好む残りのシフトを選ぶ(まだ利用可能な場合は最初の選択、それでも利用可能な場合は2番目の選択など)、VBAでコードするのは簡単ですが、得られるスケジュールは最適ではないかもしれません。 –

+0

それぞれの人は、それぞれのシフトがなくなるまで、上位にランクされ、2番目にランク付けされるなど、最初の選択肢を得ます。私はVBAでループの必要性を認識しますが、VBAは私の専門ではありません。 – Devin

答えて

1

あなたは式でそれを行うことができますが、それは大きな式になります。基本的に、一連のIF文でカプセル化された一連のVLOOKUPが必要です。

ロジックの例:

IF(Rank<=VLOOKUP(Choice1), Choice1, If(Rank<=(VLOOKUP(Choice1) + VLOOKUP(Choice2), Choice2, IF(... 

私はあなたには、いくつかの追加の列を追加し、新しい列での計算の一部を実行式のサイズを小さくすることをお勧めします。例えば

T2 becomes =VLOOKUP(G2, $P$1:$R$6, 3, FALSE) 
U2 becomes =T2 + VLOOKUP(H2, $P$1:$R$6, 3, FALSE) 

など、現在のシフト値を検索し、累計に追加されるように。

次にM (Shift)であなたのIFの文があります。

=IFERROR(INDEX(G2:K2,0,IFNA(MATCH(L2,T2:X2,1)+1,1)),K2) 

MATCHは(彼らは最初の選択肢を得ること、すなわちかどうか)ランクがどのように多くの列の累積シフト合計越えています。

INDEXは、その選択肢をシフトする選択肢の列にあります。

注:コメントに記載されているとおり、これはランクの衝突(2人以上の人が同じランクを持つ場合)の処理はありません。

なぜ+1/IFNA/IFERRORですか?マッチは合計を超えない場合に元に戻ります。ランク24 - 選択肢3になりたい - は選択肢2を超えますが、選択肢3を超えません。したがって、一致はそれを超えた最後の選択肢2であるとみなします。選択肢3に正しく一致するようにバンプアップします。これは、選択肢1の値よりも小さい場合と同じように、選択肢1と決して一致しないチャレンジを導入します。これは、IFNAによって補完されます。「あなたがマッチしなければ、1を返します。

IFERRORについてはどうなりますか?覚えている?つまり、6つの値が選択肢のいずれとも一致しない場合があります(たとえば、シフトスロット数以上で終了した場合など)。 IFERRORが選択5.

Associate Shift Pattern

関連する問題