- ベストアンサー
エクセルVBAでデータ抽出方法を検索する
- エクセルVBAを使用して、顧客の住所データベースから変更された住所を抽出する方法について助けが必要です。
- エクセルファイルのシート構成と処理方法を説明し、sheet1の旧住所一覧をsheet2の顧客データベースの住所と照合し、該当する行をsheet3にコピーする方法がわかりません。
- cells関数、ForNextループ、search関数の組み合わせを試しましたが、search関数のセル位置取得がうまくいかず、解決策に行き詰まっています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 以下は、私自身としては、二案を考えましたが、どちらも、あまり良い出来とは言えません。Search関数を使ったコードを別案として掲示しましたので、とりあえず参考にしてください。 検索は、Findメソッドのほうは、検索を、xlPart(部分)、Search関数側は、ワイルドカードをつけました。 Dim sh1 As Worksheet Dim sh2 As Worksheet Dim sh3 As Worksheet Dim FindRng As Range Sub TestSample() Dim SearchRng As Range Dim r As Range Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") Set sh3 = Worksheets("Sheet3") Set FindRng = sh2.Range("D1", sh2.Range("D65536").End(xlUp)) Set SearchRng = sh1.Range("A1", sh1.Range("A65536").End(xlUp)) For Each r In SearchRng If Not IsEmpty(r) Then s_Find_Copy r.Value s_SearchFunctionMethond (r.Value) ''別案のサブルーチン End If Next r Set FindRng = Nothing Set SearchRng = Nothing Set sh1 = Nothing Set sh2 = Nothing Set sh3 = Nothing End Sub Sub s_Find_Copy(SearchWord As String) 'サブルーチン Dim myFirstAddress As String Dim c As Range Set c = FindRng.Find( _ What:=SearchWord, _ LookIn:=xlValues, _ LookAt:=xlPart, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlNext) If Not c Is Nothing Then myFirstAddress = c.Address Do 'Sheet3の二行目から c.Offset(, -3).Resize(, 4).Copy sh3.Range("A65536").End(xlUp).Offset(1) Set c = FindRng.FindNext(c) Loop Until c Is Nothing Or c.Address = myFirstAddress End If End Sub '---------------------------------- ''Search関数を使った別案のサブルーチン '----------------------------------- Sub s_SearchFunctionMethond(SearchWord As String) Dim ar() As Variant Dim myData() As Long Dim i As Long Dim j As Long ar = Evaluate("INDEX(SEARCH(""" & SearchWord &"*" & """,Sheet2!D1:D7000),0,1)") Do Until i = UBound(ar) i = i + 1 If Not IsError(ar(i, 1)) Then ReDim Preserve myData(j) myData(j) = i j = j + 1 End If Loop For j = LBound(myData) To UBound(myData) 'Sheet3の二行目から sh2.Cells(myData(j), 1).Resize(, 4).Copy sh3.Range("A65536").End(xlUp).Offset(1) Next j Erase myData End Sub
お礼
いつもお世話になっております。 オフセット使ってコピーっていう方法もあるんですかー。 これを元にがんばってみます。 ありがとうございました。