2014-10-09 4 views
0

테이블에 약 500,000 개의 항목 목록이 있습니다. 나는 년 및 서비스 코드에 따라 일치해야합니다. 많은 시트와 행을 검색해야하므로 동적으로 만들려고합니다. 기본적으로 저는 이것을 가지고 있습니다 :VBA 다중 기준 VBA에서 검색

'나는 이것을하지는 않을 것이지만 그것을 이해할 수는 없습니다. 이것은 각 변수에 대한 임시 범위를 만듭니다. 범위를 가진 셀에 아래 수식을 입력하면 작동하기 때문에이 작업을 수행합니다. 짜증나는 나에게 무엇

Sheets("Worker").Range("A1").Name = "yearlk" 
Sheets("Worker").Range("A2").Name = "svclk" 

For xlRow = 2 To xlLastRow 

    Range("yearlk").Value = Cells(xlRow, xlColYear) 'Sets the range to the current year 
    Range("svclk").Value = Cells(xlRow, xlServiceCode) 'sets the range to current ServiceCode 

    Exists = Evaluate("{=INDEX(vwSVC_RegTool[service_code_id],MATCH(1,(vwSVC_RegTool[term_year]=yearlk)*(vwSVC_RegTool[service_code_id]=svclk),0))}") 

next xlRow 

그것은, 세포의 모든 작품이지만,이 xlam에서 작업 할 필요가 그래서 사용자 정의 도구를 제작하고있다.

+0

지금 내가 잘못 생각하면 모두 OK입니다. ... 내 주요 목표는 ... Year = 2012 및 SVC = A52453 ...이 콤보는 테이블에 존재합니다. –

답변

0

나는 위의 질문에 대답하는 방법을 이해할 수 없었지만, 단순히 범위를 변형으로 설정 한 다음 다른 변수를 인덱스로 설정하고 2 개의 루프를 수행 했으므로 그 방법은 빠르다.

SVCtran = ThisWorkbook.Sheets("CPT Codes and HCPCS").Range("vwSVC_RegTool") 
ReDim SVCStor(UBound(SVCtran)) 
For I = 1 To UBound(SVCtran) 
    SVCStor(I) = SVCtran(I, 1) 
Next 

II = Int(Sqr(UBound(SVCStor))) 'this setups the index size 
ReDim SVCIndex(II, 2) 
For I = 1 To UBound(SVCIndex) - 1 
    SVCIndex(I, 1) = II * I 'set position of index 
    SVCIndex(I, 2) = SVCStor(II * I) 'set value of index Start 
Next I 
SVCIndex(UBound(SVCIndex), 1) = UBound(SVCStor) 

는 xlLastRow으로 actionFor xlRow = 1 인덱스 - xlRow가 을 xlLastRow하는 1 은 = 사실 비교 = ColValue2 (xlRow, 1) & COLVALUE (xlRow, 1)

For R = 1 To UBound(SVCIndex) 'find the start and finish of the index 
     If SVCIndex(R, 2) > compare And compare >= SVCIndex(R - 1, 2) Then 
      Start = SVCIndex(R - 1, 1) 
      Ender = SVCIndex(R, 1) 
     End If 
    Next 

    For R = Start To Ender 'set the loop to only look in the index locations 
     Exists = False 
     If compare = SVCStor(R) Then 
      Exists = True 
      Exit For 
     End If 
    Next 

    If Exists = False Then 
     InvalidFormat(I) = xlRow '2014Z0334 
     I = I + 1 
    End If 

Next 
을 존재

아이디어는 원래 대략 100,000 번 검색을 검색하기 위해 약 1.6MM 레코드를 가졌습니다. 나는 진짜 수학자가 내가 말하려고하는 것을 죽일 것임을 알지만, 그것은 대략 80 억의 검색이다. 이걸로 1.6M이 1264 크기의 인덱스 1265로 설정되어 126MM의 평균 검색을 제공합니다. 광기 ****이 순서는 반드시 주문 목록이어야합니다.