2016-06-10 78 views
0

我有一個表中的列字符串列表(我們說的「A」),像這樣:最快的方式

 A 
BJS-LAX-GRU 
CAN-ORD-MIA-BOG 
NRT-LAX-JFK-LIM 

然後我有一個不同的紙張不同的列表(讓我們說「B」),像這樣:

A 
LAX 
MEX 
MIA 
JFK 

所以我想知道其中第二列表的價值首先出現在第一列表中的每個字符串,那麼我需要在字符串旁邊寫下該值。在這個例子中,我會得到:

 A    B 
BJS-LAX-GRU  LAX 
CAN-ORD-MIA-BOG MIA 
NRT-LAX-JFK-LIM LAX 

我寫了下面的代碼,它完美的作品:

Dim aux As Integer 
Dim cur As String 

For j = 1 To Sheets("A").Cells(Rows.Count, "A").End(xlUp).Row 
    aux = 100 
    cur = "" 
    For k = 1 To Sheets("B").Cells(Rows.Count, "A").End(xlUp).Row 
     If InStr(Sheets("A").Cells(j, 1).Value, Sheets("B").Cells(k, 1).Value) < aux And InStr(Sheets("A").Cells(j, 1).Value, Sheets("B").Cells(k, 1).Value) <> 0 Then 
      cur = Sheets("B").Cells(k, 1).Value 
      aux = InStr(Sheets("A").Cells(j, 1).Value, cur) 
     End If 
    Next k 
    Sheets("A").Cells(j, 2) = cur 
Next j 

的問題是,我知道,這個代碼是非常低效的,因爲這些名單有200K +行。有沒有更有效的方法來做到這一點?

+0

'寫下面的代碼,完美的作品:'在代碼審查問。那裏有驚人的社區。 – findwindow

回答

2

通過將數組中的值,並使用Application.Match找到匹配這應該是相當快:

Sub findmatch() 

Dim inarr() As Variant 
Dim oarr() As Variant 
Dim i As Long 
Dim str() As String 
Dim j As Integer 
Dim ws As Worksheet 
Dim tws As Worksheet 
Dim rng As Range 

Set tws = Sheets("Sheet2") 'This sheet is where the lookup list is located 
Set ws = Sheets("Sheet1") ' this is the list of names 
Set rng = tws.Range("A1", tws.Cells(tws.Rows.Count, 1).End(xlUp)) 
inarr = ws.Range("A1", ws.Cells(ws.Rows.Count, 1).End(xlUp)).Value 
ReDim oarr(1 To UBound(inarr, 1), 1 To 1) 

For i = 1 To UBound(inarr, 1) 
    str = Split(inarr(i, 1), "-") 
    For j = 0 To UBound(str) 
     Dim fnd 
     fnd = Application.Match(str(j), rng, 0) 
     If Not IsError(fnd) Then 
      oarr(i, 1) = rng(fnd) 
      Exit For 
     End If 
     oarr(i, 1) = "None" 
    Next j 
Next i 

ws.Range("B1").Resize(UBound(oarr, 1)).Value = oarr 

End Sub 
1

你可以不讀值多次優化你的代碼,如

表格(「B」)。單元格(k,1)。值

被多次讀取,每次掃描讀取一次變量,您也可以使用其他值。

作爲替代戰略看看Excel的搜索和查找功能

+0

有史以來最好的用戶名。 – findwindow

6

如果各個值都3個字母則是這樣的:使用

=MID(C3,SMALL(IFERROR(SEARCH($F$3:$F$6,C3),200),1),3) 

輸入作爲數組公式Ctrl+Shift+Enter

enter image description here

+0

這次你讓公式複製/粘貼友好= PPP – findwindow

+1

這是我能做到的最少(而且我總是盡我所能做到) –

+0

我只是在逗你! <33 – findwindow