- 締切済み
オートフィルタのようなマクロ
ゴルフのスコア表を作っているのですがある打数の人を検索して一覧で表示したいのですが方法はあるでしょうか?超初心者ではありませんがまだまだ初心者です。教えて下さいお願いします。 スコア表を入力してある人の行に18ホール分のスコアを入力します。 例えばA-1に名前B-1からS-1までにスコアを入力します。 これと同じ用に A-2からS-2までA-3からS-3までというように各スコアをそれぞれ入力するとします。 そこでオートフィルタを使うとどこかの列のスコアしか抽出できないと思うのですが やりたいこととしては 例えば3人分入力していたとすると A-2からS-3までのスコア全てから例えばホールインワンの人(スコアが1の人) を抽出したいのですが方法はあるでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17070)
#2です。マクロの記録を改造してできるコードを思いついたので追加しておきます。 例データ A1:S4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 山田 4 5 3 3 4 5 7 5 5 6 3 4 5 6 3 4 6 5 上田 3 4 4 4 4 4 6 5 8 7 3 5 6 6 4 4 6 5 鈴木 5 4 4 5 4 5 5 6 6 5 4 7 4 7 3 5 8 5 コード 標準モジュールに Sub Macro1() x = InputBox("指定スコア") c = Application.WorksheetFunction.CountIf(Range("B2:S4"), x) MsgBox c k = 2 '--- Range("B2:S4").Select Selection.Find(What:=x, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate '---- cl = ActiveCell.Column rw = ActiveCell.Row Worksheets("Sheet2").Cells(k, "A") = Worksheets("Sheet1").Cells(rw, "A") '競技者 Worksheets("Sheet2").Cells(k, "B") = Worksheets("Sheet1").Cells(1, cl) 'ラウンド k = k + 1 '---- For i = 1 To c - 1 Selection.FindNext(After:=ActiveCell).Activate cl = ActiveCell.Column rw = ActiveCell.Row Worksheets("Sheet2").Cells(k, "A") = Worksheets("Sheet1").Cells(rw, "A") '競技者 Worksheets("Sheet2").Cells(k, "B") = Worksheets("Sheet1").Cells(1, cl) 'ラウンド k = k + 1 Next End Sub ーーー 結果 Sheet2に A列 B列 競技者 ラウンド 山田 10 山田 14 山田 17 上田 7 上田 13 上田 14 上田 17 鈴木 8 鈴木 9 ーーーーー 改造前のマクロの記録は 操作は ツールーマクロー新しいマクロの記録 B2:S4を範囲指定 編集ー検索ー(例えば)6を入力ー次を検索ー次を検索・・ それと上記コードを比べると、改造箇所がわかりますが、改造もなれないと難しいものと思うが。 ただ上記のやり方が絶対唯一ではない。
- imogasi
- ベストアンサー率27% (4737/17070)
エクセルの初心者かどうかと、VBAの初心者とは違うものと思います。エクセルの熟練者に越したことは無いが ・VBAのオブジェクト・メソッド・プロパティ ・プログラムに適した、やり方の組み立て方(ロジック) の両方が判る必要があリ、特に後者は経験で会得するような(ゴールの無い)スキルです。 前者はマクロの記録などを使う、本を調べるとある程度何とかなります。 質問の書き方からして、マクロでの処理は、すぐは実現は難しいと思う。経験してみれば、なんと言うことの無い内容ですが。 ーーー マクロを考える前に 人間が手作業でやる場合を考えてください。 ・極く詳しく ・文章にして ・箇条書きにして、 ・作業順序を守った 記述とします それぞれのステップでVBAコードをどう書きますか。 それが1,2箇所判らない程度なら、このコーナーに質問するレベル で、それに絞って質問できます。 何も手が付かないのでは無いですか。それでは本題をハズレ、VBAの例題をぼちぼちやってスキルを上げていくよりほかない。 ーー 当面関数ででもやる方法を質問したら。 >ホールインワンの人(スコアが1の人) を抽出したいのですが 特殊な例過ぎてぴんと来ない。ほとんどのスコア表では1は出てこないのでは? ーー その行に1つしかない(あるいは0の場合アリ)ものを探す。 その行に複数あるものから1つ探す。 その行から1つ複数あれば該当分を全て抜き出す。 ーー またスコアを列挙する のか プレイヤー名を列挙するのか などのことがはっきり質問には明記されいない。そういう思考訓練に慣れてないのでしょうが、特に関数でやると、方法ががらりと変わるものです。 関数では抜き出し問題は難しい。
- fumufumu_2006
- ベストアンサー率66% (163/245)
とりあえず、Excelの色々な機能を使うと気づくのですが、1行目はデータではなく見出しにした方が良いかともいます。 A1=名前、B1-S1ホール番号 A2=参加者名1 A3=参加者名2 A4=参加者名3 上記の中で、1回でもホールインワンを出した人を探し出すと言う事なら、下記のようではどうでしょうか? 違ったら読み飛ばしてください。 T2=MIN(B2:S2) にして、人数分下へコピーする。 T列はその人の最短ストロークになるので、後はオートフィルタで1を表示させる。 その他にExcel使ってスコア管理すれば、ぺリアの計算やオリジナルハンデの計算を前もって設定すれば、順位の計算が瞬時にできます。 打ち上げの時点で隠しホールを1つづつ決める度に、その時点での順位を見ることとかもできます。 また「あのホールが隠しホールなら何位だったのに」という、ちょっとむなしいシミュレーションもできます。