プロが教えるわが家の防犯対策術!

* すぐに回答を!

エクセルで前方一致の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

宜しく御願い致します。

A 回答 (4件)

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
----------
    • good
    • 1
この回答へのお礼

おっしゃるとおり文字数は不定です。
やはりVBAを使わないと駄目そうなんですね。
有難うございます。

お礼日時:2009/05/26 23:05

関数よりマクロの方が簡単で速いと思う


一例です

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
    • good
    • 0

数式は少し重そうですが、文字数が例示程度なら



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)))
下へオートフィル
    • good
    • 0

こんばんは。



私なら、並べ替えをして比較しているのではないかと思いました。
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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!