• 締切済み

VBA Excel 名簿を検索

Excel2013です。 別シートに名簿、作業用シートで名前を検索する、別シートにある名簿から検索された名前を選択すると、その名前の住所や電話番号が作業用シートに表示出来るようにしたいのですが、どなたかVBに詳しい方教えて下さい。 出来れば、名簿に無い場合は新規に登録出来たり、変更があったりしたら編集も出来て、重複してる場合は削除などが出来ればいいのですが。

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.4

度重なり申し訳ありません。 先ほどの回答に追記しておけばよかったのですが、 作業用シートにオートシェイプで「実行」や「検索」などを作成し、マクロを登録することで 入力→オートシェイプクリックでマクロを実行できるため、より手軽にご利用できるかと思います。 (作業用シートを印刷するとのことですので、  印刷設定を印刷しないにすると良いと思います) http://www.konomiti.com/vba01_1.html →ボタンからマクロを実行できるようにする。(マクロの登録) が参考になるかと思います。 今回のマクロは No2の添付画像にありますとおり、「*いか」で検索しますと「すいか」のようにワイルドカード検索(「*」を用いた検索)が行えます。 現状においてワイルドカードで複数一致する名前がある場合、一番初めに一致するものしか検索されない問題点があります。 (「*いか」でワイルドカード検索をした場合、「すいか」「するめいか」などが名簿にあると一致対象となりますが、今回のコードでは初めにヒットする「すいか」の行しか取得されません。) おまけ機能の「del」を入れることで指定行の削除は、ワイルドカード検索を行った場合適用されません。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.3

>作業用のシートを作成した後はプリントアウトします。 >名前と住所そして電話番号を入力しなければいけない書類なので、 >名前を検索してなるべく入力しなくても作成出来るようにしたいと考えてます。 そのご利用方法でしたら、「名簿」シートをNo2の添付画像のような様式で作成して頂き 以下の箇所を変更して頂ければご利用できると思います。 Set tar(0) = Sheets("作業用シート") col1 = Split("A2,B2,C2", ",") Set tar(1) = Sheets("名簿") >名前を検索して登録されて無ければ、ついでに登録出来たら、 >次に作成する人は楽になると考えました。 >教えていただいたコードを参考に試してみます。 不都合あれば調整致しますので問題点、動作状況、目的等をご提示ください。

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.2

No1の解説になります。 ■VBAコードの追加方法 (1)Alt+F11で「Microsoft Visual Vasic」を開きます (2)「挿入→標準モジュール」で新規モジュールを作成 (3)作成されたモジュールにNo1のVBAコードを全て貼り付けてください 現在の設定では添付画像のような様式で動作いたします。 (ただし、作業用シートと名簿のシートは同じブック内である必要があります) ★★★★★★必ず!★★★★★ いきなり本番で利用せず、画像のサンプルデータと同じものを作成のうえ、動作確認お願いします ■基本的な使い方 (1)「作業用シート」のセル「A2」に検索したい名前を入力 (2)エクセルメニューの表示→マクロ→「取得」を実行 (3)「名簿」シートの「A」列を検索し一致した場合の住所と電話を「作業用シート」のセル「B2」「B3」に表示されます (4)一致しなかった場合は確認のダイアログが表示され、新規追加処理にうつります。 ■新規追加処理について 基本的な使い方の(4)で新規追加用のダイアログが表示されます 「○○,△△」のように住所と番号をカンマ「,」で区切り指定してください。 (この場合の○○は住所、△△は番号です) 指定した内容が名簿リストの最終行に追加されます ■更新をする場合 (1)「作業用シート」のセル「A2」に対象の名前を入力 (2)「作業用シート」のセル「B2」「C2」に更新後の住所、電話を入力 (3)基本的な使い方の(2)と同様に「取得」を実行 (4)このとき、(1)の対象が見つからなければ新規追加処理にうつります。 (5)一致した名前が見つかれば(2)で入力した内容で「名簿シート」が更新されます。 ■重複している場合 基本的な使い方で「A2」で指定した名前が重複している場合は重複削除の確認表示がでます。 「はい」をクリックで一番上の一つを残して「名簿シート」から対象の重複行が削除されます。 (注意!!!!!) 住所、番号の重複チェックはしておらず、名前が重複しているかどうかで判断しています。 名前が同じであれば、住所、番号が異なっていても削除されます。 ■指定削除(おまけ機能) (1)セル「A2」に対象の名前を入力します (2)セル「B2」に「del」を入力します (3)マクロ「取得」を実行すると指定した名前の行が名簿シートから削除されます ■設定変更 コード内の以下の場所を変更することである程度のフォーマットの変化に対応できます。 (1)「作業用シート」や「名簿シート」が以下の「"作業用シート"」、「"名簿"」の部分になります。   必要に応じて変更してください。 (2)"A2,B2,C2"が「作業用シート」において、入力・設定・取得する「名前、住所、電話」のセルになります。   変更する場合は「名前」「住所」「電話」セルの順番でカンマ「,」で区切って指定してください。 (3)"A,B,C"が「名簿シート」において、名前、住所、電話のセル記号になります。   変更する場合は「名前」「住所」「電話」の列記号の順番でカンマ「,」で区切って指定してください。 '▽設定---------------------------▽ Set tar(0) = Sheets("作業用シート") col1 = Split("A2,B2,C2", ",") Set tar(1) = Sheets("名簿") col2 = Split("A,B,C", ",") '△-------------------------------△

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

様式の提示がなかったため、勝手に作りました。 こんな感じでどうでしょ? コードだけで文字制限限界なので説明は次の回答にまたぎます。 ■VBAコード Option Explicit Dim tar(1) As Worksheet Dim col1, col2, dat Sub 取得() Dim rmax As Long Dim hit As Long Dim inp As String Dim flag, del '▽設定---------------------------▽ Set tar(0) = Sheets("作業用シート") col1 = Split("A2,B2,C2", ",") Set tar(1) = Sheets("名簿") col2 = Split("A,B,C", ",") '△-------------------------------△ With tar(1) rmax = .Range(col2(0) & Rows.Count).End(xlUp).Row hit = 検索(.Range(col2(0) & "1:" & col2(0) & rmax), tar(0).Range(col1(0))) If hit < 0 Then '重複した場合→削除確認→(削除処理)→終了 If MsgBox("""" & tar(0).Range(col1(0)) & """の重複行を削除しますか?", vbYesNo, "重複しています") = vbYes Then MsgBox "削除数/重複数:" & 重複(.Range(col2(0) & "1:" & col2(0) & rmax), rmax, tar(0).Range(col1(0)), Abs(hit)), vbOKOnly, "削除しました" End If Exit Sub End If If hit = 0 Then '見つからなかった場合→追加確認→(追加処理)→終了 If MsgBox("""" & tar(0).Range(col1(0)) & """を追加しますか?", vbYesNo, "名前が見つかりません") = vbYes Then inp = InputBox("住所と電話をカンマ「,」で区切って入力してください", "登録します", "住所,電話") If inp <> "" Then dat = Split(inp, ",") tar(1).Range(col2(0) & rmax + 1) = tar(0).Range(col1(0)) tar(1).Range(col2(1) & rmax + 1) = dat(0) tar(1).Range(col2(2) & rmax + 1) = dat(1) MsgBox "追加しました" Else GoSub cn1 End If Else GoSub cn1 End If tar(0).Range(col1(1), col1(2)).ClearContents Else '見つかった場合→削除チェック If Len(tar(0).Range(col1(1))) + Len(tar(0).Range(col1(1))) > 0 Then '削除チェック If tar(0).Range(col1(1)) = "del" Then '削除確認→(削除処理) del = MsgBox("""" & tar(1).Range(col2(0) & hit) & """を削除しますか?", vbYesNoCancel, "確認") If del = vbYes Then MsgBox """" & tar(1).Range(col2(0) & hit) & """を削除しました" tar(1).Rows(hit).Delete End If If del = vbCancel Then GoTo cn2 Else '更新確認→(更新処理) flag = MsgBox("""" & tar(1).Range(col2(0) & hit) & """を更新しますか?", vbYesNoCancel, "住所または電話が空欄ではありません") If flag = vbYes Then tar(1).Range(col2(1) & hit) = tar(0).Range(col1(1)) tar(1).Range(col2(2) & hit) = tar(0).Range(col1(2)) MsgBox """" & tar(1).Range(col2(0) & hit) & """を更新しました" End If If flag = vbCancel Then GoTo cn2 End If End If '削除・更新以外で取得 If del <> vbYes And flag <> vbYes Then tar(0).Range(col1(1)) = tar(1).Range(col2(1) & hit) tar(0).Range(col1(2)) = tar(1).Range(col2(2) & hit) Application.ScreenUpdating = False tar(1).Activate tar(1).Rows(hit).Select tar(0).Activate Application.ScreenUpdating = True MsgBox "取得しました" End If End If End With Exit Sub cn1: MsgBox "キャンセルされました" Return cn2: MsgBox "キャンセルされました" End Sub Function 重複(tar_r As Range, rmax As Long, word As String, hit As Long) As String Dim i As Long Dim cnt As Long Dim nrow As Long For i = tar_r.Count To 1 Step -1 If tar_r.Cells(i) = word Then nrow = tar_r.Cells(i).Row If nrow <> hit Then 重複 = 重複 & vbCrLf & tar_r.Cells(i) & " (" & nrow & "行目)" tar(1).Rows(nrow).Delete End If cnt = cnt + 1 End If Next i 重複 = cnt - 1 & "/" & cnt & 重複 End Function Function 検索(tar As Range, word As Variant) Dim i As Long Dim hit As Integer On Error GoTo era For i = 1 To tar.Count If tar.Cells(i) = word Then hit = hit + 1 Next i If hit > 1 Then 検索 = -1 * tar.Find(word).Row: Exit Function 検索 = tar.Find(word).Row Exit Function era: 検索 = 0 End Function

akiyes
質問者

お礼

いつもありがとうございます。 使っている様式が詳しく伝えられなくてすいませんでした。 作業用のシートを作成した後はプリントアウトします。名前と住所そして電話番号を入力しなければいけない書類なので、名前を検索してなるべく入力しなくても作成出来るようにしたいと考えてます。 名前を検索して登録されて無ければ、ついでに登録出来たら、次に作成する人は楽になると考えました。 教えていただいたコードを参考に試してみます。

関連するQ&A

  • 名簿をgoogle検索のように検索

    シート1に名簿があり、別のシートのセルで名簿を検索したいです。 名簿には氏名、ふりがな、識別番号、住所、電話番号。 別シートには氏名、住所、電話番号を入力する書類。 たとえば、氏名を入力するセルで(さ)と入力すると、 斉藤○○ 佐川○○ 佐藤○○ ドロップダウンで(さ)から始まる名前が出てくるようにしたいのですが、どなたか教えてください。

  • エクセルで作成した名簿

    エクセルで作成した名簿があります。 名前・住所・電話番号・性別等々書かれているのですが…。 その中から、男性だけを取り出したいのですがどうしたよいでしょうか? 男の人だけ、名前だけを同じシート内の別の列に抜き出したいのです。 中には重複している人もいて、重複している人はいくつあっても1つだけ取り出したいのですがどうしたらよいでしょうか?

  • Excel2007でVBAを用いて名簿を作成したいのですが、うまくいき

    Excel2007でVBAを用いて名簿を作成したいのですが、うまくいきません。 どうかお力を貸していただけませんでしょうか。 【シート名】 シート1:名簿データ入力 シート2:名簿一覧 【質問内容】 シート1に入力した内容を、シート2に転記したいと思っています。 シート1には下記の項目を入力します。 C2 氏名 E2 フリガナ G2 敬称 I2 性別 C3 分類1 E3 分類2 C5 会社名 E5 部署名1 G5 部署名2 I5 役職名 C6 〒 E6 住所1 G6 住所2 C7 電話番号 E7 ファックス G7 携帯番号 I7 Eメール C9 摘要 ・上記の入力完了後にボタンを押すことで、シート2のB2~S2に転記(並びは、上記を上から順番)され、入力したものは未入力状態に戻るようにする。 ・2件目以降は次の行に転記されていく(1件目B2~S2、2件目B3~S3、3件目B4~S4・・・・) ※削除により、行がとびとびに入力されている場合は空いている行に入るようにする 以上のことを可能にするコードをお教え願えませんでしょうか。 加えて、シート2に転記された一覧を、テーブルとして設定し、並べ替え等は行えるのでしょうか? よろしくお願いいたします。

  • Excel2007で名簿管理をしています。

    Excel2007で名簿管理をしています。 名簿管理には名簿マスタ・各住所ごとのシートがあります。 項目など形式はすべてのシート同じです。 名簿マスタ:全データ存在しており、入力もここに行います 各住所シート:1シートに1か所の住所を割り当てており、10か所(10シート分)あります。 現在、必要な時に「名簿マスタ」より 並び替え→抽出(住所で)→各シートに貼り付け を行っております。 ですが、10シート分となりますと結構手間がかかります。 これをマクロ等で簡素化することはできますでしょうか? なにかございましたら、よろしくお願いします。

  • (excel)シートごとに検索しなければならない?

    どなたかお願いします。 職場で、excelを使って名簿を作る作業をしています。 1つのexcelファイルの中には何枚ものシートがあり、シートごとに名簿が異なります。 たとえば、 1シート目が「お茶サークル名簿」、2シート目が「茶道サークル名簿」・・といった感じです。 人によっては、お茶サークルにも属し、茶道サークルにも属している場合があります。 そこで質問させていただきます。 ある人が属しているすべてのサークルを知りたいときは、シートごとに(すべてのシートで)、名前の列で、その人の名前を検索をかけなければならないのでしょうか? もっと効率的な手段がありましたら教えてください。 (使用しているexcelのverは、確認してくるのを忘れてしまいましたが、会社のなので、それほど昔のverではないと思います) よろしくお願いいたします。

  • excelで名簿作成#REF!表示されます??

    最近PCを始めたばかりのexcel初心者です。 100名程の名簿を作成しています。 こちらのサイトを参考にしながら四苦八苦して作成しましたが、1名退会したため支所名簿:退会者のセル行を削除したところ不具合が出たので躓いています;  先ず・・ 2枚のsheetを使用して支所名簿から宛名にリンク? *支所名簿のsheetの一覧表には“名簿”と名前をつけています。 sheet名【支所名簿】には A1  B1  C1  名前 〒  住所 sheet名【宛名ラベル】 A1 A2  A3 〒 住所 名前 支所名簿の名前のセルさえ指定すれば 〒・住所は表示されるように作成しました。 数式は・・ A1に『=IF(COUNTIF(名簿,A3),VLOOKUP(A3,名簿,1,FALSE),"") A2に『=IF(COUNTIF(名簿,C1),VLOOKUP(C1,名簿,2,FALSE),"") A3に『=支所名簿'!A1』 退会した人(セル:A1)を消すために、支所名簿A1の行を削除すると【宛名ラベル】のC1に#REF!となります。 支所名簿のsheetで退会者を削除すると宛名ラベルのSheet も順送り(エラーのラベルが出ない)に出来る方法はないのでしょうか? (市販の宛名ラベルでの作成は使用できないので、excelで作成です) また、別の方法でも有れば ご伝授頂きたく宜しくお願いいたします。

  • VBAで一定期間の名簿を検索、抽出できますか?

    お世話になっております。皆さんよろしくお願いします。 Aという名前のエクセルファイルのsheet1に次のような名簿が入力してるとします。   A     B    C     D 1 申請日  名前   住所  電話番号 2  4/1   甲   東京   00-0000 3  4/2   乙   大阪   11-1111 4  4/3   丙   京都   22-2222 ・  4/3   虎   北海道  33-3333    ・  ・    ・   ・     ・ こういう名簿が3000件くらいあります。申請日は一件しかない日もあれば、数百件ある日もあります。また、申請日は一概に4/1から順になっていないところもあります。 この名簿を他のBというエクセルファイルに指定した期間ごとに抽出したいと考えています。 例えば、Bファイルのsheet1に、   A     B    C     ~  G 1 4/3    4/4   4/5    ~  4/9 と一週間分を入力し、コマンドボタンを押したら、Bファイルのsheet2 に、   A     B    C     D 1 申請日  名前   住所  電話番号 2  4/3   大田   京都   22-2222   3  4/3   佐藤   北海道  33-3333    ・  ・    ・    ・    ・ ・  ・    ・    ・    ・ 11  4/9    山田   愛知  44-4444    できたら嬉しいのですが、できるのでしょうか?どなたかお知恵をお貸しください。 よろしくお願いします。

  • EXCEL関数について質問です

    EXCELで同窓会旅行用の名簿を作っているのですが、下記のような動きをするEXCEL関数って作ることができますか? 具体的な方法を教えていただけると嬉しいのですが。。。 ・シート Sheet1に名簿一覧がある(例:A列は名前一覧、B列は部屋番号の空欄) Sheet2に部屋番号一覧がある(例:A列は部屋番号一覧、B,C,D列は名前の空欄) ・動き Sheet2のB,C,D列の名前の空欄に名前を入れていくと、 Sheet1の名簿の名前に対応した部屋番号がB列に自動で挿入される 万が一、Sheet2のB,C列(名前欄)で名前が重複してあった際には Sheet1の名簿に対応したB列に「エラー」と表示される ※Sheet1の名簿の名前(A列)は既に記入済みです。 ※Sheet2に部屋番号(A列)は既に記入済みです。 以上、お手数ですがよろしくお願いいたします。

  • エクセル名簿作り

    エクセルで名簿を作りたくて質問させていただきます。 たとえば、123など名前に番号をつけて 番号をクリックすると別のシートにいき その番号の名前の詳細ページにいけるようにできますでしょうか。 ちなみに、また番号をクリックすると元のシートに戻れるようにできます でしょうか 素人ですいませんが、教えていただけないでしょうか。 よろしくお願いします。

  • 社員名簿から検索する関数

    社員番号から名前や電話番号を検索する関数は、どのようにしたら良いのでしょうか? 社員名簿のプログラムに入れます。ユーザーにインプットしてもらうのは、名前、社員番号、電話番号です。最大100人分入る名簿でファイルに保存する必要はありません。

専門家に質問してみよう