- ベストアンサー
VBAで生年月日検索
エクセルで膨大なデータ(Sheet1)の中から、入力フォーム上で生年月日を検索すると、候補者が複数人表示され、その表示された人々の中から一人をカーソルで任意選択してEnterを押下することにより、選択された該当者のデータ(氏名、性別、生年月日等)がSheet2に反映されるようなシステムを作りたいのですが、どうすればいいのでしょうか。 ご教授お願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
シート1ではA2セルから下方に氏名が、B2セルから下方に性別が、C2セルから下方には生年月日が入力されているとします。 そこで例えばG1セルには”G2セルに誕生日を入力しダブルクリックしてください。”と文字列を入力します。 G2セルには検索したい生年月日を例えば1980/1/5のように入力します。 G2セルをダブルクリックすることで該当者が有る場合にはH2セルから下方に氏名が表示されます。 そのH列の氏名をダブルクリックすることでその方のデータがシート2の最下段に入力されます。 そのためのマクロはシート見出しでSheet1を右クリックし「コードの表示」でマクロを入力する画面が表示されますので次のコードを入力します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim i As Long Dim N As Long If Target = Range("G2") And Target <> "" Then i = 0 N = 1 Do i = i + 1 If Range("C" & i).Value = Target.Value Then N = N + 1 Range("H" & N) = Range("A" & i) & "/" & i End If Loop Until Range("A" & i) = "" If Range("H2") = "" Then MsgBox "該当者がありません。" Else MsgBox "H列でシート2にコピーしたい名前のセルを右クリックしてください。" End If End If If Target.Column <> 8 Or Target.Value = "" Then Exit Sub i = Mid(Target.Value, InStr(Target.Value, "/") + 1, 3) * 1 Range(Range("A" & i), Range("F" & i)).Copy Range("A" & i).Select Worksheets("Sheet2").Activate lastrow = Worksheets("Sheet2").Range("A65536").End(xlUp).Row + 1 Worksheets("Sheet2").Range("A" & lastrow).Select ActiveSheet.Paste Application.CutCopyMode = False Worksheets("Sheet1").Range("H:H").Clear Worksheets("Sheet1").Range("G2") = "" Cancel = True End Sub
その他の回答 (4)
- ken-nosuke
- ベストアンサー率36% (56/154)
ANo2続き 1.入力フォームにこだわるのであれば、Sheet3を入力フォームページとして使用し、 ANo3の方のマクロをSheet3に書くということでどうでしょう。元データがSheet1にある ので、コードを少しいじる必要がありますが、見た目は、フォームを作るのと変わりま せん。 2.ANo3のマクロが動かないということですが、私は、ANo3の通り作って正常に 動作しました。どこか入力ミスがあるのではないでしょうか? プログラムを1ステップづつ動作させて、各ステップが思ったとおりに動いているか確認 してみてください。ミスの箇所が見つかると思います。 1ステップ動作: コードの各行の左端のグレー部分をクリックすると黒丸がつきます。 生年月日のセルをダブルクリックするとマクロが起動し黒丸の行で 一時ストップします。F5キーを押すとマクロを継続します。 全部の行に黒丸をつけると、F5キーを押すごとに1ステップづつマクロが 進みます。 Sheet部分と、VBAの画面を並べて表示し、ステップごとのSheetの動きを 見れば、不具合箇所が見つかると思います。 もっとも、マクロの各ステップがどんな命令をしているか理解できていないと不具合 箇所が見つかりませんので、まずは、理解をしてください。 ANo3さん すみません。貴マクロが、スマートだったので、引用させていただきました。
補足
ひとつずつ理解してちゃんと動きました。 ご丁寧にありがとうございました。
- ken-nosuke
- ベストアンサー率36% (56/154)
ANo2の要望に対する回答 ANo3で、セルだけを使った方法を回答されております。 これを理解できないか、希望の内容で無い場合は、不明の点を質問してください。
補足
下記の方法でも良いのですが、できれば、入力フォーム上で該当者を選択するような方が個人的にはいいかなと思っています。
- ken-nosuke
- ベストアンサー率36% (56/154)
ご希望の処理であれば、VBAを使わなくても、簡単にできますが、VBAにこだわる理由はあるのでしょか? 1.VBAを使わない方法 1)膨大なデータ(Sheet1)を生年月日でソートする。 Excel 2010の場合:生年月日のいずれかのセルを選択 メニューの「データ/AZ→」をクリックする 2)目的の生年月日/名前の行をコピーしSheet2にペーストする 2.VBAを使う方法 1)貴方が、VBAのまったくの素人であるなら、知識のある方に依頼されることをお勧めします。 この紙面で説明することは困難です。 2)ある程度知識があるのであれば、もう少し、具体的に不明部分をお知らせください。 たとえば、 (1)入力フォームの作り方がわからない。 (2)誕生日が一致する候補者の表示方法がわからない。 (3)候補者から該当者を選択するフォーム(コンボックス)の作り方がわからない。 (4)該当者のデータをSheet2にコピーする方法がわからない。
補足
ご丁寧にありがとうございます。今勉強中でVBAを少しかじった程度のレベルです。 具体的に言うと、2と3が分からないです。 もし良ければ教えていただけますか。
- TooManyBugs
- ベストアンサー率27% (1472/5321)
ソフトハウスなどに発注する。 自分で作りたいなら少しは勉強して判らない所をもっと絞って質問しましょう。
お礼
ご丁寧に説明していただきありがとうございました。
補足
ご親切にありがたいです。 言われた通り、G2セルに誕生日を入れダブルクリックしたんですが、H2以降に氏名が表示されません。 なぜでしょうか?