• 締切済み

タイム計算がしたいのです

前略 たとえばですが、 駅伝部に60人登録しています。1区から10区まで全員のタイムをとり、誰が何区を走る順序だと最高タイムになるかを知りたいです。 エクセルのセルで言えば、左縦列に「Aさん」「Bさん」・・・。 上横列に「1区」「2区」・・・・「10区」まで。中にタイムが記入されています。当然ですが一人が2度走ることはできません。 ちなみに、私のエクセルのスキルは「小の上」程度です。

みんなの回答

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.6

>マクロとかアクセスとか使えば… "簡単"かどうかは別にして、マクロがアリならなんとか…。 基本的な考え方  ●1次選抜    それぞれの区間について、    11位以下の部員を選手に選んだ場合、    「その部員より上位で、かつ他の区間の選手でない部員」    が少なくとも1人存在することになるので候補から外す  ●2次選抜    それぞれの区間について、    「何位の部員を選手にするか」の組み合わせを調べる    ※1区から順に選んでいき、      ・既に選ばれている選手については飛ばす      ・暫定ベストよりも遅くなることが判った時点で抜ける     ので、いわゆる「総当り」ではありません。 以下、やっつけですがサンプルマクロです。 ※[名前の定義]で、元表(見出行含まず、氏名列を含む)に"タイム表"という[名前]をつけて実行してください。 ※元表の右隣1列を作業列として、元表の直下6行を結果表示範囲として使います。  また、元表を直接ソートするので、バックアップをとった上で実行してください。 ※区間の数、部員数は可変です(元表のサイズから判定します) ※ワークシート上でソートしているのは「持ちタイムが同じ」というケースを考慮したためです。 ※合計タイムが同じになる組み合わせが複数ある場合には最初に見つけた組み合わせを表示します。 '--------------------------↓ ココカラ ↓--------------------------  Dim cntMem   As Integer '部員数  Dim cntSct   As Integer '区間数  Dim tmpTim   As Double  '仮タイム(差分)  Dim tmpCmb()  As Integer '仮チーム(順位)  Dim bstTim   As Double  '暫定ベストタイム(差分)  Dim bstCmb()  As Integer '暫定ベストチーム(順位)  Dim aryIdx()  As Integer 'IDNo.  Dim aryTim()  As Double  'タイム(差分)  Dim aryExt()  As Boolean '選択済フラグ '-------------------------- Sub Sample()  Dim orgTbl   As Range  Dim tmpRng   As Range  Dim i      As Integer  Dim j      As Integer  Set orgTbl = Range("タイム表")  cntMem = orgTbl.Rows.Count  cntSct = orgTbl.Columns.Count - 1    ReDim aryIdx(1 To cntSct, 1 To cntSct + 1)  ReDim aryTim(0 To cntSct, 1 To cntSct + 1)    Set tmpRng = orgTbl.Offset(, cntSct + 1).Resize(, 1)    For i = 1 To cntMem   tmpRng(i) = i  Next i    For i = 1 To cntSct + 1   With orgTbl.Resize(, cntSct + 2)    .Sort _     Key1:=.Cells(1, i + 1), _     Order1:=xlAscending, _     Header:=xlNo, _     OrderCustom:=1, _     Orientation:=xlTopToBottom   End With   aryTim(0, i) = Application.Min(orgTbl.Columns(i + 1))   For j = 1 To cntSct    aryIdx(j, i) = tmpRng(j, 1)    aryTim(j, i) = orgTbl(j, i + 1) - aryTim(0, i)   Next j  Next i    bstTim = Application.Max(aryTim) * cntSct  ReDim tmpCmb(1 To cntSct)  ReDim aryExt(1 To cntMem)  Call Sample2(1)    ReDim dspAry(1 To 5, 0 To cntSct)  dspAry(1, 0) = "区間"  dspAry(2, 0) = "IDNO."  dspAry(3, 0) = "名前"  dspAry(4, 0) = "区間順位"  dspAry(5, 0) = "タイム"  For i = 1 To cntSct   dspAry(1, i) = i   dspAry(2, i) = aryIdx(bstCmb(i), i)   dspAry(3, i) = orgTbl.Cells(aryIdx(bstCmb(i), i), 1)   dspAry(4, i) = bstCmb(i)   dspAry(5, i) = orgTbl.Cells(aryIdx(bstCmb(i), i), i + 1)  Next i    With orgTbl.Offset(cntMem + 1).Resize(5)   .Style = "normal"   .Rows(1).NumberFormatLocal = "0"" 区"""   .Rows(2).NumberFormatLocal = "0"" 番"""   .Rows(4).NumberFormatLocal = "0"" 位"""   .Rows(5).NumberFormatLocal = orgTbl.Cells(1, 2).NumberFormatLocal   .Value = dspAry   .HorizontalAlignment = xlCenter  End With End Sub '-------------------------- Private Sub Sample2(ByVal Sct As Integer)  Dim i     As Integer  Dim bufTim  As Double  Dim bufAry() As Boolean  bufTim = tmpTim  bufAry = aryExt    For i = 1 To cntSct   If aryExt(aryIdx(i, Sct)) Then   ElseIf tmpTim + aryTim(i, Sct) >= bstTim Then    Exit For   Else    tmpTim = tmpTim + aryTim(i, Sct)    tmpCmb(Sct) = i    aryExt(aryIdx(i, Sct)) = True    If Sct < cntSct Then     Call Sample2(Sct + 1)    Else     bstTim = tmpTim     bstCmb = tmpCmb    End If    tmpTim = bufTim    aryExt = bufAry   End If  Next i End Sub '--------------------------↑ ココマデ ↑-------------------------- Excel2003で動作確認。 (区間が6つの場合について、ワークシート上で総当りした結果と比較検証) 以上ご参考まで。長乱コード陳謝。

matihigasi
質問者

お礼

ありがとうございました。 私のスキル不足で理解できない文章もありましたが、画像を見てマクロを貼って、無事にできました。 どうもお世話をかけました。

全文を見る
すると、全ての回答が全文表示されます。
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.5

#4様のおっしゃるとおり、できないことはありませんが、ちょっと無理のある仕様ですね。 たとえば、各区間ごとに上位TOP5を抽出します。 各区間の上位を0としたときの時間差をおのおの求めます。 例 1区 Aさん,0 Eさん,10 Dさん,16 Fさん,25 Jさん,35 最後に時間差が最も少なくなる組み合わせを抽出します。 組み合わせ数は5^10で大量ですが、人の目で見て処理できる規模になるので判断できるのではないでしょうか? 結局組み合わせ数を減らす方法でしかないのが実際なのですが・・・・。

matihigasi
質問者

お礼

回答ありがとうございます。 行き着くところはやっぱり組み合わせのようですね。 貴重な時間を割いていただきありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

2004までのExcelの行数は65536行まで、2007以降でも100万行です。 一方、1区から10区までを60人の中から選ぶ組み合わせは27億パター ンくらいありますから、総当たりでパターンを抽出して合計タイム を比較することは出来ません。それじゃぁってんで、レギュラー10 人を確定させといて誰がどの区を走るかってことになっても、360万 パターンを越えるのでやっぱり総当たりは無理です。 ほとんどを人間が判断して、どうしても迷う数パターンについてだ け比較検討するためのシートを作るしかありませんよ。区間名の下 に名前を入れると、さらにその下の行にそいつの成績が出るような ものを思いつきますね。もちろんそんなことをしても、10回走って 10回同じタイムにならないのが人間だから、単なる参考資料なんで すけどね。

matihigasi
質問者

お礼

貴重な時間を割いていただきありがとうございました。 見当違いかもしれませんが、マクロとかアクセスとか使えば簡単に出来るのかと思っていました。

全文を見る
すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.3

その表より 各々が何区を走る想定にするかの組み合わせ表を作り それぞれにパターンNo.を割り当てて パターンNo.___1____2______3____4____5_____6____7_____8____9____10_____トータル __1___5分16秒__6分05秒__5分22秒_4分37秒_9分33秒_8分59秒_4分39秒_10分17秒_5分58秒_7分36秒_1時間08分22秒 __2___6分11秒__4分59秒_10分43秒_8分02秒_4分34秒_6分05秒_10分51秒_4分38秒_9分28秒_5分51秒_1時間11分22秒 __3___4分55秒_10分33秒__5分41秒_9分17秒_8分18秒_10分30秒_8分02秒_5分58秒_9分22秒_6分39秒_1時間19分15秒 __4___6分51秒__7分57秒__5分03秒_7分20秒_7分31秒_4分55秒_7分39秒_9分23秒_6分41秒_7分20秒_1時間10分40秒 __5___6分52秒_10分27秒__6分45秒_8分48秒_4分19秒_7分41秒_5分48秒_6分31秒_9分28秒_6分35秒_1時間13分14秒 __6___5分21秒__9分23秒__6分46秒_6分08秒_9分44秒_5分34秒_8分39秒_7分29秒_6分24秒_9分33秒_1時間15分01秒                                                       ・                                                       ・                                                       ・                                                       ・ と言った表を作成すれば簡単に出るのじゃないですか? この際にタイムは1分24秒なら0:1:24と入力して 書式設定のユーザー定義で m"分"ss"秒" としてくださいね

matihigasi
質問者

お礼

組み合わせ表を作成すると、莫大な組み合わせが出来るみたいで・・・。 回答をありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です・・・ 質問内容を勘違いしていました!m(__)m 読み流してください! よくよく考えると、数名の人の実力が極端に優れている場合は どの区間も上位になってしまうので、RANK関数は使えないような気がします・・・ どうも失礼しました。

matihigasi
質問者

お礼

下記に補足を書いている間に、すれ違いでご返事を頂き間が悪くなってしまいすみません。 お気持ち、ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

一例ですが・・・ 各区間の右側に作業列(順位を入れるため)の列を挿入します。 結局10区間あるのであれば10列挿入することになります。 B2~B61に1区のタイムが入っていると仮定して・・・ C2に1区の順位を表示させる場合 C2=RANK(B2,$B$2:$B$61,-1) としてオートフィルの(+)マークでダブルクリック これで好タイム順(少ない数値順)に表示されるはずです。 同じようにすべての区間について同じ操作を行えばいいと思います。

matihigasi
質問者

補足

早速のご返事、ありがとうございます。 私も最初は各区の1位を出せば良いのかと考えたのですが、 同じ人が1位を何度も出すので、出来ればすべての組み合わせのタイムと走順を明記したいのです。60人だと組み合わせは・・。 60x59x58x57・・・・1=?? 説明不足ですみませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EXCEL2007の横列表示がおかしくなりました。

    EXCEL2007の横列表示がおかしくなりました。 EXCEL2007で、突然、ワークシートの行列表示、通常縦列は数字、上から1,2,3・・・・行、横列は左から、A,B,C,D...と表示されると思うのですが、突然なぜか、この横列まで左から1,2,3・・・・に変更されてしまいました。 元のA,B,C,D...表示にするにはどうしたらよいのでしょうか。仕事で大変困っています。宜しくお願いします。

  • excel セルとセルの間へ数字を置く

    横列Aに数字を並べ、その数字をセルのラインに乗るよう(縦列1と2の間)にした表を作成したいのですが、うまくいきません。 わかりにくい説明かもしれませんが、わかる方、よろしくお願いします。 Excel2007をvistaで使用しています。

  • ナンプレ 次の一手を教えてください

    ナンプレ 次の一手を教えてください 行き詰ってしまいました、 解説もお願いします 添付は 横列は左から あかさ たなは まやら  縦列は上から abc def ghi です

  • エクセルでタイムカードの管理をしたい

    いつもお世話になります。 会社でタイムカードの処理を担当しています。 今までは各個人から提出された休日出勤届けや残業届けを 手書きで控えを取っていました、が、最近忙しく、 簡略化できないかと思い、エクセルで管理したく思ってます。 届け見ながらを氏名日付時刻等入力すると別のシートに用意してあるカレンダー(縦列に日付、横列に各個人の名前一覧がある)の日付と名前のクロスするところに○印を付けたいと思っているんですが、 どんな関数を使えばいいか見当もつきません。 知恵をお借りしたく思います。よろしくお願いいたします。

  • 『EXCEL』で縦列と横列を置換するには?

    EXCELで表などを作ろうとするとき、例えば、1行目から10行目(セルA1~A10)まで各セルに「1~10」の数字を入力し、A1~J1列に「A~J」の文字を各セルに入力するとします。これらの縦列と横列に入力したデータをそっくり置換して入れ替える機能があったと思うのですが、どのようにすればよろしいのでしょうか?ご存知の方、教えて頂けますとありがたいです。

  • 18名で総当たりダブらないカップルをつくるには

    数学の組合せの問題みたいですが、出来なくて困っています。 18人のメンバーがいて、(つまり9組)ダンスをします。 総当たりで、ダブらないで、みんなが全員と組むことができるための 組合せの表の作りかたをどなたかお教えください。 エクセルで横列1~18 縦列1~18 各列各行とも1~18の数字がそろわ ないと駄目ですが、なかなか作れません。 こういう組合せを作るソフトがもしあればお教えください。

  • Excelで○を使った計算?

    横列に A商品 1000円 B商品 900円 C商品 1000円 D商品 500円 と書き 縦列にに A会社 B会社 C会社 の会社名を書いた 表を作成し 各会社が希望する商品があれが そのセルに文字列の○(文字入力のまる)を入れ時に   (金額入力の変わりに○を表に入力する) 各会社の希望商品の合計金額が(会社名の縦列の下に)出るような Excel表のは作成出来るのでしょうか? 教えてください.参考サイトかやり方を教えてください. 困っています,お願いします.

  • Excel操作を教えてください

    Excelで表を作成しているのですが、セルの固定について質問です。 A1横列と1A縦列を同時に固定したいのですがうまくいきません。 ウィンドウ枠の固定は1箇所しかできないのでしょうか?以前、縦横2箇所固定されている表を見たことがあるのですが・・・ ご存知の方は教えてください。

  • Excelで縦割りを途中から増やすには?

    説明し難いのですが・・・・ Excelで予定表とか**名簿とかを作っている時に 表の上の方はあまり細かくなく、 横列のA~Jぐらい有ればいいかな?なんて作っていったら 下のほうでもっと細かくしなければいけなくなった時に 上のA~JをA~Zにすると 最初に作った所が、左側に寄ってしまいます。 縦列の途中(ある数字の行)から縦列を増やすことは出来ますか? 1~20まではA~Jだけど 21~はA~Zで・・・・って言う様な感じです。

  • エクセルで特定のセル列のみ摘出、表示

    質問内容なのですが、エクセルシート縦列に1万セルの特定の文字が記載されているのですが その中から調べたい特定に一致した文字横列のみ摘出か表示は可能でしょうか?(約1万セルから調べたい700セルを表示したいです。) (以前フィルタ使用していたのですがやはり誤差がでてしまい正確な結果が得られなかったので…) 当方Excel 2007を使用しております。 質問内容例 __ 1-2 ---- 2-8 ←○ ---- 3-5 ---- 5-4 ←○ ---- ○の部分のみ摘出か表示ができればうれしいです よろしくお願いします。

このQ&Aのポイント
  • Android用DVD再生ドライブの電源がつかない問題について質問があります。
  • 質問者はLDR-PMH8U2Pシリーズ_SG V03を使用しており、電源ボタンがないため、ACアダプタの接続が必要なのかどうか疑問に思っています。
  • また、ドライブが認識されず、スマートフォンもドライブを認識しない状況であることを述べています。
回答を見る

専門家に質問してみよう