• ベストアンサー

エクセルVBAで、ある文字を含んでいたら別シートに抽出したい

エクセル2002を使っています。 シート1に  A列に氏名  B列に住所  C列に電話番号 のデータが300件の表があります。 B列を検索してたとえば大阪府があれば、その行(ABC列)をシート2へコピーして抽出したいのです。  VBAを使ってやりたいのですがどうしたらよいでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • TTak
  • ベストアンサー率52% (206/389)
回答No.4

find,findnextメソッドを使った例です。excel2000で動作確認しました。シート名、検索文字列は適宜変更してください。 データが300件程度なら、この方法でも良いですが、今後増える場合は、次第に時間がかかるようになるのでお勧めできません。 Sub Sample() Dim c Dim myr As Integer Dim myr0 As Integer With Worksheets(1).Range("B1:B300")  Set c = .Find("大阪府", LookIn:=xlValues)  If Not c Is Nothing Then   firstAddress = c.Address   Do    Set c = .FindNext(c)    myr0 = Range(c.Address).Row    myr = Range(Sheets(2).Cells(Rows.Count, 1) _     .End(xlUp).Address).Row    Sheets(2).Range("A" & myr + 1 & ":C" & _     myr + 1).Value = _      Sheets(1).Range("A" & myr0 & ":C" & _     myr0).Value   Loop While Not c Is Nothing And c.Address <> firstAddress   End If End With Set c = Nothing End Sub

yaba77
質問者

お礼

望んでいた通りのことができました。 ありがとうございます。

その他の回答 (6)

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.7

住所に絶対都道府県が入ってるなら、 LEFT(B1,3) の頭3文字で比較すればいいですね。 ただし「和歌山県」は「和歌山」で抽出ですね。 大阪市とかどういう扱いなのか心配です。

yaba77
質問者

お礼

ありがとうございます

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.6

条件を設定して使用できるように作ってみました。 どのシートをアクティブにして実行してもOKです。 何回実行しても、現データで上書きします。 見出し行があれば、データの上の行だけコピーします。 Sub データ抽出() '----- 設定事項 ------------ Const OrgSh = "Sheet1" ' <--- 基データのシート名 Const PicSh = "Sheet2" ' <--- 抽出先シート名 Const TopAdd = "B2" '  <--- 検索範囲の先頭(見出しを除く) Const FindStr = "大阪府" ' < ---検索する文字列 '--------------------------- Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim Rng As Range Dim First As String Dim N As Long Set Ws1 = Worksheets(OrgSh) Set Ws2 = Worksheets(PicSh) Ws2.Cells.ClearContents '抽出先シートをクリア If Range(TopAdd).Row > 1 Then ' 見出し行があればコピー   Ws1.Range(TopAdd).Offset(-1).EntireRow.Copy Destination:=Ws2.Rows(1)   N = 1 End If Set Rng = Ws1.Range(TopAdd).EntireColumn.Find(FindStr) '部分一致検索 If Not Rng Is Nothing Then   First = Rng.Address   Do     N = N + 1     Rng.EntireRow.Copy Destination:=Ws2.Rows(N)     Set Rng = Ws1.Range(TopAdd).EntireColumn.FindNext(Rng)   Loop Until Rng Is Nothing Or Rng.Address = First End If End Sub

yaba77
質問者

お礼

ありがとうございます

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.5

あ、よく考えたら住所でソートしてコピペじゃダメすか?どうしてもVBA? findではB列(住所)に区市町村、番地まで入ってるとどうなるですか?ワイルドカードが使えるのかな(謎) 何が目的かによりますね。

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.3

>> 「都道府県」だけを抽出したりと前処理が要るかもです。 →300件程度とのことですので、私なら、 1.並びに意味があるならA列の前にもう1列挿入して連番を振っておく。 2.住所で並べ替え(ソート)して右端に1列追加して、オートフィルで都道府県名を入力 3.連番で再ソート という風にやります。 4.もっと件数多ければ→アクセスでやります。

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.2

おっと、訂正。 range(cells(1,1),cells(300,4)).advancedfilter xlfiltercopy,Range(Worksheets("シート3").Cells(1,1).value), Worksheets("シート2").Cells(1, 1), False

  • 78tch
  • ベストアンサー率31% (50/157)
回答No.1

B列が住所ということは、番地まで入ってるってことですよね。そのままではツラいかもです。「都道府県」だけを抽出したりと前処理が要るかもです。 D列に都道府県名のみを入れて、シート3のA1に「大阪府」と入れて range(cells(1,1),cells(300,4)).advancedfilter xlfiltercopy,range Range(Cells(1, 1), Cells(MyR, 20)).AdvancedFilter xlFilterCopy, Range(Worksheets("シート3").Cells(1,1).value), Worksheets("シート2").Cells(1, 1), False ぐらいでしょうか。(検証してません。ご参考まで。)

関連するQ&A

専門家に質問してみよう