2016-06-10 5 views
0

나는 시트에 열에서 문자열 목록을 다음과 같이, (우리가 "A"라고하자) : 다음가장 빠른 방법

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

A 
LAX 
MEX 
MIA 
JFK 

그래서 내가 두 번째 목록의 값이 첫 번째 목록의 각 문자열에서 처음 나타나는 알고 싶어하고, : 나는 다른 시트의 다른 목록을 다음과 같이, (우리가 "B"라고하자) 그 문자열 옆에 그 값을 써야합니다. 예, 나는 얻을 것 :

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 

문제는 그 목록을 갖고 있기 때문에 나는,이 코드는 매우 비효율적 인 것을 알고 있다는 것입니다 :

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

내가 완벽하게 작동합니다 다음 코드를 썼다 200K + 행. 이 작업을 수행하는보다 효율적인 방법이 있습니까? 배열에 값을 넣고 꽤 빨리해야이 일치 찾기 위해 Application.Match를 사용하여

+0

'완벽하게 작동하는 다음 코드를 작성했습니다. '코드 검토에서 질문하십시오. 거기의 놀랄만한 공동체. – findwindow

답변

2

:

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). 값

이 두 번 이상 읽혀지고 한 번 스캔 할 때마다 변수로 읽으면 다른 값도 사용합니다. 대안 전략으로

는 엑셀 검색에서 모양과 개별 값은 3 글자 다음과 같은 경우 기능을

+0

최고의 사용자 이름입니다. – findwindow

6

찾기 : 사용하여 배열 수식으로 입력

=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