- 締切済み
VBAで、複数条件検索の仕方を教えて下さい!
陸上競技会のデータをエクセルでデータベース型式で使用しています。 構造は簡略化しますが A B C D E F G H 性 種目 ゼッケン 名前 チーム名 記録 風力 競技日 ・・・ 男 100m 101 AB XXXX 10”06 +1.6 5/1 女 砲丸投 51 CC YYYY 15m58 4/25 男 100m 101 AB XXXX 10”02 +2.6 5/1 のように記録されています。競技日以外は文字データとして、現在データ数は約1万件(シーズンが始まったばかりでこれから増加します) このようなデータからある選手(A)の各種目毎のベスト記録を抽出したいのです。トラック競技とフィールド競技(最小と最大がベスト記録になります) 100mと200mなどは、追い風2mを超えると参考記録となりベスト記録にはなりません。 (男、100m ゼッケンなどで)検索抽出し、その中からベスト記録(競技日や名前チーム名なども同時に)を書き出すことになるのだと思いますが、どうすればいいのか分からないのです。 どのようにVBAで考えたらいいのか、教えて下さい。よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- mitarashi
- ベストアンサー率59% (574/965)
Findでの複数条件絞り込みも面倒臭そうなので、ADOを使う例です。参考URLにも記述がありますが、ここまでやるならAccessを使うと思うので、自分も多量のデータで試した事は無いです。(当方XL2000です) 皆さん書かれていますが、文字列で、時間と長さが混在した様なデータでは抽出は大変だと思います。 抽出してワークシートに貼り付けた中から人力でベスト記録を見つけるのが現実的かもしれませんね。 ご関心を持たれたら、参考URLで勉強なさってください。解説はいたしかねます。 下記コードは、データ用のブックとは別のブックに記述します。(同じブック内で抽出すると不安定との事) データは、陸上競技会データ.xlsのSheet1にあるとします。 'Microsoft AcitiveX Data Object 2.x に参照設定 Sub test() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim mySQL As String On Error GoTo errorHandle Set CN = New ADODB.Connection CN.Provider = "Microsoft.Jet.OLEDB.4.0" CN.Properties("Extended Properties") = "Excel 8.0" CN.Open "C:\Documents and Settings\????\My Documents\陸上競技会データ.xls" mySQL = "SELECT * FROM [Sheet1$] WHERE 名前 = " & "'AB'" & ";" Set RS = New ADODB.Recordset RS.CursorLocation = adUseClient RS.Open mySQL, CN, adOpenStatic, adLockReadOnly If Not RS.BOF Then MsgBox "該当する記録は" & RS.RecordCount & "件です" Else MsgBox "入力された選手は存在しません", vbCritical GoTo errorHandle '手抜き End If '+1.6,+2.6が数字で入っている場合 RS.Filter = "風力 < 2" MsgBox "該当する記録は" & RS.RecordCount & "件です" '検索結果をワークシートに貼り付ける ThisWorkbook.Sheets(1).Range("a1").CopyFromRecordset RS 'フィルターを重ねてかける事で更に絞り込める 'RS.Filter = "hogehoge" errorHandle: If RS.State = 1 Then RS.Close Set RS = Nothing If CN.State = 1 Then CN.Close Set CN = Nothing End Sub http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130_090.html http://www.accessclub.jp/ado/index.html
- ookami1969
- ベストアンサー率14% (137/953)
98%ぐらい#1さんの意見に賛成です。 「VBAなら何でも出来る」とは僕も思っていますが 現状、このシートに対して あなたの お望みの事をやらせようと 考えたら かなり効率が悪いと思います。 そもそも 何で シートを競技毎に分けないのでしょうか。 競技毎にシートを分ければ「H列 記録」は 数値を入力して後は「表示形式」で解決出来ます。 そもそも 現状 あなたのやりたい事は フィルタを設定して 別の作業シートに移してRANK関数でも付ければOKではないですかねぇ? (風速云々は「IF」や「条件つき書式」で解決しそうだし) VBAに頼る前にExcelを使いこなす努力をされた方が良いのではないでしょうか? 集計の仕方にセンスが感じられませんもの。。。
お礼
回答ありがとうございます。 数人の選手だけの処理なら手作業で十分ですが、登録選手のすべてのベスト記録を手作業では到底できません。 全選手とは思いませんが、自分のチーム(40~50人)のベスト記録を抽出するのは、手作業では気が遠くなります。何が何でもVBAに頼るつもりはありませんが、一人の選手が複数の種目の記録を持っています。 また競技別にとは思いますが、競技種目は約30種目もあり管理が大変だと思いますので。 でも作業的には同じことを、人数分・種目数分繰り返すのですから、VBAなどマクロに頼るべきだと思うのですがいかがなものでしょうか? 何か良い知恵がおありならご教授くださいませ。
- pentium100
- ベストアンサー率45% (689/1517)
何が何でも「VBA」で行わなければならないのですか? 何か理由でもあるのですか? Excel標準の抽出条件しだいでうまくやれそうな気がしますが http://allabout.co.jp/computer/msexcel/closeup/CU20070905A/ それからデータの書き方ですが >競技日以外は文字データ というのは抽出などが前提であれば少し問題があると思います。 できれば数値データとして持たせる方がよいと思います。 (単位の[m]や["]、[+]などはセルの表示形式(ユーザー定義)で何とかできるので) http://support.microsoft.com/kb/883199/ja あと可能ならば最低でも競技別に分けた方がよいかなと思います なぜ違う競技をまとめいているのか理解できません。 ご質問に真正面から答えてなくてごめんなさい。
補足
回答ありがとうございます。 数人の選手だけの処理なら手作業で十分ですが、登録選手のすべてのベスト記録を手作業では到底できません。 また競技別にとは思いますが、競技種目は約30種目もあり別ファイルにすると相当な混乱が生じたり、更新しtファイルや紛失したファイルなど、ファイル管理が大変だと思いますので。 >競技日以外は文字データ というのは他のソフトとの関係を考えてのことです。 何か良い知恵がおありならご教授くださいませ。
お礼
ありがとうございます。 >ここまでやるならAccessを使うと思うので やはりそうなのですね! あげていただいたコードで調べてみます。 参考URLも参考にします。 ありがとうございます」