再びお邪魔します。#3の者です。
>このチーム戦の入賞者(3名)の名前がわかるようにできますでしょうか?
・・・やはり知りたいですよね(笑)。
となると、私の技術では、関数による処理で各チーム毎の上位3人の名前を取り出すのは無理なので、やっぱりマクロかとなります。
そこで以下をご提案します。
・A1セルを「チーム名」、B1 「選手名」、C1 「得点」とする。
・2行目以降、各地の担当者が送ってきたらどんどん入力していく
こうして、データのシートが出来ました。そのうえで、以下のコードを実行すれば一覧表になると思います(テスト済)。
●●●万全を期して、元ファイルは保存の上、コピーしたファイルでテストしてください。
念のため作業法も記します。
【1】エクセルから、Alt+F11でVBE画面を開き、Alt+I、M で標準モジュールを開きます。
【2】真っ白な画面が開きますが、そこに以下のコードをコピペします。(冒頭にOption Explicitの表記があれば、その下に)
【3】エクセル画面に戻り、データのシートを選択した状態から、Alt+F8 をして、実行したいマクロ名をダブルクリックしてやれば作動します。
【補足】モジュールへの貼付は1回だけで結構です。後は、データをどんどん入れていく都度にでも、データシートから、Alt+F8 でマクロを呼び出してやれば、いつでも使えます。
以下はコードです。2パターンやってみました。2通り試してみて結果を見てみてください。
なお、コピペの際は、両方とも同じモジュールに貼って構いません。
↓↓↓↓↓↓↓↓↓ ここからコピー ↓↓↓↓↓↓↓↓↓
Sub 整列上位三人()
ActiveSheet.Copy After:=ActiveSheet
Cells(1, 1).Sort _
Key1:=Cells(1, 1), _
Order1:=xlAscending, _
Key2:=Cells(1, 3), _
Order2:=xlDescending, _
Header:=xlYes, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
Dim p As Long
p = 2
Do
If Cells(p, 1).Value = 0 Then
Exit Do
ElseIf Cells(p, 1).Value <> 0 Then
Cells(p, 4).Value = Application.WorksheetFunction. _
CountIf(Range(Cells(2, 1), Cells(p, 1)), Cells(p, 1))
End If
p = p + 1
Loop
Cells(1, 4).Value = "順位"
Cells(1, 1).AutoFilter _
Field:=4, _
Criteria1:="<=3", _
Operator:=xlAnd, _
VisibleDropdown:=True
Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets.Add
ActiveSheet.Paste
With ActiveWindow
.Zoom = 85
.DisplayGridlines = False
End With
With Cells(1, 1)
.CurrentRegion.Borders.ColorIndex = 15
.Select
End With
End Sub
Sub 全員整列()
ActiveSheet.Copy After:=ActiveSheet
Cells(1, 1).Sort _
Key1:=Cells(1, 1), _
Order1:=xlAscending, _
Key2:=Cells(1, 3), _
Order2:=xlDescending, _
Header:=xlYes, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
Dim p As Long, q As Long
Dim StartRow As Long
StartRow = 2
q = 0
For p = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(p + 1, 1).Value <> Cells(p, 1).Value Then
Range(Cells(StartRow, 1), Cells(p, 3)).Cut _
Destination:=Cells(2, 3 * q + 1)
StartRow = p + 1
q = q + 1
End If
Next
Range(Cells(1, 1), Cells(1, 3)).Copy
For p = 4 To Cells(2, 1).End(xlToRight).Column Step 3
Cells(1, p).PasteSpecial Paste:=xlPasteAll
Next
With ActiveWindow
.Zoom = 85
.DisplayGridlines = False
End With
Cells(1, 1).CurrentRegion.Borders.ColorIndex = 15
Dim r As Long, c As Long
r = Cells(1, 1).CurrentRegion.Rows.Count
c = Cells(1, 1).CurrentRegion.Columns.Count
For p = c To 3 Step -3
Range(Cells(1, p - 2), Cells(r, p)).BorderAround _
LineStyle:=xlContinuous
Next
Cells(1, 1).Select
End Sub
↑↑↑↑↑↑↑↑ ここまでコピー ↑↑↑↑↑↑↑↑
ご希望の形でなければすみません。
よろしくお願いします。
お礼
ご回答ありがとうございます。 先日ご回答いただいた分でいろいろと試してみました。#NUM!が表示されるので、表示しないようにする方法を探したり(中途半端で終わりましたが…)その他、いろいろ勉強しましたが、なかなか理解できないところが多くて困っております。 今回のご回答は私にとってチョット手強そうです。 やはりマクロですか… 兎に角、説明通りにできるかどうかやってみます。 素人の私に解りやすく説明していただき、本当にありがとうございます。