2013-04-05 2 views
1

평상시처럼 문제를 해결하기 위해 마침내 도움을 청하기 전에 시간을 낭비했습니다. 그래서 도움을 주시면 대단히 감사하겠습니다!Excel VBA 모두 찾기

내 데이터의 Test1 시트에 while 루프를 실행하여 매개 변수가 일치하는 Test2 시트의 특정 행에 데이터를 복사합니다. 그러나 현재이 방법은 모든 행을 반복합니다. 시트 2 - 두 시트의 데이터는 모두 50,000 라인 이상이므로 내 방법은 10 개 테스트에 완벽하게 작동하지만 전체 데이터를 처리하는 데 몇 시간이 걸립니다. 나는 누군가가 내 코드를 단순화 할 수 있는지 궁금해했다. 이상적으로 각 코드를 비교하는 것이 아니라 일치하는 행을 검색 할 수 있도록하기 위해서였다.

나는 Find을 사용해 보았지만 여러 매개 변수로 작동하지 못했습니다.

이 내 현재 코드, 나는 공간을 절약하기 위해 파라미터 설정을 설정하는 부분을 생략했습니다있다하지만 그들은 내 워크 시트에 존재 :

While row1 <= lastRow1 
    Param1 = Sheets("Test1").Cells.Range("A" & row1).Value 
    Param2 = Sheets("Test1").Cells.Range("B" & row1).Value 
    Param3 = Sheets("Test1").Cells.Range("D" & row1).Value 
    Param4 = Sheets("Test1").Cells.Range("E" & row1).Value 
    Param5 = Sheets("Test1").Cells.Range("F" & row1).Value 
    Cell_to_copy = Sheets("Test1").Cells.Range("G" & row1).Value 
*****THIS IS THE BIT I WANT TO OPTIMISE************ 
     For row2 = 2 To lastRow2 
      KParam1 = Sheets("Test2").Cells.Range("A" & row2).Value 
      KParam2 = Sheets("Test2").Cells.Range("B" & row2).Value 
      KParam3 = Sheets("Test2").Cells.Range("I" & row2).Value 
      KParam5 = Sheets("Test2").Cells.Range("G" & row2).Value 
       If (InStr(1, KParam1, Param1) > 0) _ 
       And ((InStr(1, KParam2, Param2) > 0) Or (InStr(1, Param2, KParam2) > 0)) _ 
       And ((InStr(1, KParam3, Param3) > 0) Or (InStr(1, KParam3, Param4) > 0)) _ 
       And (InStr(1, KParam5, Param5) > 0) _ 
       Then 
        Sheets("Test2").Cells.Range("L" & row2).Value = Cell_to_copy 
       End If 
     Next row2 
**************************************************** 
     row1 = row1 + 1 
Wend 

내가하는 중간 부분을 변경하려면 대신 If 쿼리와 일치하는 행을 찾기 위해 검색 기능을 수행 한 다음 Cell_to_copy을 해당 행의 셀 L에 복사하십시오.

이것이 가능합니까? 내가 절대적으로 필요한 경우 Test2에서 검색 가능한 값을 하나의 셀로 연결할 수는 있지만 오탐 (false positive)과 일치하므로 피할 수 있다면 오히려 원하지 않습니다. 사전에

감사합니다,

+4

http://stackoverflow.com/questions을 필요로하는 경우에 저희에게 알려/8756802/excel-function-to-make-sql-like-queries-on-worksheet-data)을 참조하십시오. 주제를 벗어난 – wakjah

+0

, 미안하지만, 누군가 구식'while ... wend' 루프를 사용하고있는 것은 이번이 처음입니다. –

+1

** Test1 **에서는 50k, ** Test2 **에서는 50k로 각 시트의 행 수 때문에이 25 억 회를 통과해야합니다! 와우! 내가 맞습니까? – glh

답변

2

확인, 규칙이 될 것으로 보인다, 그래서 경우

Test1.column A is found inside Test2.column A 
Test1.column B is found inside Test2.column B 
Test1.column D is found inside Test2.column I 
Test1.column E is found inside Test2.column I 
Test1.column F is found inside Test2.column G 

다음 사본Test1.column G-Test2.Column L

맞습니까?

왜 Sheet2의 수식을 사용하여 그렇게 할 수 없습니까?

어쩌면 : Test2.Column의 L 공식 = =IF(FIND(A:A,Sheet1!A:A)>0,Sheet1!G:G) 공식은 다른 열을 확인하기 위해 다른 조건과 OR 필요하다고

- 점심 식사 후 시도 할 것이다!

그렇다면 여기서는 ADO를 사용하고 워크 시트를 db 테이블로 간주해야한다고 생각합니다.

소스 데이터가 어떻게 보이는지 그리고 필요한 결과를 보여 주면 샘플을 시도하고 작성할 수 있지만 가장 좋은 방법은 링크를 사용하여 물고기를 익히는 것입니다.

이 여기를 참조하십시오 또한 MSDN KB: How To Use ADO with Excel Data from Visual Basic or VBA

읽고 다음 엑셀 사용자 MVP 웹 사이트에

Treat Excel As a Relational Data Source을하고도 읽어

은 기본적으로 작업이 Office Space: Using ADO to Query an Excel Spreadsheet는 필터링 된 데이터를 읽고 그 ADO 레코드에 필요한 다음 CopyFromRecordset 메서드를 사용하여 한 번에 Sheet2에 결과를 덤프합니다.

그래서 yo 유 할 몇 가지 독서가, 당신은 예 또는 더 많은 도움

필립

당신은 더 나은 운 [워크 시트에 SQL 쿼리를 실행]을 (해야 할 수도 있습니다
+0

그래, 그게 다야. 내가 아직 정제하고있는 경기에 대한 몇 가지 요구 사항이 있지만, 그게 문제 야. 이전에 {= INDEX (Cell_to_copy, MATCH (1, (A2 = Param1) * (B2 = Param2) * ISNUMBER (SEARCH (Param3, I2) + ISNUMBER (SEARCH (Param4, I2))> 0) * (Param5 = engines), 0))}하지만 주말 내내 크기의 절반 이하의 스프레드 시트를 완성해야했습니다! 링크를 가져 주셔서 감사합니다. – JoeP

+0

수식을 시도해 볼 수 있습니다 (또는 (FIND (A : A, Sheet1! A : A)> 0, FIND (B : B, Sheet1! B : B)> 0, ...), Sheet1! G : G) * –

+0

좋은 대답이라면 대답으로 표시 하시겠습니까? –