- 締切済み
エクセルで前方一致のVlookupはできませんか
* すぐに回答を! エクセルで前方一致のVlookupのような関数はないでしょうか。 具体的には、A列とB列にデータがあり、A列のデータの文頭部分の文字列が B列のデータのどれかと一致した場合に、C列に一致したB列のデータを返したいです。 データの行数が非常に多い(3,4万行)であるため、できるだけ動作の軽い 関数であればなお助かります。 A B C zzzfewfe dadaf zzzf dadaf3233 a11111k dadaf aabbbb-fefe3 zzzf aabbbb a11111k33r3 aabbbb a11111k 宜しく御願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 私なら、並べ替えをして比較しているのではないかと思いました。 3~4万行ですから、マクロでも、総当たり制では無理があると思います。 そこで、配列に入れてみました。なるべくスピードに心がけて作ってみました。 '標準モジュール Sub Test1() Dim i As Long, j As Integer Dim rng As Range Dim rng2 As Range Dim ar As Variant Dim ar2() As String Set rng = Range("A1", Range("A65536").End(xlUp)) Set rng2 = rng.Offset(, 1) ar = Application.Transpose(rng.Value) ReDim ar2(UBound(ar)) For i = LBound(ar) To UBound(ar) For j = Len(ar(i)) To 1 Step -1 If Application.CountIf(rng2, Left(ar(i), j)) Then ar2(i - 1) = Left(ar(i), j) Exit For End If Next j Next '書き出し場所 Range("C1").Resize(UBound(ar2())).Value = Application.Transpose(ar2()) Set rng2 = Nothing Set rng = Nothing End Sub
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
数式は少し重そうですが、文字数が例示程度なら D1セルに =MATCH(LEFT($A1,COLUMN(A1)),$B:$B,0) 右へ下へオートフィル(B列の文字数の最大まで 例示の場合 7文字なのでJ列まで) 文字数はLEN関数で調べます C1セルに =IF(ISNA(LOOKUP(2^8,D1:J1)),"",INDEX(B:B,LOOKUP(2^8,D1:J1))) 下へオートフィル
- hige_082
- ベストアンサー率50% (379/747)
関数よりマクロの方が簡単で速いと思う 一例です Sub Macro1() Dim i For i = 1 To Range("b65536").End(xlUp).Row Range("a1", Range("a65536").End(xlUp)). _ Find(What:=Cells(i, 2).Value, LookIn:=xlValues, LookAt:=xlPart) _ .Offset(0, 2).Value = Cells(i, 2).Value Next i End Sub
- ASIMOV
- ベストアンサー率41% (982/2351)
B列の文字数は不定なんですよね 関数では無理そうです VBAならこんな↓感じです --------- Sub TS() al = 1 Do bl = 1 Do mjl = Len(Cells(bl, 2)) If Left(Cells(al, 1), mjl) = Cells(bl, 2) Then Cells(al, 3) = Cells(bl, 2) Exit Do End If bl = bl + 1 Loop Until Cells(bl, 2) = "" al = al + 1 Loop Until Cells(al, 1) = "" End Sub ----------
お礼
おっしゃるとおり文字数は不定です。 やはりVBAを使わないと駄目そうなんですね。 有難うございます。