• ベストアンサー

VBAで生年月日検索

 エクセルで膨大なデータ(Sheet1)の中から、入力フォーム上で生年月日を検索すると、候補者が複数人表示され、その表示された人々の中から一人をカーソルで任意選択してEnterを押下することにより、選択された該当者のデータ(氏名、性別、生年月日等)がSheet2に反映されるようなシステムを作りたいのですが、どうすればいいのでしょうか。  ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

シート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

taku5
質問者

お礼

ご丁寧に説明していただきありがとうございました。

taku5
質問者

補足

ご親切にありがたいです。 言われた通り、G2セルに誕生日を入れダブルクリックしたんですが、H2以降に氏名が表示されません。 なぜでしょうか?

その他の回答 (4)

回答No.5

ANo2続き 1.入力フォームにこだわるのであれば、Sheet3を入力フォームページとして使用し、 ANo3の方のマクロをSheet3に書くということでどうでしょう。元データがSheet1にある ので、コードを少しいじる必要がありますが、見た目は、フォームを作るのと変わりま せん。 2.ANo3のマクロが動かないということですが、私は、ANo3の通り作って正常に 動作しました。どこか入力ミスがあるのではないでしょうか? プログラムを1ステップづつ動作させて、各ステップが思ったとおりに動いているか確認 してみてください。ミスの箇所が見つかると思います。     1ステップ動作:        コードの各行の左端のグレー部分をクリックすると黒丸がつきます。        生年月日のセルをダブルクリックするとマクロが起動し黒丸の行で        一時ストップします。F5キーを押すとマクロを継続します。        全部の行に黒丸をつけると、F5キーを押すごとに1ステップづつマクロが        進みます。        Sheet部分と、VBAの画面を並べて表示し、ステップごとのSheetの動きを        見れば、不具合箇所が見つかると思います。 もっとも、マクロの各ステップがどんな命令をしているか理解できていないと不具合 箇所が見つかりませんので、まずは、理解をしてください。 ANo3さん すみません。貴マクロが、スマートだったので、引用させていただきました。

taku5
質問者

補足

ひとつずつ理解してちゃんと動きました。 ご丁寧にありがとうございました。

回答No.4

ANo2の要望に対する回答 ANo3で、セルだけを使った方法を回答されております。 これを理解できないか、希望の内容で無い場合は、不明の点を質問してください。

taku5
質問者

補足

下記の方法でも良いのですが、できれば、入力フォーム上で該当者を選択するような方が個人的にはいいかなと思っています。

回答No.2

ご希望の処理であれば、VBAを使わなくても、簡単にできますが、VBAにこだわる理由はあるのでしょか? 1.VBAを使わない方法   1)膨大なデータ(Sheet1)を生年月日でソートする。     Excel 2010の場合:生年月日のいずれかのセルを選択     メニューの「データ/AZ→」をクリックする   2)目的の生年月日/名前の行をコピーしSheet2にペーストする 2.VBAを使う方法   1)貴方が、VBAのまったくの素人であるなら、知識のある方に依頼されることをお勧めします。     この紙面で説明することは困難です。   2)ある程度知識があるのであれば、もう少し、具体的に不明部分をお知らせください。     たとえば、       (1)入力フォームの作り方がわからない。       (2)誕生日が一致する候補者の表示方法がわからない。       (3)候補者から該当者を選択するフォーム(コンボックス)の作り方がわからない。       (4)該当者のデータをSheet2にコピーする方法がわからない。   

taku5
質問者

補足

ご丁寧にありがとうございます。今勉強中でVBAを少しかじった程度のレベルです。 具体的に言うと、2と3が分からないです。 もし良ければ教えていただけますか。

回答No.1

ソフトハウスなどに発注する。 自分で作りたいなら少しは勉強して判らない所をもっと絞って質問しましょう。

関連するQ&A