2013-08-06 4 views
0

그래서 내가 뭘 하려는지 열 1의 셀에 값이있는 경우 다른 시트의 해당 값을 찾아 해당 전체 행 걸릴 및 붙여 넣기 두 열을 통해 루프 것입니다. 다른 시트를 누른 다음 열 1 값에 인접한 열 2의 셀 값을 가져 와서 같은 시트에 행을 붙여 넣습니다.중첩 된 각 문을

"일반 빌드"의 열 1이 12345 인 경우 12345에 대해 "S & OP 최종 시트"를 검색하고 전체 행을 가져 와서 "일반 빌드 프로젝트"에 붙여 넣습니다 해당 값을 "공통 빌드"(= 12346) 열에서 찾은 다음 해당 행을 "일반 빌드 프로젝트"에 붙여 넣은 다음 두 번째 열까지 아래로 이동하십시오. 목표는 사용자가 프로젝트 목록을 입력하고이를 기반으로 읽을 수 있도록하는 것입니다. 매번 같은 방식으로 형식이 지정되므로 문제가되지 않습니다. 각 줄 사이에 공백을 남겨 두어 다음 줄로 갈 수있게되었습니다.

코드가 제대로 실행되고 값을 가져올 수 없습니다. 시계를 추가했는데 아무 일도 없었습니다. 매칭리스트는 수천 라인에 걸쳐서 매치 할 때까지 다 통과 할 수 없습니다.

Sub CommonBuilds() 
Sheets("Common Build").Select 
Dim lastrow As Long 
Dim y As String 
lastrow = Cells(Rows.Count, 1).End(xlUp).row 
For Each c In Range("A2:A" & lastrow) 
    y = Cells(c.row, 1).value 
    If y <> "" Then 
     Sheets("S&OP Final").Select 
     lastrow2 = Cells(Rows.Count, 1).End(xlUp).row 
     For Each c2 In Range("E2:E" & lastrow2) 
      If Cells(c2.row, 5).value = y Then 
       Cells(c2.row, 5).EntireRow.Copy 
       Sheets("Common Build Projects").Select 
       With Sheets("Common Build Projects") 
        .Rows(.Cells(Sheets("Common Build Projects").Rows.Count, 1).End(xlUp).row + 1).PasteSpecial xlPasteValues 
       End With 
      End If 
     Next 
     Sheets("Common Build").Select 
     For Each c3 In Range("B2:B" & lastrow) 
      z = Cells(c3.row, 2).value 
      If z <> "" Then 
      Sheets("S&OP Final").Select 
       For Each c2 In Range("E2:E" & lastrow2) 
        If Cells(c2.row, 5).value = z Then 
         Cells(c2.row, 5).EntireRow.Copy 
         Sheets("Common Build Projects").Select 
         With Sheets("Common Build Projects") 
          .Rows(.Cells(Sheets("Common Build Projects").Rows.Count, 1).End(xlUp).row + 1).PasteSpecial xlPasteValues 
         End With 
        End If 
       Next 
      ElseIf z = "" Then 
       Exit For 
      End If 
     Next 
    End If 
Next c 
End Sub 
:

목록은

다음
CB project Individual Project 
12335  12336 
blank  12337 
blank  12338 
blank  12339 

12345  12346 
blank  12347 
blank  12348 
blank  12349 

내 현재 코드입니다 (이 적절한 형식 미안하지 않은 경우 코드가 내게 그것을 보여주지 할 수있는 유일한 방법이었다)과 같은 포맷

+0

에 For 루프를 변경 나는이 거의 INDEX'와는'MATCH' 및 VBA가 필요하지 않을 수'의 여러 조합이 가능 소리 말을 감히 것입니다 ... – chancea

+0

다른 사람들이 사용할 매크로를 만들려고합니다. 그렇지 않으면 그럴 것입니다. – BrianCD24

+1

여기에 어떤 문제가 발생했는지 명확하게 설명 할 수 있습니까? 당신은 당신이 성취하고자하는 것을 게시했는데, 당신이 시도한 것을 올렸지 만, 당신의 현재 시도가 정확히 무엇인지 모르겠습니다. – chancea

답변

1

먼저 두 열을 배열로 읽어 들일 것을 제안합니다.

dim myarray() as variant 

myarray = range("A2:E" & lastrow).value2 

그런 다음 열 E 값을 통해 루프는, 공백을 찾고 :

n = 2 
cb_project = myarray(n,1) 

do while n <= lastrow 
    'copy row matching cb_project 

    if myarray(n,5) = "" then 
     cb_project = myarray(n+1,1) 
    else 
     'copy row matching myarray(n,5) 
    endif 

    n=n+1 
loop 
0

첫째, Range("A2:A" And lastrow) 같은 일들이 작동하지 않을 수 있습니다. 문자열 연결 연산자 '&'을 사용해야합니다 (예 : Range("A2:A" & lastrow)). 당신은 이것을 여러 번 경험했습니다.
두 번째로 코드를 들여 씁니다. 적절하게 들여 쓰기 된 코드는 읽기 쉽고 유지하기 쉬운 sooo입니다.

+0

내가 들여 쓰기를 시도했는데 VBA에서 들여 쓰기를했는데 여기에 서식을 지정하면 표시되지 않습니다 죄송합니다 – BrianCD24

+0

이제 훨씬 더 좋습니다! –

0

이 라인

lastrow = Cells(Rows.Count, 1).End(xlUp).row 

열 1에서 마지막 행 을 발견 한 날 것으로 보인다. 불행히도, 논리를 올바르게 이해한다면 2 열의 마지막 행이 필요합니다. 2 열의 값 목록이 1 열의 목록보다 많기 때문에 (또는 적어도 이것이 내 해석에 필요합니다. 즉

 For Each c3 In Range("B2:B" & lastrow) 

-.? 당신이, 당신은 더 이상 경기를 찾아 그 문제 될 수있는 두 번째 프로젝트 (12346)의 첫 번째 행을 찾습니다하지 않습니다 준 샘플에 대한

해결책은 줄을 추가하는 것입니다.

 lastBrow = Cells(Rows.Count, 2).End(xlUp).row 

 For Each c3 In Range("B2:B" & lastBrow) 
+0

나는 그것을 발견했습니다. 좋은 지적이지만, 이제는 문제가 "S & OP final" "루프 된 값을 가진 시트. 적절한 lastrow로 실행하면 루프가 잘 돌아가지만 바깥 루프에 있기 때문에 y는 바뀌지 않습니다. 해결 방법이 없다. 그래도 고마워! – BrianCD24

관련 문제